Documentation Source Text

Hex Artifact Content
Login

Artifact 69273daa85ba04d17267d5174a68f5880f1d9d1b:


0000: 3c 74 69 74 6c 65 3e 53 51 4c 69 74 65 20 52 65  <title>SQLite Re
0010: 71 75 69 72 65 6d 65 6e 74 73 3c 2f 74 69 74 6c  quirements</titl
0020: 65 3e 0a 0a 3c 68 32 3e 53 51 4c 69 74 65 20 52  e>..<h2>SQLite R
0030: 65 71 75 69 72 65 6d 65 6e 74 73 3c 2f 68 32 3e  equirements</h2>
0040: 0a 0a 3c 70 3e 54 68 69 73 20 64 6f 63 75 6d 65  ..<p>This docume
0050: 6e 74 20 69 73 20 61 20 77 6f 72 6b 20 69 6e 20  nt is a work in 
0060: 70 72 6f 67 72 65 73 73 2e 3c 2f 70 3e 0a 0a 3c  progress.</p>..<
0070: 70 3e 54 68 65 20 67 6f 61 6c 20 6f 66 20 74 68  p>The goal of th
0080: 69 73 20 64 6f 63 75 6d 65 6e 74 20 69 73 20 74  is document is t
0090: 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 70 72 65  o provide an pre
00a0: 63 69 73 65 20 61 6e 64 20 65 78 61 63 74 0a 64  cise and exact.d
00b0: 65 66 69 6e 69 74 69 6f 6e 20 6f 66 20 77 68 61  efinition of wha
00c0: 74 20 53 51 4c 69 74 65 20 64 6f 65 73 2c 20 68  t SQLite does, h
00d0: 6f 77 20 69 74 20 77 6f 72 6b 73 2c 20 61 6e 64  ow it works, and
00e0: 20 77 68 61 74 20 74 6f 20 65 78 70 65 63 74 0a   what to expect.
00f0: 66 72 6f 6d 20 53 51 4c 69 74 65 20 66 6f 72 20  from SQLite for 
0100: 61 6e 79 20 67 69 76 65 6e 20 69 6e 70 75 74 2e  any given input.
0110: 20 20 57 68 65 6e 20 63 6f 6d 70 6c 65 74 65 64    When completed
0120: 2c 20 74 68 69 73 20 64 6f 63 75 6d 65 6e 74 0a  , this document.
0130: 77 69 6c 6c 20 62 65 63 6f 6d 65 20 74 68 65 20  will become the 
0140: 61 75 74 68 6f 72 69 74 61 74 69 76 65 20 72 65  authoritative re
0150: 66 65 72 65 6e 63 65 20 66 6f 72 20 75 73 69 6e  ference for usin
0160: 67 20 53 51 4c 69 74 65 2e 3c 2f 70 3e 0a 0a 3c  g SQLite.</p>..<
0170: 68 33 3e 54 68 65 20 43 2f 43 2b 2b 20 49 6e 74  h3>The C/C++ Int
0180: 65 72 66 61 63 65 3c 2f 68 33 3e 0a 0a 3c 74 61  erface</h3>..<ta
0190: 62 6c 65 20 63 65 6c 6c 73 70 61 63 69 6e 67 3d  ble cellspacing=
01a0: 22 32 30 22 20 62 6f 72 64 65 72 3d 22 30 22 3e  "20" border="0">
01b0: 0a 0a 3c 74 63 6c 3e 0a 23 20 45 78 74 72 61 63  ..<tcl>.# Extrac
01c0: 74 20 72 65 71 75 69 72 65 6d 65 6e 74 73 20 66  t requirements f
01d0: 72 6f 6d 20 74 68 65 20 73 71 6c 69 74 65 33 2e  rom the sqlite3.
01e0: 68 20 68 65 61 64 65 72 20 66 69 6c 65 0a 23 0a  h header file.#.
01f0: 73 65 74 20 69 6e 20 5b 6f 70 65 6e 20 73 71 6c  set in [open sql
0200: 69 74 65 33 2e 68 5d 0a 73 65 74 20 74 69 74 6c  ite3.h].set titl
0210: 65 20 7b 7d 20 20 20 20 20 20 20 3b 23 20 54 69  e {}       ;# Ti
0220: 74 6c 65 20 6f 66 20 61 6e 20 69 6e 74 65 72 66  tle of an interf
0230: 61 63 65 0a 73 65 74 20 62 6f 64 79 20 7b 7d 20  ace.set body {} 
0240: 20 20 20 20 20 20 20 3b 23 20 68 75 6d 61 6e 2d         ;# human-
0250: 72 65 61 64 61 62 6c 65 20 64 65 73 63 72 69 70  readable descrip
0260: 74 69 6f 6e 0a 73 65 74 20 63 6f 64 65 20 7b 7d  tion.set code {}
0270: 20 20 20 20 20 20 20 20 3b 23 20 43 20 63 6f 64          ;# C cod
0280: 65 20 6f 66 20 74 68 65 20 64 65 66 69 6e 69 74  e of the definit
0290: 69 6f 6e 0a 73 65 74 20 70 68 61 73 65 20 30 20  ion.set phase 0 
02a0: 20 20 20 20 20 20 20 3b 23 20 50 68 61 73 65 20         ;# Phase 
02b0: 75 73 65 64 20 62 79 20 74 68 65 20 70 61 72 73  used by the pars
02c0: 65 72 20 0a 73 65 74 20 72 65 71 6c 69 73 74 20  er .set reqlist 
02d0: 7b 7d 20 20 20 20 20 3b 23 20 4c 69 73 74 20 6f  {}     ;# List o
02e0: 66 20 72 65 71 75 69 72 65 6d 65 6e 74 73 2c 20  f requirements, 
02f0: 6f 6e 20 72 65 63 6f 72 64 20 70 65 72 20 72 65  on record per re
0300: 71 75 69 72 65 6d 65 6e 74 20 65 6e 74 72 79 0a  quirement entry.
0310: 73 65 74 20 64 63 6e 74 20 30 20 20 20 20 20 20  set dcnt 0      
0320: 20 20 20 3b 23 20 4e 75 6d 62 65 72 20 6f 66 20     ;# Number of 
0330: 69 6e 64 69 76 69 64 75 61 6c 20 64 65 63 6c 61  individual decla
0340: 72 61 74 69 6f 6e 73 0a 73 65 74 20 6c 69 6e 65  rations.set line
0350: 6e 6f 20 30 20 20 20 20 20 20 20 3b 23 20 69 6e  no 0       ;# in
0360: 70 75 74 20 66 69 6c 65 20 6c 69 6e 65 20 6e 75  put file line nu
0370: 6d 62 65 72 0a 0a 23 20 53 70 6c 69 74 20 74 68  mber..# Split th
0380: 65 20 69 6e 70 75 74 20 73 74 72 69 6e 67 20 24  e input string $
0390: 69 6e 20 61 74 20 74 68 65 20 66 69 72 73 74 20  in at the first 
03a0: 7b 2e 2e 2e 7d 20 6d 61 72 6b 65 72 2e 20 20 53  {...} marker.  S
03b0: 74 6f 72 65 20 74 68 65 20 74 65 78 74 0a 23 20  tore the text.# 
03c0: 62 65 66 6f 72 65 20 74 68 65 20 6d 61 72 6b 65  before the marke
03d0: 72 20 69 6e 20 74 68 65 20 70 72 65 66 69 78 76  r in the prefixv
03e0: 61 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 63  ar.  Store the c
03f0: 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6d 61  ontent of the ma
0400: 72 6b 65 72 0a 23 20 69 6e 20 74 61 67 76 61 72  rker.# in tagvar
0410: 2e 20 20 41 6e 64 20 73 74 6f 72 65 20 74 68 65  .  And store the
0420: 20 74 65 78 74 20 61 66 74 65 72 20 74 68 65 20   text after the 
0430: 6d 61 72 6b 65 72 20 69 6e 20 74 61 69 6c 76 61  marker in tailva
0440: 72 2e 0a 23 0a 70 72 6f 63 20 73 70 6c 69 74 5f  r..#.proc split_
0450: 74 65 78 74 20 7b 69 6e 20 70 72 65 66 69 78 76  text {in prefixv
0460: 61 72 20 74 61 67 76 61 72 20 74 61 69 6c 76 61  ar tagvar tailva
0470: 72 7d 20 7b 0a 20 20 69 66 20 7b 5b 72 65 67 65  r} {.  if {[rege
0480: 78 70 20 2d 69 6e 64 69 63 65 73 20 7b 5c 7b 5b  xp -indices {\{[
0490: 5c 77 2e 5d 2b 5c 7d 7d 20 24 69 6e 20 69 5d 7d  \w.]+\}} $in i]}
04a0: 20 7b 0a 20 20 20 20 75 70 76 61 72 20 31 20 24   {.    upvar 1 $
04b0: 70 72 65 66 69 78 76 61 72 20 70 72 65 66 69 78  prefixvar prefix
04c0: 0a 20 20 20 20 75 70 76 61 72 20 31 20 24 74 61  .    upvar 1 $ta
04d0: 67 76 61 72 20 74 61 67 0a 20 20 20 20 75 70 76  gvar tag.    upv
04e0: 61 72 20 31 20 24 74 61 69 6c 76 61 72 20 74 61  ar 1 $tailvar ta
04f0: 69 6c 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b  il.    foreach {
0500: 66 72 6f 6e 74 20 62 61 63 6b 7d 20 24 69 20 62  front back} $i b
0510: 72 65 61 6b 0a 20 20 20 20 73 65 74 20 78 30 20  reak.    set x0 
0520: 5b 65 78 70 72 20 7b 24 66 72 6f 6e 74 2d 31 7d  [expr {$front-1}
0530: 5d 0a 20 20 20 20 73 65 74 20 70 72 65 66 69 78  ].    set prefix
0540: 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24   [string range $
0550: 69 6e 20 30 20 24 78 30 5d 0a 20 20 20 20 73 65  in 0 $x0].    se
0560: 74 20 78 31 20 5b 65 78 70 72 20 7b 24 66 72 6f  t x1 [expr {$fro
0570: 6e 74 2b 31 7d 5d 0a 20 20 20 20 73 65 74 20 78  nt+1}].    set x
0580: 32 20 5b 65 78 70 72 20 7b 24 62 61 63 6b 2d 31  2 [expr {$back-1
0590: 7d 5d 0a 20 20 20 20 73 65 74 20 74 61 67 20 5b  }].    set tag [
05a0: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 69 6e  string range $in
05b0: 20 24 78 31 20 24 78 32 5d 0a 20 20 20 20 73 65   $x1 $x2].    se
05c0: 74 20 78 33 20 5b 65 78 70 72 20 7b 24 62 61 63  t x3 [expr {$bac
05d0: 6b 2b 31 7d 5d 0a 20 20 20 20 73 65 74 20 74 61  k+1}].    set ta
05e0: 69 6c 20 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  il [string range
05f0: 20 24 69 6e 20 24 78 33 20 65 6e 64 5d 0a 20 20   $in $x3 end].  
0600: 20 20 72 65 74 75 72 6e 20 31 0a 20 20 7d 20 65    return 1.  } e
0610: 6c 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e  lse {.    return
0620: 20 30 0a 20 20 7d 0a 7d 0a 0a 23 20 52 65 61 64   0.  }.}..# Read
0630: 20 73 71 6c 69 74 65 33 2e 68 20 6c 69 6e 65 20   sqlite3.h line 
0640: 62 79 20 6c 69 6e 65 20 61 6e 64 20 65 78 74 72  by line and extr
0650: 61 63 74 20 69 6e 74 65 72 66 61 63 65 20 64 65  act interface de
0660: 66 69 6e 69 74 69 6f 6e 0a 23 20 69 6e 66 6f 72  finition.# infor
0670: 6d 61 74 69 6f 6e 2e 0a 23 0a 77 68 69 6c 65 20  mation..#.while 
0680: 7b 21 5b 65 6f 66 20 24 69 6e 5d 7d 20 7b 0a 20  {![eof $in]} {. 
0690: 20 73 65 74 20 6c 69 6e 65 20 5b 67 65 74 73 20   set line [gets 
06a0: 24 69 6e 5d 0a 20 20 69 6e 63 72 20 6c 69 6e 65  $in].  incr line
06b0: 6e 6f 0a 20 20 69 66 20 7b 24 70 68 61 73 65 3d  no.  if {$phase=
06c0: 3d 30 7d 20 7b 0a 20 20 20 20 23 20 4c 6f 6f 6b  =0} {.    # Look
06d0: 69 6e 67 20 66 6f 72 20 74 68 65 20 43 41 50 49  ing for the CAPI
06e0: 33 52 45 46 3a 20 6b 65 79 77 6f 72 64 0a 20 20  3REF: keyword.  
06f0: 20 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e    if {[regexp {^
0700: 5c 2a 5c 2a 20 43 41 50 49 33 52 45 46 3a 20 2b  \*\* CAPI3REF: +
0710: 28 2e 2a 29 7d 20 24 6c 69 6e 65 20 61 6c 6c 20  (.*)} $line all 
0720: 74 78 5d 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  tx]} {.      set
0730: 20 74 69 74 6c 65 20 24 74 78 0a 20 20 20 20 20   title $tx.     
0740: 20 73 65 74 20 74 69 74 6c 65 5f 6c 69 6e 65 6e   set title_linen
0750: 6f 20 24 6c 69 6e 65 6e 6f 0a 20 20 20 20 20 20  o $lineno.      
0760: 73 65 74 20 70 68 61 73 65 20 31 0a 20 20 20 20  set phase 1.    
0770: 7d 0a 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 70  }.  } elseif {$p
0780: 68 61 73 65 3d 3d 31 7d 20 7b 0a 20 20 20 20 69  hase==1} {.    i
0790: 66 20 7b 5b 73 74 72 69 6e 67 20 72 61 6e 67 65  f {[string range
07a0: 20 24 6c 69 6e 65 20 30 20 31 5d 3d 3d 22 2a 2a   $line 0 1]=="**
07b0: 22 7d 20 7b 0a 20 20 20 20 20 20 73 65 74 20 6c  "} {.      set l
07c0: 78 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b  x [string trim [
07d0: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 6c 69  string range $li
07e0: 6e 65 20 33 20 65 6e 64 5d 5d 0a 20 20 20 20 20  ne 3 end]].     
07f0: 20 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 43   if {[regexp {^C
0800: 41 54 45 47 4f 52 59 3a 20 2b 28 5b 61 2d 7a 5d  ATEGORY: +([a-z]
0810: 2a 29 7d 20 24 6c 78 20 61 6c 6c 20 63 78 5d 7d  *)} $lx all cx]}
0820: 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 74   {.        set t
0830: 79 70 65 20 24 63 78 0a 20 20 20 20 20 20 7d 20  ype $cx.      } 
0840: 65 6c 73 65 69 66 20 7b 5b 72 65 67 65 78 70 20  elseif {[regexp 
0850: 7b 5e 4b 45 59 57 4f 52 44 53 3a 20 2b 28 2e 2a  {^KEYWORDS: +(.*
0860: 29 7d 20 24 6c 78 20 61 6c 6c 20 6b 78 5d 7d 20  )} $lx all kx]} 
0870: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 65 61 63  {.        foreac
0880: 68 20 6b 20 24 6b 78 20 7b 0a 20 20 20 20 20 20  h k $kx {.      
0890: 20 20 20 20 73 65 74 20 6b 65 79 77 6f 72 64 28      set keyword(
08a0: 24 6b 29 20 31 0a 20 20 20 20 20 20 20 20 7d 0a  $k) 1.        }.
08b0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
08c0: 20 20 20 20 20 20 20 61 70 70 65 6e 64 20 62 6f         append bo
08d0: 64 79 20 24 6c 78 5c 6e 0a 20 20 20 20 20 20 7d  dy $lx\n.      }
08e0: 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b  .    } elseif {[
08f0: 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 6c 69  string range $li
0900: 6e 65 20 30 20 31 5d 3d 3d 22 2a 2f 22 7d 20 7b  ne 0 1]=="*/"} {
0910: 0a 20 20 20 20 20 20 73 65 74 20 70 68 61 73 65  .      set phase
0920: 20 32 0a 20 20 20 20 7d 0a 20 20 7d 20 65 6c 73   2.    }.  } els
0930: 65 69 66 20 7b 24 70 68 61 73 65 3d 3d 32 7d 20  eif {$phase==2} 
0940: 7b 0a 20 20 20 20 69 66 20 7b 24 6c 69 6e 65 3d  {.    if {$line=
0950: 3d 22 22 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  =""} {.      set
0960: 20 6b 77 6c 69 73 74 20 5b 6c 73 6f 72 74 20 5b   kwlist [lsort [
0970: 61 72 72 61 79 20 6e 61 6d 65 73 20 6b 65 79 77  array names keyw
0980: 6f 72 64 5d 5d 0a 20 20 20 20 20 20 75 6e 73 65  ord]].      unse
0990: 74 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 6b 65  t -nocomplain ke
09a0: 79 77 6f 72 64 0a 20 20 20 20 20 20 73 65 74 20  yword.      set 
09b0: 6b 65 79 20 24 74 79 70 65 3a 24 6b 77 6c 69 73  key $type:$kwlis
09c0: 74 0a 20 20 20 20 20 20 69 66 20 7b 5b 72 65 67  t.      if {[reg
09d0: 65 78 70 20 7b 5c 7b 28 5b 5c 77 2e 5d 2b 29 5c  exp {\{([\w.]+)\
09e0: 7d 7d 20 24 74 69 74 6c 65 20 61 6c 6c 20 74 61  }} $title all ta
09f0: 67 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 72 65  g]} {.        re
0a00: 67 73 75 62 20 7b 20 2a 5c 7b 5b 5c 77 2e 5d 2b  gsub { *\{[\w.]+
0a10: 5c 7d 7d 20 24 74 69 74 6c 65 20 7b 7d 20 74 69  \}} $title {} ti
0a20: 74 6c 65 0a 20 20 20 20 20 20 20 20 69 66 20 7b  tle.        if {
0a30: 24 64 63 6e 74 3e 31 7d 20 7b 73 65 74 20 64 20  $dcnt>1} {set d 
0a40: 64 65 63 6c 61 72 61 74 69 6f 6e 73 7d 20 7b 73  declarations} {s
0a50: 65 74 20 64 20 7b 61 20 64 65 63 6c 61 72 61 74  et d {a declarat
0a60: 69 6f 6e 7d 7d 0a 20 20 20 20 20 20 20 20 73 65  ion}}.        se
0a70: 74 20 72 65 71 20 22 54 68 65 20 5c 22 73 71 6c  t req "The \"sql
0a80: 69 74 65 33 2e 68 5c 22 20 68 65 61 64 65 72 20  ite3.h\" header 
0a90: 66 69 6c 65 5c 0a 20 20 20 20 20 20 20 20 20 20  file\.          
0aa0: 20 20 73 68 61 6c 6c 20 63 6f 6e 74 61 69 6e 20    shall contain 
0ab0: 24 64 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  $d equivalent to
0ac0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 3a 5c   the following:\
0ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 5c 6e 3c  .            \n<
0ae0: 62 6c 6f 63 6b 71 75 6f 74 65 3e 3c 70 72 65 3e  blockquote><pre>
0af0: 5c 6e 24 63 6f 64 65 3c 2f 70 72 65 3e 3c 2f 62  \n$code</pre></b
0b00: 6c 6f 63 6b 71 75 6f 74 65 3e 22 0a 20 20 20 20  lockquote>".    
0b10: 20 20 20 20 72 65 67 65 78 70 20 7b 5c 64 2b 7d      regexp {\d+}
0b20: 20 24 74 61 67 20 6b 65 79 0a 20 20 20 20 20 20   $tag key.      
0b30: 20 20 6c 61 70 70 65 6e 64 20 72 65 71 6c 69 73    lappend reqlis
0b40: 74 20 5b 6c 69 73 74 20 24 6b 65 79 20 24 74 61  t [list $key $ta
0b50: 67 20 73 71 6c 69 74 65 33 2e 68 20 24 74 69 74  g sqlite3.h $tit
0b60: 6c 65 5f 6c 69 6e 65 6e 6f 20 24 72 65 71 20 7b  le_lineno $req {
0b70: 7d 5d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  }].      }.     
0b80: 20 73 65 74 20 78 20 24 62 6f 64 79 0a 20 20 20   set x $body.   
0b90: 20 20 20 77 68 69 6c 65 20 7b 5b 73 70 6c 69 74     while {[split
0ba0: 5f 74 65 78 74 20 24 78 20 70 72 65 66 69 78 20  _text $x prefix 
0bb0: 74 61 67 20 73 75 66 66 69 78 5d 7d 20 7b 0a 20  tag suffix]} {. 
0bc0: 20 20 20 20 20 20 20 69 66 20 7b 21 5b 73 70 6c         if {![spl
0bd0: 69 74 5f 74 65 78 74 20 24 73 75 66 66 69 78 20  it_text $suffix 
0be0: 72 65 71 20 65 6e 64 74 61 67 20 74 61 69 6c 5d  req endtag tail]
0bf0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 73 65  } {.          se
0c00: 74 20 72 65 71 20 24 73 75 66 66 69 78 0a 20 20  t req $suffix.  
0c10: 20 20 20 20 20 20 20 20 73 65 74 20 78 20 7b 7d          set x {}
0c20: 0a 20 20 20 20 20 20 20 20 20 20 73 65 74 20 65  .          set e
0c30: 78 20 7b 7d 0a 20 20 20 20 20 20 20 20 7d 20 65  x {}.        } e
0c40: 6c 73 65 69 66 20 7b 24 65 6e 64 74 61 67 3d 3d  lseif {$endtag==
0c50: 22 45 4e 44 22 7d 20 7b 0a 20 20 20 20 20 20 20  "END"} {.       
0c60: 20 20 20 73 65 74 20 65 78 20 7b 7d 0a 20 20 20     set ex {}.   
0c70: 20 20 20 20 20 20 20 73 65 74 20 78 20 24 74 61         set x $ta
0c80: 69 6c 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  il.        } els
0c90: 65 69 66 20 7b 24 65 6e 64 74 61 67 3d 3d 22 45  eif {$endtag=="E
0ca0: 58 22 7d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  X"} {.          
0cb0: 69 66 20 7b 21 5b 73 70 6c 69 74 5f 74 65 78 74  if {![split_text
0cc0: 20 24 74 61 69 6c 20 65 78 20 65 6e 64 32 20 74   $tail ex end2 t
0cd0: 61 69 6c 32 5d 7d 20 7b 0a 20 20 20 20 20 20 20  ail2]} {.       
0ce0: 20 20 20 20 20 73 65 74 20 65 78 20 24 74 61 69       set ex $tai
0cf0: 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65  l.            se
0d00: 74 20 78 20 7b 7d 0a 20 20 20 20 20 20 20 20 20  t x {}.         
0d10: 20 7d 20 65 6c 73 65 69 66 20 7b 24 65 6e 64 32   } elseif {$end2
0d20: 3d 3d 22 45 4e 44 22 7d 20 7b 0a 20 20 20 20 20  =="END"} {.     
0d30: 20 20 20 20 20 20 20 73 65 74 20 78 20 24 74 61         set x $ta
0d40: 69 6c 32 0a 20 20 20 20 20 20 20 20 20 20 7d 20  il2.          } 
0d50: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
0d60: 20 20 20 73 65 74 20 78 20 22 7b 24 65 6e 64 32     set x "{$end2
0d70: 7d 20 24 74 61 69 6c 32 22 0a 20 20 20 20 20 20  } $tail2".      
0d80: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
0d90: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
0da0: 20 73 65 74 20 65 78 20 7b 7d 0a 20 20 20 20 20   set ex {}.     
0db0: 20 20 20 20 20 73 65 74 20 78 20 22 7b 24 65 6e       set x "{$en
0dc0: 64 74 61 67 7d 20 24 74 61 69 6c 22 0a 20 20 20  dtag} $tail".   
0dd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
0de0: 65 67 73 75 62 20 2d 61 6c 6c 20 7b 5c 5b 28 5b  egsub -all {\[([
0df0: 5e 5d 7c 5d 2b 5c 7c 29 3f 28 5b 5e 5d 5d 2b 29  ^]|]+\|)?([^]]+)
0e00: 5c 5d 7d 20 24 72 65 71 20 7b 5c 32 7d 20 72 65  \]} $req {\2} re
0e10: 71 0a 20 20 20 20 20 20 20 20 72 65 67 73 75 62  q.        regsub
0e20: 20 2d 61 6c 6c 20 7b 5c 73 2b 7d 20 24 72 65 71   -all {\s+} $req
0e30: 20 7b 20 7d 20 72 65 71 0a 20 20 20 20 20 20 20   { } req.       
0e40: 20 73 65 74 20 72 65 71 20 5b 73 74 72 69 6e 67   set req [string
0e50: 20 74 72 69 6d 20 24 72 65 71 5d 0a 20 20 20 20   trim $req].    
0e60: 20 20 20 20 72 65 67 73 75 62 20 2d 61 6c 6c 20      regsub -all 
0e70: 7b 5c 5b 28 5b 5e 5d 7c 5d 2b 5c 7c 29 3f 28 5b  {\[([^]|]+\|)?([
0e80: 5e 5d 5d 2b 29 5c 5d 7d 20 24 65 78 20 7b 5c 32  ^]]+)\]} $ex {\2
0e90: 7d 20 65 78 0a 20 20 20 20 20 20 20 20 72 65 67  } ex.        reg
0ea0: 73 75 62 20 2d 61 6c 6c 20 7b 5c 73 2b 7d 20 24  sub -all {\s+} $
0eb0: 65 78 20 7b 20 7d 20 65 78 0a 20 20 20 20 20 20  ex { } ex.      
0ec0: 20 20 73 65 74 20 65 78 20 5b 73 74 72 69 6e 67    set ex [string
0ed0: 20 74 72 69 6d 20 24 65 78 5d 0a 20 20 20 20 20   trim $ex].     
0ee0: 20 20 20 72 65 67 65 78 70 20 7b 5c 64 2b 7d 20     regexp {\d+} 
0ef0: 24 74 61 67 20 6b 65 79 0a 20 20 20 20 20 20 20  $tag key.       
0f00: 20 6c 61 70 70 65 6e 64 20 72 65 71 6c 69 73 74   lappend reqlist
0f10: 20 5b 6c 69 73 74 20 24 6b 65 79 20 24 74 61 67   [list $key $tag
0f20: 20 73 71 6c 69 74 65 33 2e 68 20 24 74 69 74 6c   sqlite3.h $titl
0f30: 65 5f 6c 69 6e 65 6e 6f 20 24 72 65 71 20 24 65  e_lineno $req $e
0f40: 78 5d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x].      }.     
0f50: 20 73 65 74 20 74 69 74 6c 65 20 7b 7d 0a 20 20   set title {}.  
0f60: 20 20 20 20 73 65 74 20 6b 65 79 77 6f 72 64 73      set keywords
0f70: 20 7b 7d 0a 20 20 20 20 20 20 73 65 74 20 74 79   {}.      set ty
0f80: 70 65 20 7b 7d 0a 20 20 20 20 20 20 73 65 74 20  pe {}.      set 
0f90: 62 6f 64 79 20 7b 7d 0a 20 20 20 20 20 20 73 65  body {}.      se
0fa0: 74 20 63 6f 64 65 20 7b 7d 0a 20 20 20 20 20 20  t code {}.      
0fb0: 73 65 74 20 70 68 61 73 65 20 30 0a 20 20 20 20  set phase 0.    
0fc0: 20 20 73 65 74 20 64 63 6e 74 20 30 0a 20 20 20    set dcnt 0.   
0fd0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
0fe0: 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 23 64  if {[regexp {^#d
0ff0: 65 66 69 6e 65 20 28 53 51 4c 49 54 45 5f 5b 41  efine (SQLITE_[A
1000: 2d 5a 30 2d 39 5f 5d 2b 29 7d 20 24 6c 69 6e 65  -Z0-9_]+)} $line
1010: 20 61 6c 6c 20 6b 78 5d 7d 20 7b 0a 20 20 20 20   all kx]} {.    
1020: 20 20 20 20 73 65 74 20 74 79 70 65 20 63 6f 6e      set type con
1030: 73 74 61 6e 74 0a 20 20 20 20 20 20 20 20 73 65  stant.        se
1040: 74 20 6b 65 79 77 6f 72 64 28 24 6b 78 29 20 31  t keyword($kx) 1
1050: 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 64 63  .        incr dc
1060: 6e 74 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 69  nt.      } elsei
1070: 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 74 79 70  f {[regexp {^typ
1080: 65 64 65 66 20 2e 2a 28 73 71 6c 69 74 65 5b 30  edef .*(sqlite[0
1090: 2d 39 61 2d 7a 5f 5d 2b 29 3b 7d 20 24 6c 69 6e  -9a-z_]+);} $lin
10a0: 65 20 61 6c 6c 20 6b 78 5d 7d 20 7b 0a 20 20 20  e all kx]} {.   
10b0: 20 20 20 20 20 73 65 74 20 74 79 70 65 20 64 61       set type da
10c0: 74 61 74 79 70 65 0a 20 20 20 20 20 20 20 20 73  tatype.        s
10d0: 65 74 20 6b 65 79 77 6f 72 64 28 24 6b 78 29 20  et keyword($kx) 
10e0: 31 0a 20 20 20 20 20 20 20 20 69 6e 63 72 20 64  1.        incr d
10f0: 63 6e 74 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  cnt.      } else
1100: 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 5b 61  if {[regexp {^[a
1110: 2d 7a 5d 2e 2a 5b 20 2a 5d 28 73 71 6c 69 74 65  -z].*[ *](sqlite
1120: 33 5f 5b 61 2d 7a 30 2d 39 5f 5d 2b 29 5c 28 7d  3_[a-z0-9_]+)\(}
1130: 20 24 6c 69 6e 65 20 61 6c 6c 20 6b 78 5d 7d 20   $line all kx]} 
1140: 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20 74 79  {.        set ty
1150: 70 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  pe function.    
1160: 20 20 20 20 73 65 74 20 6b 65 79 77 6f 72 64 28      set keyword(
1170: 24 6b 78 29 20 31 0a 20 20 20 20 20 20 20 20 69  $kx) 1.        i
1180: 6e 63 72 20 64 63 6e 74 0a 20 20 20 20 20 20 7d  ncr dcnt.      }
1190: 20 65 6c 73 65 69 66 20 7b 5b 72 65 67 65 78 70   elseif {[regexp
11a0: 20 7b 5e 53 51 4c 49 54 45 5f 45 58 54 45 52 4e   {^SQLITE_EXTERN
11b0: 20 2e 2a 28 73 71 6c 69 74 65 5b 30 2d 39 61 2d   .*(sqlite[0-9a-
11c0: 7a 5f 5d 2b 29 3b 7d 20 24 6c 69 6e 65 20 61 6c  z_]+);} $line al
11d0: 6c 20 6b 78 5d 7d 20 7b 0a 20 20 20 20 20 20 20  l kx]} {.       
11e0: 20 73 65 74 20 74 79 70 65 20 64 61 74 61 74 79   set type dataty
11f0: 70 65 0a 20 20 20 20 20 20 20 20 73 65 74 20 6b  pe.        set k
1200: 65 79 77 6f 72 64 28 24 6b 78 29 20 31 0a 20 20  eyword($kx) 1.  
1210: 20 20 20 20 20 20 69 6e 63 72 20 64 63 6e 74 0a        incr dcnt.
1220: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70        }.      ap
1230: 70 65 6e 64 20 63 6f 64 65 20 24 6c 69 6e 65 5c  pend code $line\
1240: 6e 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 66  n.    }.  }.}..f
1250: 6f 72 65 61 63 68 20 72 65 71 20 5b 6c 73 6f 72  oreach req [lsor
1260: 74 20 2d 69 6e 64 65 78 20 30 20 24 72 65 71 6c  t -index 0 $reql
1270: 69 73 74 5d 20 7b 0a 20 20 66 6f 72 65 61 63 68  ist] {.  foreach
1280: 20 7b 6b 65 79 20 74 61 67 20 66 69 6c 65 20 6c   {key tag file l
1290: 69 6e 65 6e 6f 20 74 65 78 74 20 65 78 7d 20 24  ineno text ex} $
12a0: 72 65 71 20 62 72 65 61 6b 0a 20 20 70 75 74 73  req break.  puts
12b0: 20 22 3c 74 72 3e 3c 74 64 20 76 61 6c 69 67 6e   "<tr><td valign
12c0: 3d 5c 22 74 6f 70 5c 22 3e 24 74 61 67 3c 2f 74  =\"top\">$tag</t
12d0: 64 3e 22 0a 20 20 70 75 74 73 20 22 3c 74 64 20  d>".  puts "<td 
12e0: 76 61 6c 69 67 6e 3d 5c 22 74 6f 70 5c 22 3e 3c  valign=\"top\"><
12f0: 62 3e 24 74 65 78 74 3c 2f 62 3e 22 0a 20 20 69  b>$text</b>".  i
1300: 66 20 7b 24 65 78 21 3d 22 22 7d 20 7b 0a 20 20  f {$ex!=""} {.  
1310: 20 20 70 75 74 73 20 22 3c 70 3e 24 65 78 3c 2f    puts "<p>$ex</
1320: 70 3e 22 0a 20 20 7d 0a 20 20 70 75 74 73 20 22  p>".  }.  puts "
1330: 3c 2f 74 64 3e 3c 2f 74 72 3e 22 0a 7d 0a 3c 2f  </td></tr>".}.</
1340: 74 63 6c 3e 0a 0a 3c 2f 74 61 62 6c 65 3e 0a     tcl>..</table>.