/ Hex Artifact Content
Login

Artifact 90e09d580f79c7efec0c7d6f447b7ec5c2dce5c0:


0000: 23 0a 23 20 52 75 6e 20 74 68 69 73 20 54 63 6c  #.# Run this Tcl
0010: 20 73 63 72 69 70 74 20 74 6f 20 67 65 6e 65 72   script to gener
0020: 61 74 65 20 74 68 65 20 61 75 64 69 74 2e 68 74  ate the audit.ht
0030: 6d 6c 20 66 69 6c 65 2e 0a 23 0a 73 65 74 20 72  ml file..#.set r
0040: 63 73 69 64 20 7b 24 49 64 3a 20 61 75 64 69 74  csid {$Id: audit
0050: 2e 74 63 6c 2c 76 20 31 2e 31 20 32 30 30 32 2f  .tcl,v 1.1 2002/
0060: 30 37 2f 31 33 20 31 36 3a 35 32 3a 33 35 20 64  07/13 16:52:35 d
0070: 72 68 20 45 78 70 20 24 7d 0a 0a 70 75 74 73 20  rh Exp $}..puts 
0080: 7b 3c 68 74 6d 6c 3e 0a 3c 68 65 61 64 3e 0a 20  {<html>.<head>. 
0090: 20 3c 74 69 74 6c 65 3e 53 51 4c 69 74 65 20 53   <title>SQLite S
00a0: 65 63 75 72 69 74 79 20 41 75 64 69 74 20 50 72  ecurity Audit Pr
00b0: 6f 63 65 64 75 72 65 3c 2f 74 69 74 6c 65 3e 0a  ocedure</title>.
00c0: 3c 2f 68 65 61 64 3e 0a 3c 62 6f 64 79 20 62 67  </head>.<body bg
00d0: 63 6f 6c 6f 72 3d 77 68 69 74 65 3e 0a 3c 68 31  color=white>.<h1
00e0: 20 61 6c 69 67 6e 3d 63 65 6e 74 65 72 3e 0a 53   align=center>.S
00f0: 51 4c 69 74 65 20 53 65 63 75 72 69 74 79 20 41  QLite Security A
0100: 75 64 69 74 20 50 72 6f 63 65 64 75 72 65 0a 3c  udit Procedure.<
0110: 2f 68 31 3e 7d 0a 70 75 74 73 20 22 3c 70 20 61  /h1>}.puts "<p a
0120: 6c 69 67 6e 3d 63 65 6e 74 65 72 3e 0a 28 54 68  lign=center>.(Th
0130: 69 73 20 70 61 67 65 20 77 61 73 20 6c 61 73 74  is page was last
0140: 20 6d 6f 64 69 66 69 65 64 20 6f 6e 20 5b 6c 72   modified on [lr
0150: 61 6e 67 65 20 24 72 63 73 69 64 20 33 20 34 5d  ange $rcsid 3 4]
0160: 20 55 54 43 29 0a 3c 2f 70 3e 22 0a 0a 70 75 74   UTC).</p>"..put
0170: 73 20 7b 0a 3c 70 3e 0a 41 20 73 65 63 75 72 69  s {.<p>.A securi
0180: 74 79 20 61 75 64 69 74 20 66 6f 72 20 53 51 4c  ty audit for SQL
0190: 69 74 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20  ite consists of 
01a0: 74 77 6f 20 63 6f 6d 70 6f 6e 65 6e 74 73 2e 20  two components. 
01b0: 20 46 69 72 73 74 2c 20 74 68 65 72 65 20 69 73   First, there is
01c0: 0a 61 20 63 68 65 63 6b 20 66 6f 72 20 63 6f 6d  .a check for com
01d0: 6d 6f 6e 20 65 72 72 6f 72 73 20 74 68 61 74 20  mon errors that 
01e0: 6f 66 74 65 6e 20 6c 65 61 64 20 74 6f 20 73 65  often lead to se
01f0: 63 75 72 69 74 79 20 70 72 6f 62 6c 65 6d 73 2e  curity problems.
0200: 20 20 53 65 63 6f 6e 64 2c 0a 61 6e 20 61 74 74    Second,.an att
0210: 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
0220: 63 6f 6e 73 74 72 75 63 74 20 61 20 70 72 6f 6f  construct a proo
0230: 66 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 61  f that SQLite ha
0240: 73 20 63 65 72 74 61 69 6e 20 64 65 73 69 72 61  s certain desira
0250: 62 6c 65 0a 73 65 63 75 72 69 74 79 20 70 72 6f  ble.security pro
0260: 70 65 72 74 69 65 73 2e 0a 3c 2f 70 3e 0a 0a 3c  perties..</p>..<
0270: 68 32 3e 50 61 72 74 20 49 3a 20 54 68 69 6e 67  h2>Part I: Thing
0280: 73 20 74 6f 20 63 68 65 63 6b 3c 2f 68 32 3e 0a  s to check</h2>.
0290: 0a 3c 70 3e 0a 53 63 61 6e 20 61 6c 6c 20 73 6f  .<p>.Scan all so
02a0: 75 72 63 65 20 63 6f 64 65 20 61 6e 64 20 63 68  urce code and ch
02b0: 65 63 6b 20 66 6f 72 20 74 68 65 20 66 6f 6c 6c  eck for the foll
02c0: 6f 77 69 6e 67 20 63 6f 6d 6d 6f 6e 20 65 72 72  owing common err
02d0: 6f 72 73 3a 0a 3c 2f 70 3e 0a 0a 3c 6f 6c 3e 0a  ors:.</p>..<ol>.
02e0: 3c 6c 69 3e 3c 70 3e 0a 56 65 72 69 66 79 20 74  <li><p>.Verify t
02f0: 68 61 74 20 74 68 65 20 64 65 73 74 69 6e 61 74  hat the destinat
0300: 69 6f 6e 20 62 75 66 66 65 72 20 69 73 20 6c 61  ion buffer is la
0310: 72 67 65 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f  rge enough to ho
0320: 6c 64 20 69 74 73 20 72 65 73 75 6c 74 0a 69 6e  ld its result.in
0330: 20 65 76 65 72 79 20 63 61 6c 6c 20 74 6f 20 74   every call to t
0340: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
0350: 74 69 6e 65 73 3a 0a 3c 75 6c 3e 0a 3c 6c 69 3e  tines:.<ul>.<li>
0360: 20 3c 62 3e 73 74 72 63 70 79 28 29 3c 2f 62 3e   <b>strcpy()</b>
0370: 20 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c 62 3e 73   </li>.<li> <b>s
0380: 74 72 6e 63 70 79 28 29 3c 2f 62 3e 20 3c 2f 6c  trncpy()</b> </l
0390: 69 3e 0a 3c 6c 69 3e 20 3c 62 3e 73 74 72 63 61  i>.<li> <b>strca
03a0: 74 28 29 3c 2f 62 3e 20 3c 2f 6c 69 3e 0a 3c 6c  t()</b> </li>.<l
03b0: 69 3e 20 3c 62 3e 6d 65 6d 63 70 79 28 29 3c 2f  i> <b>memcpy()</
03c0: 62 3e 20 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c 62  b> </li>.<li> <b
03d0: 3e 6d 65 6d 73 65 74 28 29 3c 2f 62 3e 20 3c 2f  >memset()</b> </
03e0: 6c 69 3e 0a 3c 6c 69 3e 20 3c 62 3e 6d 65 6d 6d  li>.<li> <b>memm
03f0: 6f 76 65 28 29 3c 2f 62 3e 20 3c 2f 6c 69 3e 0a  ove()</b> </li>.
0400: 3c 6c 69 3e 20 3c 62 3e 62 63 6f 70 79 28 29 3c  <li> <b>bcopy()<
0410: 2f 62 3e 20 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c  /b> </li>.<li> <
0420: 62 3e 73 70 72 69 6e 74 66 28 29 3c 2f 62 3e 20  b>sprintf()</b> 
0430: 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c 62 3e 73 63  </li>.<li> <b>sc
0440: 61 6e 66 28 29 3c 2f 62 3e 20 3c 2f 6c 69 3e 0a  anf()</b> </li>.
0450: 3c 2f 75 6c 3e 0a 3c 2f 70 3e 3c 2f 6c 69 3e 0a  </ul>.</p></li>.
0460: 3c 6c 69 3e 3c 70 3e 0a 56 65 72 69 66 79 20 74  <li><p>.Verify t
0470: 68 61 74 20 70 6f 69 6e 74 65 72 73 20 72 65 74  hat pointers ret
0480: 75 72 6e 65 64 20 62 79 20 73 75 62 72 6f 75 74  urned by subrout
0490: 69 6e 65 73 20 61 72 65 20 6e 6f 74 20 4e 55 4c  ines are not NUL
04a0: 4c 20 62 65 66 6f 72 65 20 75 73 69 6e 67 0a 74  L before using.t
04b0: 68 65 20 70 6f 69 6e 74 65 72 73 2e 20 20 49 6e  he pointers.  In
04c0: 20 70 61 72 74 69 63 75 6c 61 72 2c 20 6d 61 6b   particular, mak
04d0: 65 20 73 75 72 65 20 74 68 65 20 72 65 74 75 72  e sure the retur
04e0: 6e 20 76 61 6c 75 65 73 20 66 6f 72 20 74 68 65  n values for the
04f0: 20 66 6f 6c 6c 6f 77 69 6e 67 0a 72 6f 75 74 69   following.routi
0500: 6e 65 73 20 61 72 65 20 63 68 65 63 6b 65 64 20  nes are checked 
0510: 62 65 66 6f 72 65 20 74 68 65 79 20 61 72 65 20  before they are 
0520: 75 73 65 64 3a 0a 3c 75 6c 3e 0a 3c 6c 69 3e 20  used:.<ul>.<li> 
0530: 3c 62 3e 6d 61 6c 6c 6f 63 28 29 3c 2f 62 3e 20  <b>malloc()</b> 
0540: 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c 62 3e 72 65  </li>.<li> <b>re
0550: 61 6c 6c 6f 63 28 29 3c 2f 62 3e 20 3c 2f 6c 69  alloc()</b> </li
0560: 3e 0a 3c 6c 69 3e 20 3c 62 3e 73 71 6c 69 74 65  >.<li> <b>sqlite
0570: 4d 61 6c 6c 6f 63 28 29 3c 2f 62 3e 20 3c 2f 6c  Malloc()</b> </l
0580: 69 3e 0a 3c 6c 69 3e 20 3c 62 3e 73 71 6c 69 74  i>.<li> <b>sqlit
0590: 65 52 65 61 6c 6c 6f 63 28 29 3c 2f 62 3e 20 3c  eRealloc()</b> <
05a0: 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c 62 3e 73 71 6c  /li>.<li> <b>sql
05b0: 69 74 65 53 74 72 44 75 70 28 29 3c 2f 62 3e 20  iteStrDup()</b> 
05c0: 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c 62 3e 73 71  </li>.<li> <b>sq
05d0: 6c 69 74 65 53 74 72 4e 44 75 70 28 29 3c 2f 62  liteStrNDup()</b
05e0: 3e 20 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c 62 3e  > </li>.<li> <b>
05f0: 73 71 6c 69 74 65 45 78 70 72 28 29 3c 2f 62 3e  sqliteExpr()</b>
0600: 20 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c 62 3e 73   </li>.<li> <b>s
0610: 71 6c 69 74 65 45 78 70 72 46 75 6e 63 74 69 6f  qliteExprFunctio
0620: 6e 28 29 3c 2f 62 3e 20 3c 2f 6c 69 3e 0a 3c 6c  n()</b> </li>.<l
0630: 69 3e 20 3c 62 3e 73 71 6c 69 74 65 45 78 70 72  i> <b>sqliteExpr
0640: 4c 69 73 74 41 70 70 65 6e 64 28 29 3c 2f 62 3e  ListAppend()</b>
0650: 20 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c 62 3e 73   </li>.<li> <b>s
0660: 71 6c 69 74 65 52 65 73 75 6c 74 53 65 74 4f 66  qliteResultSetOf
0670: 53 65 6c 65 63 74 28 29 3c 2f 62 3e 20 3c 2f 6c  Select()</b> </l
0680: 69 3e 0a 3c 6c 69 3e 20 3c 62 3e 73 71 6c 69 74  i>.<li> <b>sqlit
0690: 65 49 64 4c 69 73 74 41 70 70 65 6e 64 28 29 3c  eIdListAppend()<
06a0: 2f 62 3e 20 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c  /b> </li>.<li> <
06b0: 62 3e 73 71 6c 69 74 65 53 72 63 4c 69 73 74 41  b>sqliteSrcListA
06c0: 70 70 65 6e 64 28 29 3c 2f 62 3e 20 3c 2f 6c 69  ppend()</b> </li
06d0: 3e 0a 3c 6c 69 3e 20 3c 62 3e 73 71 6c 69 74 65  >.<li> <b>sqlite
06e0: 53 65 6c 65 63 74 4e 65 77 28 29 3c 2f 62 3e 20  SelectNew()</b> 
06f0: 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c 62 3e 73 71  </li>.<li> <b>sq
0700: 6c 69 74 65 54 61 62 6c 65 4e 61 6d 65 54 6f 54  liteTableNameToT
0710: 61 62 6c 65 28 29 3c 2f 62 3e 20 3c 2f 6c 69 3e  able()</b> </li>
0720: 0a 3c 6c 69 3e 20 3c 62 3e 73 71 6c 69 74 65 54  .<li> <b>sqliteT
0730: 61 62 6c 65 54 6f 6b 65 6e 54 6f 53 72 63 4c 69  ableTokenToSrcLi
0740: 73 74 28 29 3c 2f 62 3e 20 3c 2f 6c 69 3e 0a 3c  st()</b> </li>.<
0750: 6c 69 3e 20 3c 62 3e 73 71 6c 69 74 65 57 68 65  li> <b>sqliteWhe
0760: 72 65 42 65 67 69 6e 28 29 3c 2f 62 3e 20 3c 2f  reBegin()</b> </
0770: 6c 69 3e 0a 3c 6c 69 3e 20 3c 62 3e 73 71 6c 69  li>.<li> <b>sqli
0780: 74 65 46 69 6e 64 54 61 62 6c 65 28 29 3c 2f 62  teFindTable()</b
0790: 3e 20 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c 62 3e  > </li>.<li> <b>
07a0: 73 71 6c 69 74 65 46 69 6e 64 49 6e 64 65 78 28  sqliteFindIndex(
07b0: 29 3c 2f 62 3e 20 3c 2f 6c 69 3e 0a 3c 6c 69 3e  )</b> </li>.<li>
07c0: 20 3c 62 3e 73 71 6c 69 74 65 54 61 62 6c 65 4e   <b>sqliteTableN
07d0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 29 3c 2f  ameFromToken()</
07e0: 62 3e 20 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c 62  b> </li>.<li> <b
07f0: 3e 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 29  >sqliteGetVdbe()
0800: 3c 2f 62 3e 20 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20  </b> </li>.<li> 
0810: 3c 62 3e 73 71 6c 69 74 65 5f 6d 70 72 69 6e 74  <b>sqlite_mprint
0820: 66 28 29 3c 2f 62 3e 20 3c 2f 6c 69 3e 0a 3c 6c  f()</b> </li>.<l
0830: 69 3e 20 3c 62 3e 73 71 6c 69 74 65 45 78 70 72  i> <b>sqliteExpr
0840: 44 75 70 28 29 3c 2f 62 3e 20 3c 2f 6c 69 3e 0a  Dup()</b> </li>.
0850: 3c 6c 69 3e 20 3c 62 3e 73 71 6c 69 74 65 45 78  <li> <b>sqliteEx
0860: 70 72 4c 69 73 74 44 75 70 28 29 3c 2f 62 3e 20  prListDup()</b> 
0870: 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c 62 3e 73 71  </li>.<li> <b>sq
0880: 6c 69 74 65 53 72 63 4c 69 73 74 44 75 70 28 29  liteSrcListDup()
0890: 3c 2f 62 3e 20 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20  </b> </li>.<li> 
08a0: 3c 62 3e 73 71 6c 69 74 65 49 64 4c 69 73 74 44  <b>sqliteIdListD
08b0: 75 70 28 29 3c 2f 62 3e 20 3c 2f 6c 69 3e 0a 3c  up()</b> </li>.<
08c0: 6c 69 3e 20 3c 62 3e 73 71 6c 69 74 65 53 65 6c  li> <b>sqliteSel
08d0: 65 63 74 44 75 70 28 29 3c 2f 62 3e 20 3c 2f 6c  ectDup()</b> </l
08e0: 69 3e 0a 3c 6c 69 3e 20 3c 62 3e 73 71 6c 69 74  i>.<li> <b>sqlit
08f0: 65 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 29 3c  eFindFunction()<
0900: 2f 62 3e 20 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c  /b> </li>.<li> <
0910: 62 3e 73 71 6c 69 74 65 54 72 69 67 67 65 72 53  b>sqliteTriggerS
0920: 65 6c 65 63 74 53 74 65 70 28 29 3c 2f 62 3e 20  electStep()</b> 
0930: 3c 2f 6c 69 3e 0a 3c 6c 69 3e 20 3c 62 3e 73 71  </li>.<li> <b>sq
0940: 6c 69 74 65 54 72 69 67 67 65 72 49 6e 73 65 72  liteTriggerInser
0950: 74 53 74 65 70 28 29 3c 2f 62 3e 20 3c 2f 6c 69  tStep()</b> </li
0960: 3e 0a 3c 6c 69 3e 20 3c 62 3e 73 71 6c 69 74 65  >.<li> <b>sqlite
0970: 54 72 69 67 67 65 72 55 70 64 61 74 65 53 74 65  TriggerUpdateSte
0980: 70 28 29 3c 2f 62 3e 20 3c 2f 6c 69 3e 0a 3c 6c  p()</b> </li>.<l
0990: 69 3e 20 3c 62 3e 73 71 6c 69 74 65 54 72 69 67  i> <b>sqliteTrig
09a0: 67 65 72 44 65 6c 65 74 65 53 74 65 70 28 29 3c  gerDeleteStep()<
09b0: 2f 62 3e 20 3c 2f 6c 69 3e 0a 3c 2f 75 6c 3e 0a  /b> </li>.</ul>.
09c0: 3c 2f 70 3e 3c 2f 6c 69 3e 0a 3c 6c 69 3e 3c 70  </p></li>.<li><p
09d0: 3e 0a 4f 6e 20 61 6c 6c 20 66 75 6e 63 74 69 6f  >.On all functio
09e0: 6e 73 20 61 6e 64 20 70 72 6f 63 65 64 75 72 65  ns and procedure
09f0: 73 2c 20 76 65 72 69 66 79 20 74 68 61 74 20 70  s, verify that p
0a00: 6f 69 6e 74 65 72 20 70 61 72 61 6d 65 74 65 72  ointer parameter
0a10: 73 20 61 72 65 20 6e 6f 74 20 4e 55 4c 4c 0a 62  s are not NULL.b
0a20: 65 66 6f 72 65 20 64 65 72 65 66 65 72 65 6e 63  efore dereferenc
0a30: 69 6e 67 20 74 68 6f 73 65 20 70 61 72 61 6d 65  ing those parame
0a40: 74 65 72 73 2e 0a 3c 2f 70 3e 3c 2f 6c 69 3e 0a  ters..</p></li>.
0a50: 3c 6c 69 3e 3c 70 3e 0a 43 68 65 63 6b 20 74 6f  <li><p>.Check to
0a60: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
0a70: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
0a80: 61 72 65 20 6f 70 65 6e 65 64 20 73 61 66 65 6c  are opened safel
0a90: 79 3a 20 74 68 61 74 20 74 68 65 20 70 72 6f 63  y: that the proc
0aa0: 65 73 73 0a 77 69 6c 6c 20 6e 6f 74 20 6f 76 65  ess.will not ove
0ab0: 72 77 72 69 74 65 20 61 6e 20 65 78 69 73 74 69  rwrite an existi
0ac0: 6e 67 20 66 69 6c 65 20 77 68 65 6e 20 6f 70 65  ng file when ope
0ad0: 6e 69 6e 67 20 74 68 65 20 74 65 6d 70 20 66 69  ning the temp fi
0ae0: 6c 65 20 61 6e 64 20 74 68 61 74 0a 61 6e 6f 74  le and that.anot
0af0: 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20 75  her process is u
0b00: 6e 61 62 6c 65 20 74 6f 20 73 75 62 73 74 69 74  nable to substit
0b10: 75 74 65 20 61 20 66 69 6c 65 20 66 6f 72 20 74  ute a file for t
0b20: 68 65 20 74 65 6d 70 20 66 69 6c 65 20 62 65 69  he temp file bei
0b30: 6e 67 0a 6f 70 65 6e 65 64 2e 0a 3c 2f 70 3e 3c  ng.opened..</p><
0b40: 2f 6c 69 3e 0a 3c 2f 6f 6c 3e 0a 0a 0a 0a 3c 68  /li>.</ol>....<h
0b50: 32 3e 50 61 72 74 20 49 49 3a 20 54 68 69 6e 67  2>Part II: Thing
0b60: 73 20 74 6f 20 70 72 6f 76 65 3c 2f 68 32 3e 0a  s to prove</h2>.
0b70: 0a 3c 70 3e 0a 50 72 6f 76 65 20 74 68 61 74 20  .<p>.Prove that 
0b80: 53 51 4c 69 74 65 20 65 78 68 69 62 69 74 73 20  SQLite exhibits 
0b90: 74 68 65 20 63 68 61 72 61 63 74 65 72 69 73 74  the characterist
0ba0: 69 63 73 20 6f 75 74 6c 69 6e 65 64 20 62 65 6c  ics outlined bel
0bb0: 6f 77 3a 0a 3c 2f 70 3e 0a 0a 3c 6f 6c 3e 0a 3c  ow:.</p>..<ol>.<
0bc0: 6c 69 3e 3c 70 3e 0a 54 68 65 20 66 6f 6c 6c 6f  li><p>.The follo
0bd0: 77 69 6e 67 20 61 72 65 20 70 72 65 63 6f 6e 64  wing are precond
0be0: 69 74 69 6f 6e 73 3a 3c 2f 70 3e 0a 3c 70 3e 3c  itions:</p>.<p><
0bf0: 75 6c 3e 0a 3c 6c 69 3e 3c 62 3e 5a 3c 2f 62 3e  ul>.<li><b>Z</b>
0c00: 20 69 73 20 61 6e 20 61 72 62 69 74 72 61 72 79   is an arbitrary
0c10: 2d 6c 65 6e 67 74 68 20 4e 55 4c 2d 74 65 72 6d  -length NUL-term
0c20: 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 3c 2f  inated string.</
0c30: 6c 69 3e 0a 3c 6c 69 3e 41 6e 20 65 78 69 73 74  li>.<li>An exist
0c40: 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62  ing SQLite datab
0c50: 61 73 65 20 68 61 73 20 62 65 65 6e 20 6f 70 65  ase has been ope
0c60: 6e 65 64 2e 20 20 54 68 65 20 72 65 74 75 72 6e  ned.  The return
0c70: 20 76 61 6c 75 65 0a 20 20 20 20 66 72 6f 6d 20   value.    from 
0c80: 74 68 65 20 63 61 6c 6c 20 74 6f 20 3c 62 3e 73  the call to <b>s
0c90: 71 6c 69 74 65 5f 6f 70 65 6e 28 29 3c 2f 62 3e  qlite_open()</b>
0ca0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68   is stored in th
0cb0: 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20 20 3c  e variable.    <
0cc0: 62 3e 64 62 3c 2f 62 3e 2e 3c 2f 6c 69 3e 0a 3c  b>db</b>.</li>.<
0cd0: 6c 69 3e 54 68 65 20 64 61 74 61 62 61 73 65 20  li>The database 
0ce0: 63 6f 6e 74 61 69 6e 73 20 61 74 20 6c 65 61 73  contains at leas
0cf0: 74 20 6f 6e 65 20 74 61 62 6c 65 20 6f 66 20 74  t one table of t
0d00: 68 65 20 66 6f 72 6d 3a 0a 3c 62 6c 6f 63 6b 71  he form:.<blockq
0d10: 75 6f 74 65 3e 3c 70 72 65 3e 0a 43 52 45 41 54  uote><pre>.CREAT
0d20: 45 20 54 41 42 4c 45 20 74 31 28 61 20 43 4c 4f  E TABLE t1(a CLO
0d30: 42 29 3b 0a 3c 2f 70 72 65 3e 3c 2f 62 6c 6f 63  B);.</pre></bloc
0d40: 6b 71 75 6f 74 65 3e 3c 2f 6c 69 3e 0a 3c 6c 69  kquote></li>.<li
0d50: 3e 54 68 65 72 65 20 61 72 65 20 6e 6f 20 75 73  >There are no us
0d60: 65 72 2d 64 65 66 69 6e 65 64 20 66 75 6e 63 74  er-defined funct
0d70: 69 6f 6e 73 20 6f 74 68 65 72 20 74 68 61 6e 20  ions other than 
0d80: 74 68 65 20 73 74 61 6e 64 61 72 64 0a 20 20 20  the standard.   
0d90: 20 62 75 69 6c 64 2d 69 6e 20 66 75 6e 63 74 69   build-in functi
0da0: 6f 6e 73 2e 3c 2f 6c 69 3e 0a 3c 2f 75 6c 3e 3c  ons.</li>.</ul><
0db0: 2f 70 3e 0a 3c 70 3e 54 68 65 20 66 6f 6c 6c 6f  /p>.<p>The follo
0dc0: 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 6f  wing statement o
0dd0: 66 20 43 20 63 6f 64 65 20 69 73 20 65 78 65 63  f C code is exec
0de0: 75 74 65 64 3a 3c 2f 70 3e 0a 3c 62 6c 6f 63 6b  uted:</p>.<block
0df0: 71 75 6f 74 65 3e 3c 70 72 65 3e 0a 73 71 6c 69  quote><pre>.sqli
0e00: 74 65 5f 65 78 65 63 5f 70 72 69 6e 74 66 28 0a  te_exec_printf(.
0e10: 20 20 20 64 62 2c 0a 20 20 20 22 49 4e 53 45 52     db,.   "INSER
0e20: 54 20 49 4e 54 4f 20 74 31 28 61 29 20 56 41 4c  T INTO t1(a) VAL
0e30: 55 45 53 28 27 25 71 27 29 3b 22 2c 20 0a 20 20  UES('%q');", .  
0e40: 20 30 2c 20 30 2c 20 30 2c 20 5a 0a 29 3b 0a 3c   0, 0, 0, Z.);.<
0e50: 2f 70 72 65 3e 3c 2f 62 6c 6f 63 6b 71 75 6f 74  /pre></blockquot
0e60: 65 3e 0a 3c 70 3e 50 72 6f 76 65 20 74 68 65 20  e>.<p>Prove the 
0e70: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0e80: 75 65 20 66 6f 72 20 61 6c 6c 20 70 6f 73 73 69  ue for all possi
0e90: 62 6c 65 20 76 61 6c 75 65 73 20 6f 66 20 73 74  ble values of st
0ea0: 72 69 6e 67 20 3c 62 3e 5a 3c 2f 62 3e 3a 3c 2f  ring <b>Z</b>:</
0eb0: 70 3e 0a 3c 6f 6c 20 74 79 70 65 3d 22 61 22 3e  p>.<ol type="a">
0ec0: 0a 3c 6c 69 3e 3c 70 3e 0a 54 68 65 20 63 61 6c  .<li><p>.The cal
0ed0: 6c 20 74 6f 20 3c 62 3e 73 71 6c 69 74 65 5f 65  l to <b>sqlite_e
0ee0: 78 65 63 5f 70 72 69 6e 74 66 28 29 3c 2f 62 3e  xec_printf()</b>
0ef0: 20 77 69 6c 6c 0a 72 65 74 75 72 6e 20 69 6e 20   will.return in 
0f00: 61 20 6c 65 6e 67 74 68 20 6f 66 20 74 69 6d 65  a length of time
0f10: 20 74 68 61 74 20 69 73 20 61 20 70 6f 6c 79 6e   that is a polyn
0f20: 6f 6d 69 61 6c 20 69 6e 20 3c 62 3e 73 74 72 6c  omial in <b>strl
0f30: 65 6e 28 5a 29 3c 2f 62 3e 2e 0a 49 74 20 6d 69  en(Z)</b>..It mi
0f40: 67 68 74 20 72 65 74 75 72 6e 20 61 6e 20 65 72  ght return an er
0f50: 72 6f 72 20 63 6f 64 65 20 62 75 74 20 69 74 20  ror code but it 
0f60: 77 69 6c 6c 20 6e 6f 74 20 63 72 61 73 68 2e 0a  will not crash..
0f70: 3c 2f 70 3e 3c 2f 6c 69 3e 0a 3c 6c 69 3e 3c 70  </p></li>.<li><p
0f80: 3e 0a 41 74 20 6d 6f 73 74 20 6f 6e 65 20 6e 65  >.At most one ne
0f90: 77 20 72 6f 77 20 77 69 6c 6c 20 62 65 20 69 6e  w row will be in
0fa0: 73 65 72 74 65 64 20 69 6e 74 6f 20 74 61 62 6c  serted into tabl
0fb0: 65 20 74 31 2e 0a 3c 2f 70 3e 3c 2f 6c 69 3e 0a  e t1..</p></li>.
0fc0: 3c 6c 69 3e 3c 70 3e 0a 4e 6f 20 70 72 65 65 78  <li><p>.No preex
0fd0: 69 73 74 69 6e 67 20 72 6f 77 73 20 6f 66 20 74  isting rows of t
0fe0: 31 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  1 will be delete
0ff0: 64 20 6f 72 20 6d 6f 64 69 66 69 65 64 2e 0a 3c  d or modified..<
1000: 2f 70 3e 3c 2f 6c 69 3e 0a 3c 6c 69 3e 3c 70 3e  /p></li>.<li><p>
1010: 0a 4e 6f 20 74 61 62 6c 65 73 20 6f 74 68 65 72  .No tables other
1020: 20 74 68 61 6e 20 74 31 20 77 69 6c 6c 20 62 65   than t1 will be
1030: 20 61 6c 74 65 72 65 64 20 69 6e 20 61 6e 79 20   altered in any 
1040: 77 61 79 2e 0a 3c 2f 70 3e 3c 2f 6c 69 3e 0a 3c  way..</p></li>.<
1050: 6c 69 3e 3c 70 3e 0a 4e 6f 20 70 72 65 65 78 69  li><p>.No preexi
1060: 73 74 69 6e 67 20 66 69 6c 65 73 20 6f 6e 20 74  sting files on t
1070: 68 65 20 68 6f 73 74 20 63 6f 6d 70 75 74 65 72  he host computer
1080: 73 20 66 69 6c 65 73 79 73 74 65 6d 2c 20 6f 74  s filesystem, ot
1090: 68 65 72 20 74 68 61 6e 0a 74 68 65 20 64 61 74  her than.the dat
10a0: 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
10b0: 66 2c 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74  f, will be delet
10c0: 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64 2e 0a  ed or modified..
10d0: 3c 2f 70 3e 3c 2f 6c 69 3e 0a 3c 6c 69 3e 3c 70  </p></li>.<li><p
10e0: 3e 0a 46 6f 72 20 73 6f 6d 65 20 63 6f 6e 73 74  >.For some const
10f0: 61 6e 74 73 20 3c 62 3e 4b 31 3c 2f 62 3e 20 61  ants <b>K1</b> a
1100: 6e 64 20 3c 62 3e 4b 32 3c 2f 62 3e 2c 0a 69 66  nd <b>K2</b>,.if
1110: 20 61 74 20 6c 65 61 73 74 20 3c 62 3e 4b 31 2a   at least <b>K1*
1120: 73 74 72 6c 65 6e 28 5a 29 20 2b 20 4b 32 3c 2f  strlen(Z) + K2</
1130: 62 3e 20 62 79 74 65 73 20 6f 66 20 63 6f 6e 74  b> bytes of cont
1140: 69 67 75 6f 75 73 20 6d 65 6d 6f 72 79 20 61 72  iguous memory ar
1150: 65 0a 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 3c  e.available to <
1160: 62 3e 6d 61 6c 6c 6f 63 28 29 3c 2f 62 3e 2c 20  b>malloc()</b>, 
1170: 74 68 65 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f  then the call to
1180: 20 3c 62 3e 73 71 6c 69 74 65 5f 65 78 65 63 5f   <b>sqlite_exec_
1190: 70 72 69 6e 74 66 28 29 3c 2f 62 3e 0a 77 69 6c  printf()</b>.wil
11a0: 6c 20 6e 6f 74 20 72 65 74 75 72 6e 20 53 51 4c  l not return SQL
11b0: 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 3c 2f 70 3e 3c  ITE_NOMEM..</p><
11c0: 2f 6c 69 3e 0a 3c 2f 6f 6c 3e 0a 3c 2f 70 3e 3c  /li>.</ol>.</p><
11d0: 2f 6c 69 3e 0a 0a 0a 3c 6c 69 3e 3c 70 3e 0a 54  /li>...<li><p>.T
11e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
11f0: 20 70 72 65 63 6f 6e 64 69 74 69 6f 6e 73 3a 0a   preconditions:.
1200: 3c 70 3e 3c 75 6c 3e 0a 3c 6c 69 3e 3c 62 3e 5a  <p><ul>.<li><b>Z
1210: 3c 2f 62 3e 20 69 73 20 61 6e 20 61 72 62 69 74  </b> is an arbit
1220: 72 61 72 79 2d 6c 65 6e 67 74 68 20 4e 55 4c 2d  rary-length NUL-
1230: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
1240: 67 2e 3c 2f 6c 69 3e 0a 3c 6c 69 3e 41 6e 20 65  g.</li>.<li>An e
1250: 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20 64  xisting SQLite d
1260: 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
1270: 20 6f 70 65 6e 65 64 2e 20 20 54 68 65 20 72 65   opened.  The re
1280: 74 75 72 6e 20 76 61 6c 75 65 0a 20 20 20 20 66  turn value.    f
1290: 72 6f 6d 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  rom the call to 
12a0: 3c 62 3e 73 71 6c 69 74 65 5f 6f 70 65 6e 28 29  <b>sqlite_open()
12b0: 3c 2f 62 3e 20 69 73 20 73 74 6f 72 65 64 20 69  </b> is stored i
12c0: 6e 20 74 68 65 20 76 61 72 69 61 62 6c 65 0a 20  n the variable. 
12d0: 20 20 20 3c 62 3e 64 62 3c 2f 62 3e 2e 3c 2f 6c     <b>db</b>.</l
12e0: 69 3e 0a 3c 6c 69 3e 54 68 65 72 65 20 65 78 69  i>.<li>There exi
12f0: 73 74 73 20 61 20 63 61 6c 6c 62 61 63 6b 20 66  sts a callback f
1300: 75 6e 63 74 69 6f 6e 20 3c 62 3e 63 62 28 29 3c  unction <b>cb()<
1310: 2f 62 3e 20 74 68 61 74 20 61 70 70 65 6e 64 73  /b> that appends
1320: 20 61 6c 6c 0a 20 20 20 20 69 6e 66 6f 72 6d 61   all.    informa
1330: 74 69 6f 6e 20 70 61 73 73 65 64 20 69 6e 20 74  tion passed in t
1340: 68 72 6f 75 67 68 20 69 74 73 20 70 61 72 61 6d  hrough its param
1350: 65 74 65 72 73 20 69 6e 74 6f 20 61 20 73 69 6e  eters into a sin
1360: 67 6c 65 0a 20 20 20 20 64 61 74 61 20 62 75 66  gle.    data buf
1370: 66 65 72 20 63 61 6c 6c 65 64 20 3c 62 3e 59 3c  fer called <b>Y<
1380: 2f 62 3e 2e 3c 2f 6c 69 3e 0a 3c 6c 69 3e 54 68  /b>.</li>.<li>Th
1390: 65 72 65 20 61 72 65 20 6e 6f 20 75 73 65 72 2d  ere are no user-
13a0: 64 65 66 69 6e 65 64 20 66 75 6e 63 74 69 6f 6e  defined function
13b0: 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68 65  s other than the
13c0: 20 73 74 61 6e 64 61 72 64 0a 20 20 20 20 62 75   standard.    bu
13d0: 69 6c 64 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73  ild-in functions
13e0: 2e 3c 2f 6c 69 3e 0a 3c 2f 75 6c 3e 3c 2f 70 3e  .</li>.</ul></p>
13f0: 0a 3c 70 3e 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .<p>The followin
1400: 67 20 73 74 61 74 65 6d 65 6e 74 20 6f 66 20 43  g statement of C
1410: 20 63 6f 64 65 20 69 73 20 65 78 65 63 75 74 65   code is execute
1420: 64 3a 3c 2f 70 3e 0a 3c 62 6c 6f 63 6b 71 75 6f  d:</p>.<blockquo
1430: 74 65 3e 3c 70 72 65 3e 0a 73 71 6c 69 74 65 5f  te><pre>.sqlite_
1440: 65 78 65 63 28 64 62 2c 20 5a 2c 20 63 62 2c 20  exec(db, Z, cb, 
1450: 30 2c 20 30 29 3b 0a 3c 2f 70 72 65 3e 3c 2f 62  0, 0);.</pre></b
1460: 6c 6f 63 6b 71 75 6f 74 65 3e 0a 3c 70 3e 50 72  lockquote>.<p>Pr
1470: 6f 76 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ove the followin
1480: 67 20 61 72 65 20 74 72 75 65 20 66 6f 72 20 61  g are true for a
1490: 6c 6c 20 70 6f 73 73 69 62 6c 65 20 76 61 6c 75  ll possible valu
14a0: 65 73 20 6f 66 20 73 74 72 69 6e 67 20 3c 62 3e  es of string <b>
14b0: 5a 3c 2f 62 3e 3a 3c 2f 70 3e 0a 3c 6f 6c 20 74  Z</b>:</p>.<ol t
14c0: 79 70 65 3d 22 61 22 3e 0a 3c 6c 69 3e 3c 70 3e  ype="a">.<li><p>
14d0: 0a 54 68 65 20 63 61 6c 6c 20 74 6f 20 3c 62 3e  .The call to <b>
14e0: 73 71 6c 69 74 65 5f 65 78 65 63 28 29 3c 2f 62  sqlite_exec()</b
14f0: 3e 20 77 69 6c 6c 0a 72 65 74 75 72 6e 20 69 6e  > will.return in
1500: 20 61 20 6c 65 6e 67 74 68 20 6f 66 20 74 69 6d   a length of tim
1510: 65 20 77 68 69 63 68 20 69 73 20 61 20 70 6f 6c  e which is a pol
1520: 79 6e 6f 6d 69 61 6c 20 69 6e 20 3c 62 3e 73 74  ynomial in <b>st
1530: 72 6c 65 6e 28 5a 29 3c 2f 62 3e 2e 0a 49 74 20  rlen(Z)</b>..It 
1540: 6d 69 67 68 74 20 72 65 74 75 72 6e 20 61 6e 20  might return an 
1550: 65 72 72 6f 72 20 63 6f 64 65 20 62 75 74 20 69  error code but i
1560: 74 20 77 69 6c 6c 20 6e 6f 74 20 63 72 61 73 68  t will not crash
1570: 2e 0a 3c 2f 70 3e 3c 2f 6c 69 3e 0a 3c 6c 69 3e  ..</p></li>.<li>
1580: 3c 70 3e 0a 41 66 74 65 72 20 3c 62 3e 73 71 6c  <p>.After <b>sql
1590: 69 74 65 5f 65 78 65 63 28 29 3c 2f 62 3e 20 72  ite_exec()</b> r
15a0: 65 74 75 72 6e 73 2c 20 74 68 65 20 62 75 66 66  eturns, the buff
15b0: 65 72 20 3c 62 3e 59 3c 2f 62 3e 20 77 69 6c 6c  er <b>Y</b> will
15c0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 0a 61 6e 79   not contain.any
15d0: 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 61 6e   content from an
15e0: 79 20 70 72 65 65 78 69 73 74 69 6e 67 20 66 69  y preexisting fi
15f0: 6c 65 20 6f 6e 20 74 68 65 20 68 6f 73 74 20 63  le on the host c
1600: 6f 6d 70 75 74 65 72 73 20 66 69 6c 65 20 73 79  omputers file sy
1610: 73 74 65 6d 2c 0a 65 78 63 65 70 74 20 66 6f 72  stem,.except for
1620: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1630: 6c 65 2e 0a 3c 2f 70 3e 3c 2f 6c 69 3e 0a 3c 6c  le..</p></li>.<l
1640: 69 3e 3c 70 3e 0a 41 66 74 65 72 20 74 68 65 20  i><p>.After the 
1650: 63 61 6c 6c 20 74 6f 20 3c 62 3e 73 71 6c 69 74  call to <b>sqlit
1660: 65 5f 65 78 65 63 28 29 3c 2f 62 3e 20 72 65 74  e_exec()</b> ret
1670: 75 72 6e 73 2c 20 74 68 65 20 64 61 74 61 62 61  urns, the databa
1680: 73 65 20 66 69 6c 65 20 77 69 6c 6c 0a 73 74 69  se file will.sti
1690: 6c 6c 20 62 65 20 77 65 6c 6c 2d 66 6f 72 6d 65  ll be well-forme
16a0: 64 2e 20 20 49 74 20 6d 69 67 68 74 20 6e 6f 74  d.  It might not
16b0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 73 61 6d   contain the sam
16c0: 65 20 64 61 74 61 2c 20 62 75 74 20 69 74 20 77  e data, but it w
16d0: 69 6c 6c 0a 73 74 69 6c 6c 20 62 65 20 61 20 70  ill.still be a p
16e0: 72 6f 70 65 72 6c 79 20 63 6f 6e 73 74 72 75 63  roperly construc
16f0: 74 65 64 20 53 51 4c 69 74 65 20 64 61 74 61 62  ted SQLite datab
1700: 61 73 65 20 66 69 6c 65 2e 0a 3c 2f 70 3e 3c 2f  ase file..</p></
1710: 6c 69 3e 0a 3c 6c 69 3e 3c 70 3e 0a 4e 6f 20 70  li>.<li><p>.No p
1720: 72 65 65 78 69 73 74 69 6e 67 20 66 69 6c 65 73  reexisting files
1730: 20 6f 6e 20 74 68 65 20 68 6f 73 74 20 63 6f 6d   on the host com
1740: 70 75 74 65 72 73 20 66 69 6c 65 73 79 73 74 65  puters filesyste
1750: 6d 2c 20 6f 74 68 65 72 20 74 68 61 6e 0a 74 68  m, other than.th
1760: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1770: 69 74 73 65 6c 66 2c 20 77 69 6c 6c 20 62 65 20  itself, will be 
1780: 64 65 6c 65 74 65 64 20 6f 72 20 6d 6f 64 69 66  deleted or modif
1790: 69 65 64 2e 0a 3c 2f 70 3e 3c 2f 6c 69 3e 0a 3c  ied..</p></li>.<
17a0: 6c 69 3e 3c 70 3e 0a 46 6f 72 20 73 6f 6d 65 20  li><p>.For some 
17b0: 63 6f 6e 73 74 61 6e 74 73 20 3c 62 3e 4b 31 3c  constants <b>K1<
17c0: 2f 62 3e 20 61 6e 64 20 3c 62 3e 4b 32 3c 2f 62  /b> and <b>K2</b
17d0: 3e 2c 0a 69 66 20 61 74 20 6c 65 61 73 74 20 3c  >,.if at least <
17e0: 62 3e 4b 31 2a 73 74 72 6c 65 6e 28 5a 29 20 2b  b>K1*strlen(Z) +
17f0: 20 4b 32 3c 2f 62 3e 20 62 79 74 65 73 20 6f 66   K2</b> bytes of
1800: 20 63 6f 6e 74 69 67 75 6f 75 73 20 6d 65 6d 6f   contiguous memo
1810: 72 79 20 61 72 65 0a 61 76 61 69 6c 61 62 6c 65  ry are.available
1820: 20 74 6f 20 3c 62 3e 6d 61 6c 6c 6f 63 28 29 3c   to <b>malloc()<
1830: 2f 62 3e 2c 20 74 68 65 6e 20 74 68 65 20 63 61  /b>, then the ca
1840: 6c 6c 20 74 6f 20 3c 62 3e 73 71 6c 69 74 65 5f  ll to <b>sqlite_
1850: 65 78 65 63 28 29 3c 2f 62 3e 0a 77 69 6c 6c 20  exec()</b>.will 
1860: 6e 6f 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  not return SQLIT
1870: 45 5f 4e 4f 4d 45 4d 2e 0a 3c 2f 70 3e 3c 2f 6c  E_NOMEM..</p></l
1880: 69 3e 0a 3c 2f 6f 6c 3e 0a 3c 2f 70 3e 3c 2f 6c  i>.</ol>.</p></l
1890: 69 3e 0a 0a 3c 2f 6f 6c 3e 0a 7d 0a 70 75 74 73  i>..</ol>.}.puts
18a0: 20 7b 0a 3c 70 3e 3c 68 72 20 2f 3e 3c 2f 70 3e   {.<p><hr /></p>
18b0: 0a 3c 70 3e 3c 61 20 68 72 65 66 3d 22 69 6e 64  .<p><a href="ind
18c0: 65 78 2e 68 74 6d 6c 22 3e 3c 69 6d 67 20 73 72  ex.html"><img sr
18d0: 63 3d 22 2f 67 6f 62 61 63 6b 2e 6a 70 67 22 20  c="/goback.jpg" 
18e0: 62 6f 72 64 65 72 3d 30 20 2f 3e 0a 42 61 63 6b  border=0 />.Back
18f0: 20 74 6f 20 74 68 65 20 53 51 4c 69 74 65 20 48   to the SQLite H
1900: 6f 6d 65 20 50 61 67 65 3c 2f 61 3e 0a 3c 2f 70  ome Page</a>.</p
1910: 3e 0a 0a 3c 2f 62 6f 64 79 3e 3c 2f 68 74 6d 6c  >..</body></html
1920: 3e 7d 0a                                         >}.