/ Hex Artifact Content
Login

Artifact a679dd3e0f040d13d72b9800840e07bedd6aa2d4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2a 0a 2a 2a 20 24 49 64 3a 20 6d 61 69 6e 2e 63  *.** $Id: main.c
0270: 2c 76 20 31 2e 34 39 38 20 32 30 30 38 2f 30 39  ,v 1.498 2008/09
0280: 2f 30 32 20 31 36 3a 32 32 3a 32 39 20 64 61 6e  /02 16:22:29 dan
0290: 69 65 6c 6b 31 39 37 37 20 45 78 70 20 24 0a 2a  ielk1977 Exp $.*
02a0: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
02b0: 74 65 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64  teInt.h".#includ
02c0: 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 23 69 66  e <ctype.h>..#if
02d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
02e0: 45 5f 46 54 53 33 0a 23 20 69 6e 63 6c 75 64 65  E_FTS3.# include
02f0: 20 22 66 74 73 33 2e 68 22 0a 23 65 6e 64 69 66   "fts3.h".#endif
0300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
0310: 4e 41 42 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e  NABLE_RTREE.# in
0320: 63 6c 75 64 65 20 22 72 74 72 65 65 2e 68 22 0a  clude "rtree.h".
0330: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
0340: 65 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65  e version of the
0350: 20 6c 69 62 72 61 72 79 0a 2a 2f 0a 63 6f 6e 73   library.*/.cons
0360: 74 20 63 68 61 72 20 73 71 6c 69 74 65 33 5f 76  t char sqlite3_v
0370: 65 72 73 69 6f 6e 5b 5d 20 3d 20 53 51 4c 49 54  ersion[] = SQLIT
0380: 45 5f 56 45 52 53 49 4f 4e 3b 0a 63 6f 6e 73 74  E_VERSION;.const
0390: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 6c   char *sqlite3_l
03a0: 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29 7b  ibversion(void){
03b0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
03c0: 76 65 72 73 69 6f 6e 3b 20 7d 0a 69 6e 74 20 73  version; }.int s
03d0: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
03e0: 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64 29 7b 20  n_number(void){ 
03f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 56 45  return SQLITE_VE
0400: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b 20 7d 0a  RSION_NUMBER; }.
0410: 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65  int sqlite3_thre
0420: 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65  adsafe(void){ re
0430: 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45  turn SQLITE_THRE
0440: 41 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21  ADSAFE; }..#if !
0450: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
0460: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
0470: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
0480: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
0490: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
04a0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  ing function poi
04b0: 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  nter is not NULL
04c0: 20 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54   and if.** SQLIT
04d0: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
04e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
04f0: 6e 20 6d 65 73 73 61 67 65 73 20 64 65 73 63 72  n messages descr
0500: 69 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74  ibing.** I/O act
0510: 69 76 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ive are written 
0520: 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  using this funct
0530: 69 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73  ion.  These mess
0540: 61 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65  ages.** are inte
0550: 6e 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  nded for debuggi
0560: 6e 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79  ng activity only
0570: 2e 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c 69  ..*/.void (*sqli
0580: 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73  te3IoTrace)(cons
0590: 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20  t char*, ...) = 
05a0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
05b0: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
05c0: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
05d0: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
05e0: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
05f0: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
0600: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
0610: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
0620: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
0630: 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79  ore.** temporary
0640: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65   files..**.** Se
0650: 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47  e also the "PRAG
0660: 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  MA temp_store_di
0670: 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d  rectory" SQL com
0680: 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  mand..*/.char *s
0690: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
06a0: 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  ctory = 0;../*.*
06b0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 53 51 4c  * Initialize SQL
06c0: 69 74 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  ite.  .**.** Thi
06d0: 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
06e0: 65 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74  e called to init
06f0: 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
0700: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a  y allocation,.**
0710: 20 56 46 53 2c 20 61 6e 64 20 6d 75 74 65 78 20   VFS, and mutex 
0720: 73 75 62 73 79 73 74 65 6d 73 20 70 72 69 6f 72  subsystems prior
0730: 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 73 65   to doing any se
0740: 72 69 6f 75 73 20 77 6f 72 6b 20 77 69 74 68 0a  rious work with.
0750: 2a 2a 20 53 51 4c 69 74 65 2e 20 20 42 75 74 20  ** SQLite.  But 
0760: 61 73 20 6c 6f 6e 67 20 61 73 20 79 6f 75 20 64  as long as you d
0770: 6f 20 6e 6f 74 20 63 6f 6d 70 69 6c 65 20 77 69  o not compile wi
0780: 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  th SQLITE_OMIT_A
0790: 55 54 4f 49 4e 49 54 0a 2a 2a 20 74 68 69 73 20  UTOINIT.** this 
07a0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
07b0: 63 61 6c 6c 65 64 20 61 75 74 6f 6d 61 74 69 63  called automatic
07c0: 61 6c 6c 79 20 62 79 20 6b 65 79 20 72 6f 75 74  ally by key rout
07d0: 69 6e 65 73 20 73 75 63 68 20 61 73 0a 2a 2a 20  ines such as.** 
07e0: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 20  sqlite3_open(). 
07f0: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
0800: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
0810: 65 78 63 65 70 74 20 6f 6e 20 69 74 73 20 76 65  except on its ve
0820: 72 79 20 66 69 72 73 74 20 63 61 6c 6c 20 66 6f  ry first call fo
0830: 72 20 74 68 65 20 70 72 6f 63 65 73 73 2c 0a 2a  r the process,.*
0840: 2a 20 6f 72 20 66 6f 72 20 74 68 65 20 66 69 72  * or for the fir
0850: 73 74 20 63 61 6c 6c 20 61 66 74 65 72 20 61 20  st call after a 
0860: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
0870: 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20  shutdown..**.** 
0880: 54 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  The first thread
0890: 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 72 6f   to call this ro
08a0: 75 74 69 6e 65 20 72 75 6e 73 20 74 68 65 20 69  utine runs the i
08b0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 6f  nitialization to
08c0: 0a 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20  .** completion. 
08d0: 20 49 66 20 73 75 62 73 65 71 75 65 6e 74 20 74   If subsequent t
08e0: 68 72 65 61 64 73 20 63 61 6c 6c 20 74 68 69 73  hreads call this
08f0: 20 72 6f 75 74 69 6e 65 20 62 65 66 6f 72 65 20   routine before 
0900: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 68 72  the first.** thr
0910: 65 61 64 20 68 61 73 20 66 69 6e 69 73 68 65 64  ead has finished
0920: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0930: 69 6f 6e 20 70 72 6f 63 65 73 73 2c 20 74 68 65  ion process, the
0940: 6e 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  n the subsequent
0950: 0a 2a 2a 20 74 68 72 65 61 64 73 20 6d 75 73 74  .** threads must
0960: 20 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65   block until the
0970: 20 66 69 72 73 74 20 74 68 72 65 61 64 20 66 69   first thread fi
0980: 6e 69 73 68 65 73 20 77 69 74 68 20 74 68 65 20  nishes with the 
0990: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a  initialization..
09a0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
09b0: 74 68 72 65 61 64 20 6d 69 67 68 74 20 63 61 6c  thread might cal
09c0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
09d0: 65 63 75 72 73 69 76 65 6c 79 2e 20 20 52 65 63  ecursively.  Rec
09e0: 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 73 20  ursive.** calls 
09f0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
0a00: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 6c 6f 63 6b  should not block
0a10: 2c 20 6f 66 20 63 6f 75 72 73 65 2e 20 20 4f 74  , of course.  Ot
0a20: 68 65 72 77 69 73 65 20 74 68 65 0a 2a 2a 20 69  herwise the.** i
0a30: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72  nitialization pr
0a40: 6f 63 65 73 73 20 77 6f 75 6c 64 20 6e 65 76 65  ocess would neve
0a50: 72 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2a 0a 2a  r complete..**.*
0a60: 2a 20 4c 65 74 20 58 20 62 65 20 74 68 65 20 66  * Let X be the f
0a70: 69 72 73 74 20 74 68 72 65 61 64 20 74 6f 20 65  irst thread to e
0a80: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
0a90: 65 2e 20 20 4c 65 74 20 59 20 62 65 20 73 6f 6d  e.  Let Y be som
0aa0: 65 20 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65 61  e other.** threa
0ab0: 64 2e 20 20 54 68 65 6e 20 77 68 69 6c 65 20 74  d.  Then while t
0ac0: 68 65 20 69 6e 69 74 69 61 6c 20 69 6e 76 6f 63  he initial invoc
0ad0: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 72 6f  ation of this ro
0ae0: 75 74 69 6e 65 20 62 79 20 58 20 69 73 0a 2a 2a  utine by X is.**
0af0: 20 69 6e 63 6f 6d 70 6c 65 74 65 2c 20 69 74 20   incomplete, it 
0b00: 69 73 20 72 65 71 75 69 72 65 64 20 74 68 61 74  is required that
0b10: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 61  :.**.**    *  Ca
0b20: 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  lls to this rout
0b30: 69 6e 65 20 66 72 6f 6d 20 59 20 6d 75 73 74 20  ine from Y must 
0b40: 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20  block until the 
0b50: 6f 75 74 65 72 2d 6d 6f 73 74 0a 2a 2a 20 20 20  outer-most.**   
0b60: 20 20 20 20 63 61 6c 6c 20 62 79 20 58 20 63 6f      call by X co
0b70: 6d 70 6c 65 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  mpletes..**.**  
0b80: 20 20 2a 20 20 52 65 63 75 72 73 69 76 65 20 63    *  Recursive c
0b90: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
0ba0: 74 69 6e 65 20 66 72 6f 6d 20 74 68 72 65 61 64  tine from thread
0bb0: 20 58 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69   X return immedi
0bc0: 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 77  ately.**       w
0bd0: 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e  ithout blocking.
0be0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
0bf0: 69 6e 69 74 69 61 6c 69 7a 65 28 76 6f 69 64 29  initialize(void)
0c00: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
0c10: 78 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 20  x *pMaster;     
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61   /* The main sta
0c40: 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 69  tic mutex */.  i
0c50: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
0c80: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 23  esult code */..#
0c90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
0ca0: 54 5f 57 53 44 0a 20 20 72 63 20 3d 20 73 71 6c  T_WSD.  rc = sql
0cb0: 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30  ite3_wsd_init(40
0cc0: 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72  96, 24);.  if( r
0cd0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
0ce0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
0cf0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
0d00: 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72  If SQLite is alr
0d10: 65 61 64 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  eady completely 
0d20: 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65  initialized, the
0d30: 6e 20 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a  n this call.  **
0d40: 20 74 6f 20 73 71 6c 69 74 65 33 5f 69 6e 69 74   to sqlite3_init
0d50: 69 61 6c 69 7a 65 28 29 20 73 68 6f 75 6c 64 20  ialize() should 
0d60: 62 65 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  be a no-op.  But
0d70: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0d80: 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65  ion.  ** must be
0d90: 20 63 6f 6d 70 6c 65 74 65 2e 20 20 53 6f 20 69   complete.  So i
0da0: 73 49 6e 69 74 20 6d 75 73 74 20 6e 6f 74 20 62  sInit must not b
0db0: 65 20 73 65 74 20 75 6e 74 69 6c 20 74 68 65 20  e set until the 
0dc0: 76 65 72 79 20 65 6e 64 0a 20 20 2a 2a 20 6f 66  very end.  ** of
0dd0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20   this routine.. 
0de0: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
0df0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
0e00: 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51  Init ) return SQ
0e10: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d  LITE_OK;..  /* M
0e20: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6d 75 74  ake sure the mut
0e30: 65 78 20 73 75 62 73 79 73 74 65 6d 20 69 73 20  ex subsystem is 
0e40: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 49 66  initialized.  If
0e50: 20 75 6e 61 62 6c 65 20 74 6f 20 0a 20 20 2a 2a   unable to .  **
0e60: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
0e70: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 2c  mutex subsystem,
0e80: 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20 77 69   return early wi
0e90: 74 68 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  th the error..  
0ea0: 2a 2a 20 49 66 20 74 68 65 20 73 79 73 74 65 6d  ** If the system
0eb0: 20 69 73 20 73 6f 20 73 69 63 6b 20 74 68 61 74   is so sick that
0ec0: 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
0ed0: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 75 74  o allocate a mut
0ee0: 65 78 2c 0a 20 20 2a 2a 20 74 68 65 72 65 20 69  ex,.  ** there i
0ef0: 73 20 6e 6f 74 20 6d 75 63 68 20 53 51 4c 69 74  s not much SQLit
0f00: 65 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 62 65  e is going to be
0f10: 20 61 62 6c 65 20 74 6f 20 64 6f 2e 0a 20 20 2a   able to do..  *
0f20: 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 75 74 65 78  *.  ** The mutex
0f30: 20 73 75 62 73 79 73 74 65 6d 20 6d 75 73 74 20   subsystem must 
0f40: 74 61 6b 65 20 63 61 72 65 20 6f 66 20 73 65 72  take care of ser
0f50: 69 61 6c 69 7a 69 6e 67 20 69 74 73 20 6f 77 6e  ializing its own
0f60: 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61  .  ** initializa
0f70: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
0f80: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 49 6e  = sqlite3MutexIn
0f90: 69 74 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  it();.  if( rc )
0fa0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
0fb0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
0fc0: 20 6d 61 6c 6c 6f 63 28 29 20 73 79 73 74 65 6d   malloc() system
0fd0: 20 61 6e 64 20 74 68 65 20 72 65 63 75 72 73 69   and the recursi
0fe0: 76 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75  ve pInitMutex mu
0ff0: 74 65 78 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  tex..  ** This o
1000: 70 65 72 61 74 69 6f 6e 20 69 73 20 70 72 6f 74  peration is prot
1010: 65 63 74 65 64 20 62 79 20 74 68 65 20 53 54 41  ected by the STA
1020: 54 49 43 5f 4d 41 53 54 45 52 20 6d 75 74 65 78  TIC_MASTER mutex
1030: 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a  .  Note that.  *
1040: 2a 20 4d 75 74 65 78 41 6c 6c 6f 63 28 29 20 69  * MutexAlloc() i
1050: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 73  s called for a s
1060: 74 61 74 69 63 20 6d 75 74 65 78 20 70 72 69 6f  tatic mutex prio
1070: 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 69 6e  r to initializin
1080: 67 20 74 68 65 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  g the.  ** mallo
1090: 63 20 73 75 62 73 79 73 74 65 6d 20 2d 20 74 68  c subsystem - th
10a0: 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  is implies that 
10b0: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f  the allocation o
10c0: 66 20 61 20 73 74 61 74 69 63 0a 20 20 2a 2a 20  f a static.  ** 
10d0: 6d 75 74 65 78 20 6d 75 73 74 20 6e 6f 74 20 72  mutex must not r
10e0: 65 71 75 69 72 65 20 73 75 70 70 6f 72 74 20 66  equire support f
10f0: 72 6f 6d 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73  rom the malloc s
1100: 75 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20  ubsystem..  */. 
1110: 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
1120: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
1130: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
1140: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69  _MASTER);.  sqli
1150: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1160: 70 4d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20  pMaster);.  if( 
1170: 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  !sqlite3GlobalCo
1180: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
1190: 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  t ){.    rc = sq
11a0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28  lite3MallocInit(
11b0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
11c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
11e0: 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e  onfig.isMallocIn
11f0: 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  it = 1;.    if( 
1200: 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  !sqlite3GlobalCo
1210: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20  nfig.pInitMutex 
1220: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1230: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1240: 69 74 4d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  itMutex = sqlite
1250: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
1260: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
1270: 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  VE);.      if( s
1280: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1290: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 26 26  ig.bCoreMutex &&
12a0: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
12b0: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
12c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
12d0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
12e0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
12f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1300: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1310: 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ex++;.  }.  sqli
1320: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1330: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
1340: 49 66 20 75 6e 61 62 6c 65 20 74 6f 20 69 6e 69  If unable to ini
1350: 74 69 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c  tialize the mall
1360: 6f 63 20 73 75 62 73 79 73 74 65 6d 2c 20 74 68  oc subsystem, th
1370: 65 6e 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e  en return early.
1380: 0a 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20 6c  .  ** There is l
1390: 69 74 74 6c 65 20 68 6f 70 65 20 6f 66 20 67 65  ittle hope of ge
13a0: 74 74 69 6e 67 20 53 51 4c 69 74 65 20 74 6f 20  tting SQLite to 
13b0: 72 75 6e 20 69 66 20 74 68 65 20 6d 61 6c 6c 6f  run if the mallo
13c0: 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d  c.  ** subsystem
13d0: 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e 69 74 69   cannot be initi
13e0: 61 6c 69 7a 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  alized..  */.  i
13f0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1400: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
1410: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20  c;.  }..  /* Do 
1420: 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 65 20  the rest of the 
1430: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75  initialization u
1440: 6e 64 65 72 20 74 68 65 20 72 65 63 75 72 73 69  nder the recursi
1450: 76 65 20 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a  ve mutex so.  **
1460: 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 62 65   that we will be
1470: 20 61 62 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20   able to handle 
1480: 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20  recursive calls 
1490: 69 6e 74 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65  into.  ** sqlite
14a0: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20  3_initialize(). 
14b0: 20 54 68 65 20 72 65 63 75 72 73 69 76 65 20 63   The recursive c
14c0: 61 6c 6c 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f  alls normally co
14d0: 6d 65 20 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20  me through.  ** 
14e0: 73 71 6c 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28  sqlite3_os_init(
14f0: 29 20 77 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65  ) when it invoke
1500: 73 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65  s sqlite3_vfs_re
1510: 67 69 73 74 65 72 28 29 2c 20 62 75 74 20 6f 74  gister(), but ot
1520: 68 65 72 0a 20 20 2a 2a 20 72 65 63 75 72 73 69  her.  ** recursi
1530: 76 65 20 63 61 6c 6c 73 20 6d 69 67 68 74 20 61  ve calls might a
1540: 6c 73 6f 20 62 65 20 70 6f 73 73 69 62 6c 65 2e  lso be possible.
1550: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  .  */.  sqlite3_
1560: 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69  mutex_enter(sqli
1570: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1580: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 69  pInitMutex);.  i
1590: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
15a0: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30  Config.isInit==0
15b0: 20 26 26 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   && sqlite3Globa
15c0: 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65  lConfig.inProgre
15d0: 73 73 3d 3d 30 20 29 7b 0a 20 20 20 20 46 75 6e  ss==0 ){.    Fun
15e0: 63 44 65 66 48 61 73 68 20 2a 70 48 61 73 68 20  cDefHash *pHash 
15f0: 3d 20 26 47 4c 4f 42 41 4c 28 46 75 6e 63 44 65  = &GLOBAL(FuncDe
1600: 66 48 61 73 68 2c 20 73 71 6c 69 74 65 33 47 6c  fHash, sqlite3Gl
1610: 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29 3b 0a  obalFunctions);.
1620: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1630: 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65  lConfig.inProgre
1640: 73 73 20 3d 20 31 3b 0a 20 20 20 20 6d 65 6d 73  ss = 1;.    mems
1650: 65 74 28 70 48 61 73 68 2c 20 30 2c 20 73 69 7a  et(pHash, 0, siz
1660: 65 6f 66 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  eof(sqlite3Globa
1670: 6c 46 75 6e 63 74 69 6f 6e 73 29 29 3b 0a 20 20  lFunctions));.  
1680: 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65    sqlite3Registe
1690: 72 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  rGlobalFunctions
16a0: 28 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ();.    rc = sql
16b0: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 3b 0a  ite3_os_init();.
16c0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
16d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
16e0: 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
16f0: 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  eInitialize();. 
1700: 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63       sqlite3PCac
1710: 68 65 42 75 66 66 65 72 53 65 74 75 70 28 20 73  heBufferSetup( s
1720: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1730: 69 67 2e 70 50 61 67 65 2c 20 0a 20 20 20 20 20  ig.pPage, .     
1740: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1750: 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 2c  alConfig.szPage,
1760: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1770: 6e 66 69 67 2e 6e 50 61 67 65 29 3b 0a 20 20 20  nfig.nPage);.   
1780: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c   }.    sqlite3Gl
1790: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
17a0: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 73  gress = 0;.    s
17b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
17c0: 69 67 2e 69 73 49 6e 69 74 20 3d 20 28 72 63 3d  ig.isInit = (rc=
17d0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 3f 20 31 20 3a  =SQLITE_OK ? 1 :
17e0: 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
17f0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
1800: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1810: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
1820: 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e  .  /* Go back un
1830: 64 65 72 20 74 68 65 20 73 74 61 74 69 63 20 6d  der the static m
1840: 75 74 65 78 20 61 6e 64 20 63 6c 65 61 6e 20 75  utex and clean u
1850: 70 20 74 68 65 20 72 65 63 75 72 73 69 76 65 0a  p the recursive.
1860: 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70 72    ** mutex to pr
1870: 65 76 65 6e 74 20 61 20 72 65 73 6f 75 72 63 65  event a resource
1880: 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71   leak..  */.  sq
1890: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
18a0: 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73 71  r(pMaster);.  sq
18b0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
18c0: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2d  g.nRefInitMutex-
18d0: 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  -;.  if( sqlite3
18e0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65  GlobalConfig.nRe
18f0: 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b  fInitMutex<=0 ){
1900: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1910: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1920: 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d  .nRefInitMutex==
1930: 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 );.    sqlite3
1940: 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c 69  _mutex_free(sqli
1950: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1960: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20 20  pInitMutex);.   
1970: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1980: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20  nfig.pInitMutex 
1990: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
19a0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 70  e3_mutex_leave(p
19b0: 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54  Master);..  /* T
19c0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20  he following is 
19d0: 6a 75 73 74 20 61 20 73 61 6e 69 74 79 20 63 68  just a sanity ch
19e0: 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  eck to make sure
19f0: 20 53 51 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a   SQLite has.  **
1a00: 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63   been compiled c
1a10: 6f 72 72 65 63 74 6c 79 2e 20 20 49 74 20 69 73  orrectly.  It is
1a20: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72 75   important to ru
1a30: 6e 20 74 68 69 73 20 63 6f 64 65 2c 20 62 75 74  n this code, but
1a40: 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77  .  ** we don't w
1a50: 61 6e 74 20 74 6f 20 72 75 6e 20 69 74 20 74 6f  ant to run it to
1a60: 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b  o often and soak
1a70: 20 75 70 20 43 50 55 20 63 79 63 6c 65 73 20 66   up CPU cycles f
1a80: 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f  or no.  ** reaso
1a90: 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e 20 69 74  n.  So we run it
1aa0: 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 69 6e 69   once during ini
1ab0: 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a  tialization..  *
1ac0: 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1ad0: 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69  .  /* This secti
1ae0: 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c  on of code's onl
1af0: 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76 69  y "output" is vi
1b00: 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  a assert() state
1b10: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28  ments. */.  if (
1b20: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b30: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
1b40: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
1b50: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
1b60: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
1b70: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
1b80: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
1b90: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
1ba0: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
1bb0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
1bc0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
1bd0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65    }.#endif..  re
1be0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1bf0: 2a 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63  * Undo the effec
1c00: 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e  ts of sqlite3_in
1c10: 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73  itialize().  Mus
1c20: 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  t not be called 
1c30: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61  while.** there a
1c40: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  re outstanding d
1c50: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1c60: 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c  ons or memory al
1c70: 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20  locations or.** 
1c80: 77 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f  while any part o
1c90: 66 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65  f SQLite is othe
1ca0: 72 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20  rwise in use in 
1cb0: 61 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69  any thread.  Thi
1cc0: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
1cd0: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20  not threadsafe. 
1ce0: 20 4e 6f 74 20 62 79 20 61 20 6c 6f 6e 67 20 73   Not by a long s
1cf0: 68 6f 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  hot..*/.int sqli
1d00: 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f 69  te3_shutdown(voi
1d10: 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f  d){.  sqlite3Glo
1d20: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c  balConfig.isMall
1d30: 6f 63 49 6e 69 74 20 3d 20 30 3b 0a 20 20 73 71  ocInit = 0;.  sq
1d40: 6c 69 74 65 33 50 63 61 63 68 65 53 68 75 74 64  lite3PcacheShutd
1d50: 6f 77 6e 28 29 3b 0a 20 20 69 66 28 20 73 71 6c  own();.  if( sql
1d60: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1d70: 2e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  .isInit ){.    s
1d80: 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64 28 29 3b  qlite3_os_end();
1d90: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1da0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
1db0: 2e 78 53 68 75 74 64 6f 77 6e 20 29 7b 0a 20 20  .xShutdown ){.  
1dc0: 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 45    sqlite3MallocE
1dd0: 6e 64 28 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  nd();.  }.  if( 
1de0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1df0: 66 69 67 2e 6d 75 74 65 78 2e 78 4d 75 74 65 78  fig.mutex.xMutex
1e00: 45 6e 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  End ){.    sqlit
1e10: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
1e20: 7d 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  }.  sqlite3Globa
1e30: 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d  lConfig.isInit =
1e40: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   0;.  return SQL
1e50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
1e60: 20 54 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73   This API allows
1e70: 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f   applications to
1e80: 20 6d 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62   modify the glob
1e90: 61 6c 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e  al configuration
1ea0: 20 6f 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74   of.** the SQLit
1eb0: 65 20 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e  e library at run
1ec0: 2d 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  -time..**.** Thi
1ed0: 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
1ee0: 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20   only be called 
1ef0: 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e  when there are n
1f00: 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a  o outstanding.**
1f10: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1f20: 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20  tions or memory 
1f30: 61 6c 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68  allocations.  Th
1f40: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
1f50: 74 0a 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e  t.** threadsafe.
1f60: 20 20 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65    Failure to hee
1f70: 64 20 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73  d these warnings
1f80: 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70   can lead to unp
1f90: 72 65 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65  redictable.** be
1fa0: 68 61 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73  havior..*/.int s
1fb0: 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e  qlite3_config(in
1fc0: 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  t op, ...){.  va
1fd0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20  _list ap;.  int 
1fe0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1ff0: 0a 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f  .  /* sqlite3_co
2000: 6e 66 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74  nfig() shall ret
2010: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
2020: 45 20 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b  E if it is invok
2030: 65 64 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68  ed while.  ** th
2040: 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79  e SQLite library
2050: 20 69 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20   is in use. */. 
2060: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
2070: 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20  alConfig.isInit 
2080: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2090: 4d 49 53 55 53 45 3b 0a 0a 20 20 76 61 5f 73 74  MISUSE;..  va_st
20a0: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
20b0: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
20c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
20d0: 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44  FIG_SINGLETHREAD
20e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73  : {.      /* Dis
20f0: 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e  able all mutexin
2100: 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  g */.      sqlit
2110: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2120: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 0a 20  CoreMutex = 0;. 
2130: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2140: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
2150: 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  tex = 0;.      b
2160: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2170: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2180: 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20  IG_MULTITHREAD: 
2190: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62  {.      /* Disab
21a0: 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 64  le mutexing of d
21b0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
21c0: 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ons */.      /* 
21d0: 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20  Enable mutexing 
21e0: 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73 74 72  of core data str
21f0: 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 20  uctures */.     
2200: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2210: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2220: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
2230: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2240: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20  FullMutex = 0;. 
2250: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2260: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2270: 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49  E_CONFIG_SERIALI
2280: 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ZED: {.      /* 
2290: 45 6e 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78  Enable all mutex
22a0: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ing */.      sql
22b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
22c0: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
22d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
22e0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
22f0: 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Mutex = 1;.     
2300: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2310: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2320: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  NFIG_MALLOC: {. 
2330: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
2340: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
2350: 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61  alloc implementa
2360: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
2370: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2380: 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  g.m = *va_arg(ap
2390: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
23a0: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
23b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
23c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
23d0: 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a  IG_GETMALLOC: {.
23e0: 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76        /* Retriev
23f0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  e the current ma
2400: 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74  lloc() implement
2410: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
2420: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
2430: 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63  Config.m.xMalloc
2440: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d 65 6d  ==0 ) sqlite3Mem
2450: 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20  SetDefault();.  
2460: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
2470: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
2480: 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ods*) = sqlite3G
2490: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20  lobalConfig.m;. 
24a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24b0: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
24c0: 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20  E_CONFIG_MUTEX: 
24d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69  {.      /* Speci
24e0: 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  fy an alternativ
24f0: 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e  e mutex implemen
2500: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
2510: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2520: 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f  fig.mutex = *va_
2530: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
2540: 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b  mutex_methods*);
2550: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2560: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2570: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55  ITE_CONFIG_GETMU
2580: 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  TEX: {.      /* 
2590: 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75 72  Retrieve the cur
25a0: 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65  rent mutex imple
25b0: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
25c0: 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73     *va_arg(ap, s
25d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74  qlite3_mutex_met
25e0: 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33  hods*) = sqlite3
25f0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74  GlobalConfig.mut
2600: 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ex;.      break;
2610: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
2620: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45  SQLITE_CONFIG_ME
2630: 4d 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20  MSTATUS: {.     
2640: 20 2f 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69   /* Enable or di
2650: 73 61 62 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63  sable the malloc
2660: 20 73 74 61 74 75 73 20 63 6f 6c 6c 65 63 74 69   status collecti
2670: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
2680: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2690: 62 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72  bMemstat = va_ar
26a0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
26b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
26c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
26d0: 4f 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b  ONFIG_SCRATCH: {
26e0: 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e  .      /* Design
26f0: 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72  ate a buffer for
2700: 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
2710: 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73  space */.      s
2720: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2730: 69 67 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61  ig.pScratch = va
2740: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
2750: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2760: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72  obalConfig.szScr
2770: 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  atch = va_arg(ap
2780: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
2790: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
27a0: 67 2e 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f  g.nScratch = va_
27b0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
27c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
27d0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
27e0: 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48  _CONFIG_PAGECACH
27f0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65  E: {.      /* De
2800: 73 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72  signate a buffer
2810: 20 66 6f 72 20 73 63 72 61 74 63 68 20 6d 65 6d   for scratch mem
2820: 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ory space */.   
2830: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2840: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
2850: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
2860: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
2870: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
2880: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
2890: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
28a0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
28b0: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
28c0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
28d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
28e0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
28f0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20  ENABLE_MEMSYS3) 
2900: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
2910: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
2920: 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
2930: 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b  E_CONFIG_HEAP: {
2940: 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e  .      /* Design
2950: 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72  ate a buffer for
2960: 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 73 70 61   heap memory spa
2970: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
2980: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2990: 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  pHeap = va_arg(a
29a0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
29b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
29c0: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
29d0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
29e0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
29f0: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
2a00: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
2a10: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
2a20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2a30: 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  pHeap==0 ){.    
2a40: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 65      /* If the he
2a50: 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 4e 55  ap pointer is NU
2a60: 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65  LL, then restore
2a70: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c   the malloc impl
2a80: 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20  ementation.     
2a90: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55     ** back to NU
2aa0: 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e  LL pointers too.
2ab0: 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
2ac0: 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20  e the malloc to 
2ad0: 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61  go.        ** ba
2ae0: 63 6b 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c  ck to its defaul
2af0: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
2b00: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e   when sqlite3_in
2b10: 69 74 69 61 6c 69 7a 65 28 29 20 69 73 0a 20 20  itialize() is.  
2b20: 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20        ** run..  
2b30: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2b40: 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33   memset(&sqlite3
2b50: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20  GlobalConfig.m, 
2b60: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
2b70: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29  3GlobalConfig.m)
2b80: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 68          /* The h
2ba0: 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 6e  eap pointer is n
2bb0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e  ot NULL, then in
2bc0: 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74 68 65  stall one of the
2bd0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 35  .        ** mem5
2be0: 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68 6f 64  .c/mem3.c method
2bf0: 73 2e 20 49 66 20 6e 65 69 74 68 65 72 20 45 4e  s. If neither EN
2c00: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6e 6f 72  ABLE_MEMSYS3 nor
2c10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 4e 41 42  .        ** ENAB
2c20: 4c 45 5f 4d 45 4d 53 59 53 35 20 69 73 20 64 65  LE_MEMSYS5 is de
2c30: 66 69 6e 65 64 2c 20 72 65 74 75 72 6e 20 61 6e  fined, return an
2c40: 20 65 72 72 6f 72 2e 0a 20 20 20 20 20 20 20 20   error..        
2c50: 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  ** the default c
2c60: 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ase and return a
2c70: 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 20 20 20  n error..       
2c80: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2c90: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
2ca0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2cb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
2cc0: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d   *sqlite3MemGetM
2cd0: 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e 64 69 66  emsys3();.#endif
2ce0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
2cf0: 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20  NABLE_MEMSYS5.  
2d00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2d10: 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73  balConfig.m = *s
2d20: 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73  qlite3MemGetMems
2d30: 79 73 35 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ys5();.#endif.  
2d40: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
2d50: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
2d60: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
2d70: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
2d80: 53 36 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c  S6).    case SQL
2d90: 49 54 45 5f 43 4f 4e 46 49 47 5f 43 48 55 4e 4b  ITE_CONFIG_CHUNK
2da0: 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 73  ALLOC: {.      s
2db0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2dc0: 69 67 2e 6e 53 6d 61 6c 6c 20 3d 20 76 61 5f 61  ig.nSmall = va_a
2dd0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
2de0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2df0: 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69  Config.m = *sqli
2e00: 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 36  te3MemGetMemsys6
2e10: 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
2e20: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
2e30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2e40: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
2e50: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
2e60: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c  GlobalConfig.szL
2e70: 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72  ookaside = va_ar
2e80: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
2e90: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2ea0: 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65  onfig.nLookaside
2eb0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
2ec0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
2ed0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 66 61  .    }..    defa
2ee0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  ult: {.      rc 
2ef0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
2f00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2f10: 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28   }.  }.  va_end(
2f20: 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ap);.  return rc
2f30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 75  ;.}../*.** Set u
2f40: 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20  p the lookaside 
2f50: 62 75 66 66 65 72 73 20 66 6f 72 20 61 20 64 61  buffers for a da
2f60: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2f70: 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  n..** Return SQL
2f80: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
2f90: 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f 6b 61  s.  .** If looka
2fa0: 73 69 64 65 20 69 73 20 61 6c 72 65 61 64 79 20  side is already 
2fb0: 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e 20 53  active, return S
2fc0: 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a 0a 2a  QLITE_BUSY..**.*
2fd0: 2a 20 54 68 65 20 73 7a 20 70 61 72 61 6d 65 74  * The sz paramet
2fe0: 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  er is the number
2ff0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 65 61 63   of bytes in eac
3000: 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  h lookaside slot
3010: 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70 61 72  ..** The cnt par
3020: 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e 75  ameter is the nu
3030: 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e 20 20  mber of slots.  
3040: 49 66 20 70 53 74 61 72 74 20 69 73 20 4e 55 4c  If pStart is NUL
3050: 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65 20 66  L the.** space f
3060: 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65  or the lookaside
3070: 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74 61 69   memory is obtai
3080: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
3090: 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 49 66  _malloc()..** If
30a0: 20 70 53 74 61 72 74 20 69 73 20 6e 6f 74 20 4e   pStart is not N
30b0: 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73 20 73  ULL then it is s
30c0: 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f 66 20 6d  z*cnt bytes of m
30d0: 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 66 6f 72  emory to use for
30e0: 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64  .** the lookasid
30f0: 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61  e memory..*/.sta
3100: 74 69 63 20 69 6e 74 20 73 65 74 75 70 4c 6f 6f  tic int setupLoo
3110: 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33 20 2a  kaside(sqlite3 *
3120: 64 62 2c 20 76 6f 69 64 20 2a 70 42 75 66 2c 20  db, void *pBuf, 
3130: 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e 74 29  int sz, int cnt)
3140: 7b 0a 20 20 76 6f 69 64 20 2a 70 53 74 61 72 74  {.  void *pStart
3150: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  ;.  if( db->look
3160: 61 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a 20 20  aside.nOut ){.  
3170: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3180: 42 55 53 59 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BUSY;.  }.  if( 
3190: 73 7a 3c 30 20 29 20 73 7a 20 3d 20 30 3b 0a 20  sz<0 ) sz = 0;. 
31a0: 20 69 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74   if( cnt<0 ) cnt
31b0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 42 75 66   = 0;.  if( pBuf
31c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20  ==0 ){.    sz = 
31d0: 28 73 7a 20 2b 20 37 29 26 7e 37 3b 0a 20 20 20  (sz + 7)&~7;.   
31e0: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
31f0: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
3200: 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   pStart = sqlite
3210: 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20  3Malloc( sz*cnt 
3220: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
3230: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
3240: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 7a  .  }else{.    sz
3250: 20 3d 20 73 7a 26 7e 37 3b 0a 20 20 20 20 70 53   = sz&~7;.    pS
3260: 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d  tart = pBuf;.  }
3270: 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61  .  if( db->looka
3280: 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29  side.bMalloced )
3290: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
32a0: 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  ee(db->lookaside
32b0: 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20  .pStart);.  }.  
32c0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
32d0: 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20  tart = pStart;. 
32e0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
32f0: 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Free = 0;.  db->
3300: 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 73  lookaside.sz = s
3310: 7a 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  z;.  db->lookasi
3320: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 70  de.bMalloced = p
3330: 42 75 66 3d 3d 30 3b 0a 20 20 69 66 28 20 70 53  Buf==0;.  if( pS
3340: 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tart ){.    int 
3350: 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  i;.    Lookaside
3360: 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 70 20 3d  Slot *p;.    p =
3370: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
3380: 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72  )pStart;.    for
3390: 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20  (i=cnt-1; i>=0; 
33a0: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  i--){.      p->p
33b0: 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  Next = db->looka
33c0: 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20 20  side.pFree;.    
33d0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
33e0: 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20  pFree = p;.     
33f0: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
3400: 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73  lot*)&((u8*)p)[s
3410: 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  z];.    }.    db
3420: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
3430: 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = p;.    db->lo
3440: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
3450: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
3460: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
3470: 2e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 64  .pEnd = 0;.    d
3480: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
3490: 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  abled = 0;.  }. 
34a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
34b0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  K;.}../*.** Conf
34c0: 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e  iguration settin
34d0: 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69  gs for an indivi
34e0: 64 75 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f  dual database co
34f0: 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20  nnection.*/.int 
3500: 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
3510: 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  g(sqlite3 *db, i
3520: 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76  nt op, ...){.  v
3530: 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74  a_list ap;.  int
3540: 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   rc;.  va_start(
3550: 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63  ap, op);.  switc
3560: 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  h( op ){.    cas
3570: 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  e SQLITE_DBCONFI
3580: 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20  G_LOOKASIDE: {. 
3590: 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75 66 20       void *pBuf 
35a0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
35b0: 64 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  d*);.      int s
35c0: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
35d0: 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 63  nt);.      int c
35e0: 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  nt = va_arg(ap, 
35f0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  int);.      rc =
3600: 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28   setupLookaside(
3610: 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e  db, pBuf, sz, cn
3620: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
3630: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
3640: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  lt: {.      rc =
3650: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
3660: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3670: 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  }.  }.  va_end(a
3680: 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  p);.  return rc;
3690: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 75 74 69 6e  .}../*.** Routin
36a0: 65 20 6e 65 65 64 65 64 20 74 6f 20 73 75 70 70  e needed to supp
36b0: 6f 72 74 20 74 68 65 20 74 65 73 74 63 61 73 65  ort the testcase
36c0: 28 29 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 69 66  () macro..*/.#if
36d0: 64 65 66 20 53 51 4c 49 54 45 5f 43 4f 56 45 52  def SQLITE_COVER
36e0: 41 47 45 5f 54 45 53 54 0a 76 6f 69 64 20 73 71  AGE_TEST.void sq
36f0: 6c 69 74 65 33 43 6f 76 65 72 61 67 65 28 69 6e  lite3Coverage(in
3700: 74 20 78 29 7b 0a 20 20 73 74 61 74 69 63 20 69  t x){.  static i
3710: 6e 74 20 64 75 6d 6d 79 20 3d 20 30 3b 0a 20 20  nt dummy = 0;.  
3720: 64 75 6d 6d 79 20 2b 3d 20 78 3b 0a 7d 0a 23 65  dummy += x;.}.#e
3730: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ndif.../*.** Ret
3740: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
3750: 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31 5d  buffer z[0..n-1]
3760: 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73 70   contains all sp
3770: 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aces..*/.static 
3780: 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63 6f  int allSpaces(co
3790: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
37a0: 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e 3e   n){.  while( n>
37b0: 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20 27  0 && z[n-1]==' '
37c0: 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65 74   ){ n--; }.  ret
37d0: 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  urn n==0;.}../*.
37e0: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 64  ** This is the d
37f0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e 67  efault collating
3800: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64 20   function named 
3810: 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20 69  "BINARY" which i
3820: 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61 69  s always.** avai
3830: 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lable..**.** If 
3840: 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67 75  the padFlag argu
3850: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  ment is not NULL
3860: 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64 64   then space padd
3870: 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a 2a  ing at the end.*
3880: 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73 20  * of strings is 
3890: 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69  ignored.  This i
38a0: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52 54  mplements the RT
38b0: 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a  RIM collation..*
38c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69 6e  /.static int bin
38d0: 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69 64  CollFunc(.  void
38e0: 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e 74   *padFlag,.  int
38f0: 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f   nKey1, const vo
3900: 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74  id *pKey1,.  int
3910: 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f   nKey2, const vo
3920: 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69  id *pKey2.){.  i
3930: 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d 20  nt rc, n;.  n = 
3940: 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e 4b  nKey1<nKey2 ? nK
3950: 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20 72  ey1 : nKey2;.  r
3960: 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79 31  c = memcmp(pKey1
3970: 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20 69  , pKey2, n);.  i
3980: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
3990: 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20 20  if( padFlag.    
39a0: 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28   && allSpaces(((
39b0: 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c 20  char*)pKey1)+n, 
39c0: 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26 26  nKey1-n).     &&
39d0: 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61   allSpaces(((cha
39e0: 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b 65  r*)pKey2)+n, nKe
39f0: 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20 20  y2-n).    ){.   
3a00: 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 20 75     /* Leave rc u
3a10: 6e 63 68 61 6e 67 65 64 20 61 74 20 30 20 2a 2f  nchanged at 0 */
3a20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3a30: 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20 6e    rc = nKey1 - n
3a40: 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Key2;.    }.  }.
3a50: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
3a60: 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62 75  /*.** Another bu
3a70: 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67  ilt-in collating
3a80: 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41 53   sequence: NOCAS
3a90: 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63  E. .**.** This c
3aa0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
3ab0: 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74 6f  e is intended to
3ac0: 20 62 65 20 75 73 65 64 20 66 6f 72 20 22 63 61   be used for "ca
3ad0: 73 65 20 69 6e 64 65 70 65 6e 64 61 6e 74 0a 2a  se independant.*
3ae0: 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20 53  * comparison". S
3af0: 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64 67  QLite's knowledg
3b00: 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20 6c  e of upper and l
3b10: 6f 77 65 72 20 63 61 73 65 20 65 71 75 69 76 61  ower case equiva
3b20: 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64 73  lents.** extends
3b30: 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36 20   only to the 26 
3b40: 63 68 61 72 61 63 74 65 72 73 20 75 73 65 64 20  characters used 
3b50: 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20 6c  in the English l
3b60: 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41  anguage..**.** A
3b70: 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68 65  t the moment the
3b80: 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54 46  re is only a UTF
3b90: 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  -8 implementatio
3ba0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
3bb0: 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67   nocaseCollating
3bc0: 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e 6f  Func(.  void *No
3bd0: 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b 65  tUsed,.  int nKe
3be0: 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y1, const void *
3bf0: 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65  pKey1,.  int nKe
3c00: 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  y2, const void *
3c10: 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72  pKey2.){.  int r
3c20: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43   = sqlite3StrNIC
3c30: 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73 74  mp(.      (const
3c40: 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20 28   char *)pKey1, (
3c50: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
3c60: 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79 32  y2, (nKey1<nKey2
3c70: 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b 0a  )?nKey1:nKey2);.
3c80: 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20    if( 0==r ){.  
3c90: 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79    r = nKey1-nKey
3ca0: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
3cb0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  r;.}../*.** Retu
3cc0: 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20  rn the ROWID of 
3cd0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
3ce0: 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65  insert.*/.sqlite
3cf0: 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c  _int64 sqlite3_l
3d00: 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64  ast_insert_rowid
3d10: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
3d20: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74   return db->last
3d30: 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Rowid;.}../*.** 
3d40: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
3d50: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20  r of changes in 
3d60: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
3d70: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
3d80: 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  exec()..*/.int s
3d90: 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28 73  qlite3_changes(s
3da0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
3db0: 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67  eturn db->nChang
3dc0: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
3dd0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
3de0: 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74   changes since t
3df0: 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
3e00: 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a  le was opened..*
3e10: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f  /.int sqlite3_to
3e20: 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69  tal_changes(sqli
3e30: 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75  te3 *db){.  retu
3e40: 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61  rn db->nTotalCha
3e50: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  nge;.}../*.** Cl
3e60: 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  ose an existing 
3e70: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 0a  SQLite database.
3e80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
3e90: 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lose(sqlite3 *db
3ea0: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
3eb0: 3b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 69 66  ;.  int j;..  if
3ec0: 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74  ( !db ){.    ret
3ed0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
3ee0: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
3ef0: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
3f00: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
3f10: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
3f20: 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  SUSE;.  }.  sqli
3f30: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
3f40: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a 23 69 66  db->mutex);..#if
3f50: 64 65 66 20 53 51 4c 49 54 45 5f 53 53 45 0a 20  def SQLITE_SSE. 
3f60: 20 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f   {.    extern vo
3f70: 69 64 20 73 71 6c 69 74 65 33 53 73 65 43 6c 65  id sqlite3SseCle
3f80: 61 6e 75 70 28 73 71 6c 69 74 65 33 2a 29 3b 0a  anup(sqlite3*);.
3f90: 20 20 20 20 73 71 6c 69 74 65 33 53 73 65 43 6c      sqlite3SseCl
3fa0: 65 61 6e 75 70 28 64 62 29 3b 0a 20 20 7d 0a 23  eanup(db);.  }.#
3fb0: 65 6e 64 69 66 20 0a 0a 20 20 73 71 6c 69 74 65  endif ..  sqlite
3fc0: 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63  3ResetInternalSc
3fd0: 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 0a 20 20  hema(db, 0);..  
3fe0: 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  /* If a transact
3ff0: 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68 65  ion is open, the
4000: 20 52 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63   ResetInternalSc
4010: 68 65 6d 61 28 29 20 63 61 6c 6c 20 61 62 6f 76  hema() call abov
4020: 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
4030: 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20  have called the 
4040: 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65  xDisconnect() me
4050: 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74  thod on any virt
4060: 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20  ual.  ** tables 
4070: 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61  in the db->aVTra
4080: 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20  ns[] array. The 
4090: 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
40a0: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a  3VtabRollback().
40b0: 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64    ** call will d
40c0: 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f  o so. We need to
40d0: 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   do this before 
40e0: 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63  the check for ac
40f0: 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74  tive.  ** SQL st
4100: 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20  atements below, 
4110: 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69  as the v-table i
4120: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61  mplementation ma
4130: 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a  y be storing.  *
4140: 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20  * some prepared 
4150: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72  statements inter
4160: 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  nally..  */.  sq
4170: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
4180: 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  k(db);..  /* If 
4190: 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75  there are any ou
41a0: 74 73 74 61 6e 64 69 6e 67 20 56 4d 73 2c 20 72  tstanding VMs, r
41b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
41c0: 59 2e 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  Y. */.  if( db->
41d0: 70 56 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c  pVdbe ){.    sql
41e0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
41f0: 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20  LITE_BUSY, .    
4200: 20 20 20 20 22 55 6e 61 62 6c 65 20 74 6f 20 63      "Unable to c
4210: 6c 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69  lose due to unfi
4220: 6e 61 6c 69 73 65 64 20 73 74 61 74 65 6d 65 6e  nalised statemen
4230: 74 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ts");.    sqlite
4240: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
4250: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65  ->mutex);.    re
4260: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
4270: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
4280: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
4290: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
42a0: 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  ;..  for(j=0; j<
42b0: 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20  db->nDb; j++){. 
42c0: 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70 44     struct Db *pD
42d0: 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b  b = &db->aDb[j];
42e0: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
42f0: 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t ){.      sqlit
4300: 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44 62  e3BtreeClose(pDb
4310: 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70 44  ->pBt);.      pD
4320: 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20 20  b->pBt = 0;.    
4330: 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20 20    if( j!=1 ){.  
4340: 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68 65        pDb->pSche
4350: 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  ma = 0;.      }.
4360: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
4370: 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61 6c  te3ResetInternal
4380: 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a 20  Schema(db, 0);. 
4390: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62   assert( db->nDb
43a0: 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  <=2 );.  assert(
43b0: 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44   db->aDb==db->aD
43c0: 62 53 74 61 74 69 63 20 29 3b 0a 20 20 66 6f 72  bStatic );.  for
43d0: 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a  (j=0; j<ArraySiz
43e0: 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20  e(db->aFunc.a); 
43f0: 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  j++){.    FuncDe
4400: 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68  f *pNext, *pHash
4410: 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  , *p;.    for(p=
4420: 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20  db->aFunc.a[j]; 
4430: 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20  p; p=pHash){.   
4440: 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48     pHash = p->pH
4450: 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ash;.      while
4460: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ( p ){.        p
4470: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
4480: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
4490: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
44a0: 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74         p = pNext
44b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
44c0: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69    }.  for(i=sqli
44d0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
44e0: 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69  >aCollSeq); i; i
44f0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
4500: 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  i)){.    CollSeq
4510: 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53   *pColl = (CollS
4520: 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  eq *)sqliteHashD
4530: 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49  ata(i);.    /* I
4540: 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75  nvoke any destru
4550: 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64  ctors registered
4560: 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   for collation s
4570: 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74  equence user dat
4580: 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d  a. */.    for(j=
4590: 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
45a0: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d      if( pColl[j]
45b0: 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  .xDel ){.       
45c0: 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70   pColl[j].xDel(p
45d0: 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a  Coll[j].pUser);.
45e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
45f0: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
4600: 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  db, pColl);.  }.
4610: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
4620: 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  ar(&db->aCollSeq
4630: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
4640: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
4650: 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  BLE.  for(i=sqli
4660: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
4670: 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d  >aModule); i; i=
4680: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
4690: 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a  )){.    Module *
46a0: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a  pMod = (Module *
46b0: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
46c0: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64  i);.    if( pMod
46d0: 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ->xDestroy ){.  
46e0: 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72      pMod->xDestr
46f0: 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a  oy(pMod->pAux);.
4700: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
4710: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64  3DbFree(db, pMod
4720: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
4730: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
4740: 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  Module);.#endif.
4750: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
4760: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
4770: 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65  ); /* Deallocate
4780: 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72 72  s any cached err
4790: 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20  or strings. */. 
47a0: 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b   if( db->pErr ){
47b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75  .    sqlite3Valu
47c0: 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b  eFree(db->pErr);
47d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 6c  .  }.  sqlite3Cl
47e0: 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62  oseExtensions(db
47f0: 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  );..  db->magic 
4800: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45  = SQLITE_MAGIC_E
4810: 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  RROR;..  /* The 
4820: 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63  temp-database sc
4830: 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65  hema is allocate
4840: 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72  d differently fr
4850: 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68  om the other sch
4860: 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73  ema.  ** objects
4870: 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61   (using sqliteMa
4880: 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c  lloc() directly,
4890: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69   instead of sqli
48a0: 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29  te3BtreeSchema()
48b0: 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65  )..  ** So it ne
48c0: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
48d0: 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20  here. Todo: Why 
48e0: 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d  not roll the tem
48f0: 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20  p schema into.  
4900: 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69  ** the same sqli
4910: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68  teMalloc() as th
4920: 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63  e one that alloc
4930: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
4940: 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  e .  ** structur
4950: 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e?.  */.  sqlite
4960: 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e  3DbFree(db, db->
4970: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
4980: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4990: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
49a0: 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  );.  db->magic =
49b0: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c   SQLITE_MAGIC_CL
49c0: 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f  OSED;.  sqlite3_
49d0: 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d  mutex_free(db->m
49e0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
49f0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
4a00: 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  oced ){.    sqli
4a10: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f  te3_free(db->loo
4a20: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a  kaside.pStart);.
4a30: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
4a40: 65 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  ee(db);.  return
4a50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
4a60: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
4a70: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  l database files
4a80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
4a90: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c  3RollbackAll(sql
4aa0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
4ab0: 20 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e   i;.  int inTran
4ac0: 73 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28  s = 0;.  assert(
4ad0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
4ae0: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
4af0: 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
4b00: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
4b10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
4b20: 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  >nDb; i++){.    
4b30: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
4b40: 42 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  Bt ){.      if( 
4b50: 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e  sqlite3BtreeIsIn
4b60: 54 72 61 6e 73 28 64 62 2d 3e 61 44 62 5b 69 5d  Trans(db->aDb[i]
4b70: 2e 70 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20  .pBt) ){.       
4b80: 20 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20   inTrans = 1;.  
4b90: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
4ba0: 74 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b  te3BtreeRollback
4bb0: 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29  (db->aDb[i].pBt)
4bc0: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b  ;.      db->aDb[
4bd0: 69 5d 2e 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a  i].inTrans = 0;.
4be0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
4bf0: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
4c00: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e  db);.  sqlite3En
4c10: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
4c20: 0a 0a 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67  ..  if( db->flag
4c30: 73 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43  s&SQLITE_InternC
4c40: 68 61 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71  hanges ){.    sq
4c50: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
4c60: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
4c70: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
4c80: 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d  setInternalSchem
4c90: 61 28 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  a(db, 0);.  }.. 
4ca0: 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62   /* If one has b
4cb0: 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20  een configured, 
4cc0: 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62  invoke the rollb
4cd0: 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63  ack-hook callbac
4ce0: 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78  k */.  if( db->x
4cf0: 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b  RollbackCallback
4d00: 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20   && (inTrans || 
4d10: 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29  !db->autoCommit)
4d20: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c   ){.    db->xRol
4d30: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62  lbackCallback(db
4d40: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b  ->pRollbackArg);
4d50: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
4d60: 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74  turn a static st
4d70: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
4d80: 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20  bes the kind of 
4d90: 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20  error specified 
4da0: 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  in the.** argume
4db0: 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  nt..*/.const cha
4dc0: 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72  r *sqlite3ErrStr
4dd0: 28 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73  (int rc){.  cons
4de0: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 73 77 69  t char *z;.  swi
4df0: 74 63 68 28 20 72 63 20 26 20 30 78 66 66 20 29  tch( rc & 0xff )
4e00: 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  {.    case SQLIT
4e10: 45 5f 52 4f 57 3a 0a 20 20 20 20 63 61 73 65 20  E_ROW:.    case 
4e20: 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 0a 20 20 20  SQLITE_DONE:.   
4e30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a   case SQLITE_OK:
4e40: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 6e 6f           z = "no
4e50: 74 20 61 6e 20 65 72 72 6f 72 22 3b 20 20 20 20  t an error";    
4e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4e70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4e80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52   case SQLITE_ERR
4e90: 4f 52 3a 20 20 20 20 20 20 7a 20 3d 20 22 53 51  OR:      z = "SQ
4ea0: 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72  L logic error or
4eb0: 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61 73   missing databas
4ec0: 65 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  e";   break;.   
4ed0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52   case SQLITE_PER
4ee0: 4d 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 61 63  M:       z = "ac
4ef0: 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20  cess permission 
4f00: 64 65 6e 69 65 64 22 3b 20 20 20 20 20 20 20 20  denied";        
4f10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4f20: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f   case SQLITE_ABO
4f30: 52 54 3a 20 20 20 20 20 20 7a 20 3d 20 22 63 61  RT:      z = "ca
4f40: 6c 6c 62 61 63 6b 20 72 65 71 75 65 73 74 65 64  llback requested
4f50: 20 71 75 65 72 79 20 61 62 6f 72 74 22 3b 20 20   query abort";  
4f60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4f70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
4f80: 59 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 64 61  Y:       z = "da
4f90: 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b 65 64  tabase is locked
4fa0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
4fb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4fc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43   case SQLITE_LOC
4fd0: 4b 45 44 3a 20 20 20 20 20 7a 20 3d 20 22 64 61  KED:     z = "da
4fe0: 74 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20  tabase table is 
4ff0: 6c 6f 63 6b 65 64 22 3b 20 20 20 20 20 20 20 20  locked";        
5000: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5010: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d   case SQLITE_NOM
5020: 45 4d 3a 20 20 20 20 20 20 7a 20 3d 20 22 6f 75  EM:      z = "ou
5030: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 3b 20 20 20  t of memory";   
5040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5060: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
5070: 44 4f 4e 4c 59 3a 20 20 20 7a 20 3d 20 22 61 74  DONLY:   z = "at
5080: 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61  tempt to write a
5090: 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61   readonly databa
50a0: 73 65 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  se";  break;.   
50b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
50c0: 45 52 52 55 50 54 3a 20 20 7a 20 3d 20 22 69 6e  ERRUPT:  z = "in
50d0: 74 65 72 72 75 70 74 65 64 22 3b 20 20 20 20 20  terrupted";     
50e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
50f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5100: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
5110: 52 52 3a 20 20 20 20 20 20 7a 20 3d 20 22 64 69  RR:      z = "di
5120: 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 3b 20 20  sk I/O error";  
5130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5140: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5150: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
5160: 52 55 50 54 3a 20 20 20 20 7a 20 3d 20 22 64 61  RUPT:    z = "da
5170: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
5180: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 3b  e is malformed";
5190: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
51a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c   case SQLITE_FUL
51b0: 4c 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 64 61  L:       z = "da
51c0: 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69  tabase or disk i
51d0: 73 20 66 75 6c 6c 22 3b 20 20 20 20 20 20 20 20  s full";        
51e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
51f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
5200: 54 4f 50 45 4e 3a 20 20 20 7a 20 3d 20 22 75 6e  TOPEN:   z = "un
5210: 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74  able to open dat
5220: 61 62 61 73 65 20 66 69 6c 65 22 3b 20 20 20 20  abase file";    
5230: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5240: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50   case SQLITE_EMP
5250: 54 59 3a 20 20 20 20 20 20 7a 20 3d 20 22 74 61  TY:      z = "ta
5260: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  ble contains no 
5270: 64 61 74 61 22 3b 20 20 20 20 20 20 20 20 20 20  data";          
5280: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5290: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48   case SQLITE_SCH
52a0: 45 4d 41 3a 20 20 20 20 20 7a 20 3d 20 22 64 61  EMA:     z = "da
52b0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61  tabase schema ha
52c0: 73 20 63 68 61 6e 67 65 64 22 3b 20 20 20 20 20  s changed";     
52d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
52e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f 4f   case SQLITE_TOO
52f0: 42 49 47 3a 20 20 20 20 20 7a 20 3d 20 22 53 74  BIG:     z = "St
5300: 72 69 6e 67 20 6f 72 20 42 4c 4f 42 20 65 78 63  ring or BLOB exc
5310: 65 65 64 65 64 20 73 69 7a 65 20 6c 69 6d 69 74  eeded size limit
5320: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
5330: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5340: 53 54 52 41 49 4e 54 3a 20 7a 20 3d 20 22 63 6f  STRAINT: z = "co
5350: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
5360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
5370: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5380: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53   case SQLITE_MIS
5390: 4d 41 54 43 48 3a 20 20 20 7a 20 3d 20 22 64 61  MATCH:   z = "da
53a0: 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22  tatype mismatch"
53b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
53c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
53d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53   case SQLITE_MIS
53e0: 55 53 45 3a 20 20 20 20 20 7a 20 3d 20 22 6c 69  USE:     z = "li
53f0: 62 72 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61  brary routine ca
5400: 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75  lled out of sequ
5410: 65 6e 63 65 22 3b 62 72 65 61 6b 3b 0a 20 20 20  ence";break;.   
5420: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4c   case SQLITE_NOL
5430: 46 53 3a 20 20 20 20 20 20 7a 20 3d 20 22 6c 61  FS:      z = "la
5440: 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74  rge file support
5450: 20 69 73 20 64 69 73 61 62 6c 65 64 22 3b 20 20   is disabled";  
5460: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5470: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 55 54   case SQLITE_AUT
5480: 48 3a 20 20 20 20 20 20 20 7a 20 3d 20 22 61 75  H:       z = "au
5490: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69  thorization deni
54a0: 65 64 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ed";            
54b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
54c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4f 52   case SQLITE_FOR
54d0: 4d 41 54 3a 20 20 20 20 20 7a 20 3d 20 22 61 75  MAT:     z = "au
54e0: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
54f0: 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 3b 20   format error"; 
5500: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5510: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e   case SQLITE_RAN
5520: 47 45 3a 20 20 20 20 20 20 7a 20 3d 20 22 62 69  GE:      z = "bi
5530: 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64  nd or column ind
5540: 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22  ex out of range"
5550: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
5560: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54   case SQLITE_NOT
5570: 41 44 42 3a 20 20 20 20 20 7a 20 3d 20 22 66 69  ADB:     z = "fi
5580: 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65 64 20  le is encrypted 
5590: 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61  or is not a data
55a0: 62 61 73 65 22 3b 62 72 65 61 6b 3b 0a 20 20 20  base";break;.   
55b0: 20 64 65 66 61 75 6c 74 3a 20 20 20 20 20 20 20   default:       
55c0: 20 20 20 20 20 20 20 20 20 7a 20 3d 20 22 75 6e           z = "un
55d0: 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 20 20 20  known error";   
55e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
5600: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a  .  return z;.}..
5610: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5620: 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20  ne implements a 
5630: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68  busy callback th
5640: 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72  at sleeps and tr
5650: 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74  ies.** again unt
5660: 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c  il a timeout val
5670: 75 65 20 69 73 20 72 65 61 63 68 65 64 2e 20 20  ue is reached.  
5680: 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  The timeout valu
5690: 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67  e is.** an integ
56a0: 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c  er number of mil
56b0: 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64  liseconds passed
56c0: 20 69 6e 20 61 73 20 74 68 65 20 66 69 72 73 74   in as the first
56d0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
56e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
56f0: 74 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c  teDefaultBusyCal
5700: 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74  lback(. void *pt
5710: 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
5720: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
5730: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20  nection */. int 
5740: 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20 20  count           
5750: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5760: 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61  f times table ha
5770: 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29  s been busy */.)
5780: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f  {.#if SQLITE_OS_
5790: 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65 64 28  WIN || (defined(
57a0: 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20  HAVE_USLEEP) && 
57b0: 48 41 56 45 5f 55 53 4c 45 45 50 29 0a 20 20 73  HAVE_USLEEP).  s
57c0: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64  tatic const u8 d
57d0: 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  elays[] =.     {
57e0: 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35   1, 2, 5, 10, 15
57f0: 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32  , 20, 25, 25,  2
5800: 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30  5,  50,  50, 100
5810: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
5820: 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d  st u8 totals[] =
5830: 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c  .     { 0, 1, 3,
5840: 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c    8, 18, 33, 53,
5850: 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31   78, 103, 128, 1
5860: 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66  78, 228 };.# def
5870: 69 6e 65 20 4e 44 45 4c 41 59 20 28 73 69 7a 65  ine NDELAY (size
5880: 6f 66 28 64 65 6c 61 79 73 29 2f 73 69 7a 65 6f  of(delays)/sizeo
5890: 66 28 64 65 6c 61 79 73 5b 30 5d 29 29 0a 20 20  f(delays[0])).  
58a0: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
58b0: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
58c0: 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64 62  int timeout = db
58d0: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20  ->busyTimeout;. 
58e0: 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f   int delay, prio
58f0: 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f  r;..  assert( co
5900: 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20  unt>=0 );.  if( 
5910: 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29  count < NDELAY )
5920: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65  {.    delay = de
5930: 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20  lays[count];.   
5940: 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b   prior = totals[
5950: 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b  count];.  }else{
5960: 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c  .    delay = del
5970: 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20  ays[NDELAY-1];. 
5980: 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c     prior = total
5990: 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65  s[NDELAY-1] + de
59a0: 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c  lay*(count-(NDEL
59b0: 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66  AY-1));.  }.  if
59c0: 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20  ( prior + delay 
59d0: 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20  > timeout ){.   
59e0: 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74   delay = timeout
59f0: 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66   - prior;.    if
5a00: 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74  ( delay<=0 ) ret
5a10: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c  urn 0;.  }.  sql
5a20: 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e  ite3OsSleep(db->
5a30: 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30  pVfs, delay*1000
5a40: 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  );.  return 1;.#
5a50: 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20 2a  else.  sqlite3 *
5a60: 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29  db = (sqlite3 *)
5a70: 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f  ptr;.  int timeo
5a80: 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a  ut = ((sqlite3 *
5a90: 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f  )ptr)->busyTimeo
5aa0: 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74  ut;.  if( (count
5ab0: 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f  +1)*1000 > timeo
5ac0: 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ut ){.    return
5ad0: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
5ae0: 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66  3OsSleep(db->pVf
5af0: 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72  s, 1000000);.  r
5b00: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
5b10: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20  }../*.** Invoke 
5b20: 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20 68  the given busy h
5b30: 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68  andler..**.** Th
5b40: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
5b50: 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65  lled when an ope
5b60: 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77 69  ration failed wi
5b70: 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66  th a lock..** If
5b80: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
5b90: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
5ba0: 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72  the lock is retr
5bb0: 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72  ied.  If it.** r
5bc0: 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70  eturns 0, the op
5bd0: 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77  eration aborts w
5be0: 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55  ith an SQLITE_BU
5bf0: 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74  SY error..*/.int
5c00: 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75   sqlite3InvokeBu
5c10: 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61  syHandler(BusyHa
5c20: 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74  ndler *p){.  int
5c30: 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45 52   rc;.  if( NEVER
5c40: 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75  (p==0) || p->xFu
5c50: 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73  nc==0 || p->nBus
5c60: 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  y<0 ) return 0;.
5c70: 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28    rc = p->xFunc(
5c80: 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73  p->pArg, p->nBus
5c90: 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  y);.  if( rc==0 
5ca0: 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20  ){.    p->nBusy 
5cb0: 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = -1;.  }else{. 
5cc0: 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20     p->nBusy++;. 
5cd0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20   }.  return rc; 
5ce0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
5cf0: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
5d00: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f  busy callback fo
5d10: 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61  r an Sqlite data
5d20: 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67  base to the.** g
5d30: 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75  iven callback fu
5d40: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
5d50: 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  given argument..
5d60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62  */.int sqlite3_b
5d70: 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73  usy_handler(.  s
5d80: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e  qlite3 *db,.  in
5d90: 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a  t (*xBusy)(void*
5da0: 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70  ,int),.  void *p
5db0: 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  Arg.){.  sqlite3
5dc0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
5dd0: 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62  >mutex);.  db->b
5de0: 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63  usyHandler.xFunc
5df0: 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e   = xBusy;.  db->
5e00: 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72 67  busyHandler.pArg
5e10: 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62   = pArg;.  db->b
5e20: 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79  usyHandler.nBusy
5e30: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
5e40: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
5e50: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
5e60: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
5e70: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
5e80: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
5e90: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BACK./*.** This 
5ea0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
5eb0: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
5ec0: 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65  ck for an Sqlite
5ed0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
5ee0: 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  .** given callba
5ef0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ck function with
5f00: 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d   the given argum
5f10: 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73  ent. The progres
5f20: 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a  s callback will.
5f30: 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76  ** be invoked ev
5f40: 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73  ery nOps opcodes
5f50: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
5f60: 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
5f70: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
5f80: 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a  b, .  int nOps,.
5f90: 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73    int (*xProgres
5fa0: 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f  s)(void*), .  vo
5fb0: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71  id *pArg.){.  sq
5fc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
5fd0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
5fe0: 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20  if( nOps>0 ){.  
5ff0: 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20    db->xProgress 
6000: 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20  = xProgress;.   
6010: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
6020: 73 20 3d 20 6e 4f 70 73 3b 0a 20 20 20 20 64 62  s = nOps;.    db
6030: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d  ->pProgressArg =
6040: 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a   pArg;.  }else{.
6050: 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73      db->xProgres
6060: 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e  s = 0;.    db->n
6070: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b  ProgressOps = 0;
6080: 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65  .    db->pProgre
6090: 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20  ssArg = 0;.  }. 
60a0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
60b0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
60c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
60d0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
60e0: 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c  nstalls a defaul
60f0: 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74  t busy handler t
6100: 68 61 74 20 77 61 69 74 73 20 66 6f 72 20 74 68  hat waits for th
6110: 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e  e.** specified n
6120: 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65  umber of millise
6130: 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74  conds before ret
6140: 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74  urning 0..*/.int
6150: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69   sqlite3_busy_ti
6160: 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64  meout(sqlite3 *d
6170: 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69 66  b, int ms){.  if
6180: 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 64 62  ( ms>0 ){.    db
6190: 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20  ->busyTimeout = 
61a0: 6d 73 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ms;.    sqlite3_
61b0: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c  busy_handler(db,
61c0: 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75   sqliteDefaultBu
61d0: 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  syCallback, (voi
61e0: 64 2a 29 64 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  d*)db);.  }else{
61f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73  .    sqlite3_bus
6200: 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c  y_handler(db, 0,
6210: 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   0);.  }.  retur
6220: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
6230: 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20  /*.** Cause any 
6240: 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f  pending operatio
6250: 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73  n to stop at its
6260: 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74   earliest opport
6270: 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  unity..*/.void s
6280: 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74  qlite3_interrupt
6290: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
62a0: 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72   db->u1.isInterr
62b0: 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f  upted = 1;.}.../
62c0: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
62d0: 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74 68  on is exactly th
62e0: 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65  e same as sqlite
62f0: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
6300: 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74  n(), except.** t
6310: 68 61 74 20 69 74 20 69 73 20 64 65 73 69 67 6e  hat it is design
6320: 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20  ed to be called 
6330: 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65  by internal code
6340: 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65  . The difference
6350: 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61   is.** that if a
6360: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20   malloc() fails 
6370: 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  in sqlite3_creat
6380: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e  e_function(), an
6390: 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69   error code.** i
63a0: 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74  s returned and t
63b0: 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  he mallocFailed 
63c0: 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a  flag cleared. .*
63d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65  /.int sqlite3Cre
63e0: 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  ateFunc(.  sqlit
63f0: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
6400: 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  char *zFunctionN
6410: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
6420: 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f  .  int enc,.  vo
6430: 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20  id *pUserData,. 
6440: 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73   void (*xFunc)(s
6450: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
6460: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
6470: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
6480: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
6490: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
64a0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
64b0: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
64c0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
64d0: 29 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  ).){.  FuncDef *
64e0: 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a  p;.  int nName;.
64f0: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
6500: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
6510: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
6520: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  ( zFunctionName=
6530: 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75  =0 ||.      (xFu
6540: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c  nc && (xFinal ||
6550: 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20   xStep)) || .   
6560: 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 78     (!xFunc && (x
6570: 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29  Final && !xStep)
6580: 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75  ) ||.      (!xFu
6590: 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26  nc && (!xFinal &
65a0: 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20  & xStep)) ||.   
65b0: 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e     (nArg<-1 || n
65c0: 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46  Arg>SQLITE_MAX_F
65d0: 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a  UNCTION_ARG) ||.
65e0: 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d        (255<(nNam
65f0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
6600: 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  n(db, zFunctionN
6610: 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 73 71  ame))) ){.    sq
6620: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
6630: 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 62 61  QLITE_ERROR, "ba
6640: 64 20 70 61 72 61 6d 65 74 65 72 73 22 29 3b 0a  d parameters");.
6650: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
6660: 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 0a  E_ERROR;.  }.  .
6670: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6680: 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49  MIT_UTF16.  /* I
6690: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  f SQLITE_UTF16 i
66a0: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  s specified as t
66b0: 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65  he encoding type
66c0: 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73  , transform this
66d0: 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20  .  ** to one of 
66e0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f  SQLITE_UTF16LE o
66f0: 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  r SQLITE_UTF16BE
6700: 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
6710: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
6720: 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45  VE macro. SQLITE
6730: 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73  _UTF16 is not us
6740: 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ed internally.. 
6750: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49   **.  ** If SQLI
6760: 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66  TE_ANY is specif
6770: 69 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76  ied, add three v
6780: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  ersions of the f
6790: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  unction.  ** to 
67a0: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a  the hash table..
67b0: 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d    */.  if( enc==
67c0: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a  SQLITE_UTF16 ){.
67d0: 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45      enc = SQLITE
67e0: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
67f0: 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53  }else if( enc==S
6800: 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20  QLITE_ANY ){.   
6810: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20   int rc;.    rc 
6820: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
6830: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  unc(db, zFunctio
6840: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  nName, nArg, SQL
6850: 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
6860: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46     pUserData, xF
6870: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
6880: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  al);.    if( rc=
6890: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
68a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
68b0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
68c0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41  FunctionName, nA
68d0: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  rg, SQLITE_UTF16
68e0: 4c 45 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55  LE,.          pU
68f0: 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20  serData, xFunc, 
6900: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a  xStep, xFinal);.
6910: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
6920: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
6930: 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
6940: 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20      }.    enc = 
6950: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a  SQLITE_UTF16BE;.
6960: 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20    }.#else.  enc 
6970: 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23  = SQLITE_UTF8;.#
6980: 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68  endif.  .  /* Ch
6990: 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69  eck if an existi
69a0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62  ng function is b
69b0: 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20  eing overridden 
69c0: 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73  or deleted. If s
69d0: 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72  o,.  ** and ther
69e0: 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
69f0: 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51  , then return SQ
6a00: 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20  LITE_BUSY. If a 
6a10: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  function.  ** is
6a20: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
6a30: 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68  n/deleted but th
6a40: 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76  ere are no activ
6a50: 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65  e VMs, allow the
6a60: 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20  .  ** operation 
6a70: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20  to continue but 
6a80: 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70  invalidate all p
6a90: 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  recompiled state
6aa0: 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20  ments..  */.  p 
6ab0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
6ac0: 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74  ction(db, zFunct
6ad0: 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  ionName, nName, 
6ae0: 6e 41 72 67 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  nArg, enc, 0);. 
6af0: 20 69 66 28 20 70 20 26 26 20 70 2d 3e 69 50 72   if( p && p->iPr
6b00: 65 66 45 6e 63 3d 3d 65 6e 63 20 26 26 20 70 2d  efEnc==enc && p-
6b10: 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20  >nArg==nArg ){. 
6b20: 20 20 20 69 66 28 20 64 62 2d 3e 61 63 74 69 76     if( db->activ
6b30: 65 56 64 62 65 43 6e 74 20 29 7b 0a 20 20 20 20  eVdbeCnt ){.    
6b40: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
6b50: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
6b60: 0a 20 20 20 20 20 20 20 20 22 55 6e 61 62 6c 65  .        "Unable
6b70: 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66   to delete/modif
6b80: 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20  y user-function 
6b90: 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74  due to active st
6ba0: 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20  atements");.    
6bb0: 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
6bc0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
6bd0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
6be0: 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c  TE_BUSY;.    }el
6bf0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
6c00: 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
6c10: 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
6c20: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20     }.  }..  p = 
6c30: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
6c40: 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  ion(db, zFunctio
6c50: 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41  nName, nName, nA
6c60: 72 67 2c 20 65 6e 63 2c 20 31 29 3b 0a 20 20 61  rg, enc, 1);.  a
6c70: 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d  ssert(p || db->m
6c80: 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20  allocFailed);.  
6c90: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
6ca0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
6cb0: 4d 3b 0a 20 20 7d 0a 20 20 70 2d 3e 66 6c 61 67  M;.  }.  p->flag
6cc0: 73 20 3d 20 30 3b 0a 20 20 70 2d 3e 78 46 75 6e  s = 0;.  p->xFun
6cd0: 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e  c = xFunc;.  p->
6ce0: 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20  xStep = xStep;. 
6cf0: 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20   p->xFinalize = 
6d00: 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73  xFinal;.  p->pUs
6d10: 65 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61  erData = pUserDa
6d20: 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20  ta;.  p->nArg = 
6d30: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53  nArg;.  return S
6d40: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
6d50: 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73  ** Create new us
6d60: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
6d70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
6d80: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
6d90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
6da0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
6db0: 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  tionName,.  int 
6dc0: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
6dd0: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
6de0: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
6df0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
6e00: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
6e10: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
6e20: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
6e30: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
6e40: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
6e50: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
6e60: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
6e70: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
6e80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6e90: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
6ea0: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
6eb0: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
6ec0: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  tionName, nArg, 
6ed0: 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78  enc, p, xFunc, x
6ee0: 53 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20  Step, xFinal);. 
6ef0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
6f00: 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
6f10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
6f20: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
6f30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6f40: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6f50: 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73 71  MIT_UTF16.int sq
6f60: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
6f70: 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74  ction16(.  sqlit
6f80: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
6f90: 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e  void *zFunctionN
6fa0: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  ame,.  int nArg,
6fb0: 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70 2c  .  int eTextRep,
6fc0: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
6fd0: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
6fe0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
6ff0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
7000: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
7010: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
7020: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
7030: 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64  value**),.  void
7040: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
7050: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a  e3_context*).){.
7060: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
7070: 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71 6c 69   *zFunc8;.  sqli
7080: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
7090: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
70a0: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
70b0: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75  cFailed );.  zFu
70c0: 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66  nc8 = sqlite3Utf
70d0: 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74  16to8(db, zFunct
70e0: 69 6f 6e 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20 20  ionName, -1);.  
70f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61  rc = sqlite3Crea
7100: 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63  teFunc(db, zFunc
7110: 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65  8, nArg, eTextRe
7120: 70 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74  p, p, xFunc, xSt
7130: 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 73  ep, xFinal);.  s
7140: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7150: 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d   zFunc8);.  rc =
7160: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
7170: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
7180: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
7190: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
71a0: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
71b0: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  .../*.** Declare
71c0: 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e   that a function
71d0: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f   has been overlo
71e0: 61 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61  aded by a virtua
71f0: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  l table..**.** I
7200: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61  f the function a
7210: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73  lready exists as
7220: 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61   a regular globa
7230: 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e  l function, then
7240: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
7250: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
7260: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
7270: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
7280: 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e  en create.** a n
7290: 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61  ew one that alwa
72a0: 79 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d  ys throws a run-
72b0: 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a  time error.  .**
72c0: 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c  .** When virtual
72d0: 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74   tables intend t
72e0: 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65  o provide an ove
72f0: 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e  rloaded function
7300: 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  , they.** should
7310: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
7320: 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
7330: 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  the global funct
7340: 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41  ion exists..** A
7350: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
7360: 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f   must exist in o
7370: 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65  rder for name re
7380: 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b  solution to work
7390: 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  .** properly..*/
73a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65  .int sqlite3_ove
73b0: 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a  rload_function(.
73c0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
73d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
73e0: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29  me,.  int nArg.)
73f0: 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20  {.  int nName = 
7400: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 28 64 62  sqlite3Strlen(db
7410: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20  , zName);.  int 
7420: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rc;.  sqlite3_mu
7430: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
7440: 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  tex);.  if( sqli
7450: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
7460: 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  db, zName, nName
7470: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
7480: 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20  TF8, 0)==0 ){.  
7490: 20 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46    sqlite3CreateF
74a0: 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e  unc(db, zName, n
74b0: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
74c0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
74d0: 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74          0, sqlit
74e0: 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f  e3InvalidFunctio
74f0: 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  n, 0, 0);.  }.  
7500: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
7510: 78 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  xit(db, SQLITE_O
7520: 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  K);.  sqlite3_mu
7530: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
7540: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
7550: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
7560: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
7570: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
7580: 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e   trace function.
7590: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
75a0: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
75b0: 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a  egistered trace.
75c0: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
75d0: 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74   .**.** A NULL t
75e0: 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  race function me
75f0: 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63  ans that no trac
7600: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
7610: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
7620: 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74  trace is a point
7630: 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
7640: 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64   that is invoked
7650: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
7660: 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61   each.** SQL sta
7670: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
7680: 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73  *sqlite3_trace(s
7690: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
76a0: 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a   (*xTrace)(void*
76b0: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76  ,const char*), v
76c0: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f  oid *pArg){.  vo
76d0: 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69  id *pOld;.  sqli
76e0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
76f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
7700: 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41  ld = db->pTraceA
7710: 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65  rg;.  db->xTrace
7720: 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d   = xTrace;.  db-
7730: 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72  >pTraceArg = pAr
7740: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
7750: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
7760: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
7770: 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69  ld;.}./*.** Regi
7780: 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66  ster a profile f
7790: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
77a0: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
77b0: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
77c0: 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75  d .** profile fu
77d0: 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e  nction is return
77e0: 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ed.  .**.** A NU
77f0: 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74  LL profile funct
7800: 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ion means that n
7810: 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65  o profiling is e
7820: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
7830: 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  NULL.** profile 
7840: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
7850: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
7860: 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
7870: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a  e conclusion of.
7880: 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  ** each SQL stat
7890: 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75  ement that is ru
78a0: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
78b0: 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73  te3_profile(.  s
78c0: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
78d0: 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76  id (*xProfile)(v
78e0: 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
78f0: 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c  ,sqlite_uint64),
7900: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
7910: 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20  .  void *pOld;. 
7920: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
7930: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
7940: 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50  .  pOld = db->pP
7950: 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d  rofileArg;.  db-
7960: 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f  >xProfile = xPro
7970: 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f  file;.  db->pPro
7980: 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  fileArg = pArg;.
7990: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
79a0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
79b0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
79c0: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
79d0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a  ITE_OMIT_TRACE *
79e0: 2f 0a 0a 2f 2a 2a 2a 20 45 58 50 45 52 49 4d 45  /../*** EXPERIME
79f0: 4e 54 41 4c 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52  NTAL ***.**.** R
7a00: 65 67 69 73 74 65 72 20 61 20 66 75 6e 63 74 69  egister a functi
7a10: 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  on to be invoked
7a20: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
7a30: 69 6f 6e 20 63 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a  ion comments..**
7a40: 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20   If the invoked 
7a50: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
7a60: 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
7a70: 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d  the commit becom
7a80: 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b  es a.** rollback
7a90: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
7aa0: 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a  e3_commit_hook(.
7ab0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
7ac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
7ad0: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
7ae0: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
7af0: 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c  */.  int (*xCall
7b00: 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f  back)(void*),  /
7b10: 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e  * Function to in
7b20: 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d  voke on each com
7b30: 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  mit */.  void *p
7b40: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
7b50: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
7b60: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
7b70: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c  /.){.  void *pOl
7b80: 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  d;.  sqlite3_mut
7b90: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
7ba0: 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62  ex);.  pOld = db
7bb0: 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20  ->pCommitArg;.  
7bc0: 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62  db->xCommitCallb
7bd0: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
7be0: 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72  .  db->pCommitAr
7bf0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
7c00: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7c10: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
7c20: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a  turn pOld;.}../*
7c30: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
7c40: 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
7c50: 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
7c60: 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64  a row is updated
7c70: 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72  ,.** inserted or
7c80: 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74   deleted using t
7c90: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
7ca0: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
7cb0: 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65   *sqlite3_update
7cc0: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
7cd0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
7ce0: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
7cf0: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
7d00: 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64  tabase */.  void
7d10: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
7d20: 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e  id*,int,char con
7d30: 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20  st *,char const 
7d40: 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c  *,sqlite_int64),
7d50: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
7d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7d70: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
7d80: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
7d90: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73   void *pRet;.  s
7da0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
7db0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
7dc0: 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64   pRet = db->pUpd
7dd0: 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55  ateArg;.  db->xU
7de0: 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20  pdateCallback = 
7df0: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
7e00: 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70 41  >pUpdateArg = pA
7e10: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
7e20: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
7e30: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
7e40: 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Ret;.}../*.** Re
7e50: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
7e60: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
7e70: 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e  each time a tran
7e80: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
7e90: 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69  d.** back by thi
7ea0: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
7eb0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
7ec0: 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b  sqlite3_rollback
7ed0: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
7ee0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
7ef0: 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65     /* Attach the
7f00: 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61   hook to this da
7f10: 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64  tabase */.  void
7f20: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
7f30: 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63  id*), /* Callbac
7f40: 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  k function */.  
7f50: 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
7f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
7f70: 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e  ument to the fun
7f80: 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f  ction */.){.  vo
7f90: 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69  id *pRet;.  sqli
7fa0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
7fb0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52  db->mutex);.  pR
7fc0: 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61  et = db->pRollba
7fd0: 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f  ckArg;.  db->xRo
7fe0: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d  llbackCallback =
7ff0: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
8000: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d  ->pRollbackArg =
8010: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
8020: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
8030: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
8040: 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pRet;.}../*.**
8050: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8060: 20 63 61 6c 6c 65 64 20 74 6f 20 63 72 65 61 74   called to creat
8070: 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  e a connection t
8080: 6f 20 61 20 64 61 74 61 62 61 73 65 20 42 54 72  o a database BTr
8090: 65 65 0a 2a 2a 20 64 72 69 76 65 72 2e 20 20 49  ee.** driver.  I
80a0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74  f zFilename is t
80b0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 66 69 6c  he name of a fil
80c0: 65 2c 20 74 68 65 6e 20 74 68 61 74 20 66 69 6c  e, then that fil
80d0: 65 20 69 73 0a 2a 2a 20 6f 70 65 6e 65 64 20 61  e is.** opened a
80e0: 6e 64 20 75 73 65 64 2e 20 20 49 66 20 7a 46 69  nd used.  If zFi
80f0: 6c 65 6e 61 6d 65 20 69 73 20 74 68 65 20 6d 61  lename is the ma
8100: 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65 6d 6f 72  gic name ":memor
8110: 79 3a 22 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  y:" then.** the 
8120: 64 61 74 61 62 61 73 65 20 69 73 20 73 74 6f 72  database is stor
8130: 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 28 61 6e  ed in memory (an
8140: 64 20 69 73 20 74 68 75 73 20 66 6f 72 67 6f 74  d is thus forgot
8150: 74 65 6e 20 61 73 20 73 6f 6f 6e 20 61 73 0a 2a  ten as soon as.*
8160: 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  * the connection
8170: 20 69 73 20 63 6c 6f 73 65 64 2e 29 20 20 49 66   is closed.)  If
8180: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55   zFilename is NU
8190: 4c 4c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  LL then the data
81a0: 62 61 73 65 0a 2a 2a 20 69 73 20 61 20 22 76 69  base.** is a "vi
81b0: 72 74 75 61 6c 22 20 64 61 74 61 62 61 73 65 20  rtual" database 
81c0: 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 75 73  for transient us
81d0: 65 20 6f 6e 6c 79 20 61 6e 64 20 69 73 20 64 65  e only and is de
81e0: 6c 65 74 65 64 20 61 73 0a 2a 2a 20 73 6f 6f 6e  leted as.** soon
81f0: 20 61 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   as the connecti
8200: 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  on is closed..**
8210: 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c 20 64 61  .** A virtual da
8220: 74 61 62 61 73 65 20 63 61 6e 20 62 65 20 65 69  tabase can be ei
8230: 74 68 65 72 20 61 20 64 69 73 6b 20 66 69 6c 65  ther a disk file
8240: 20 28 74 68 61 74 20 69 73 20 61 75 74 6f 6d 61   (that is automa
8250: 74 69 63 61 6c 6c 79 0a 2a 2a 20 64 65 6c 65 74  tically.** delet
8260: 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  ed when the file
8270: 20 69 73 20 63 6c 6f 73 65 64 29 20 6f 72 20 69   is closed) or i
8280: 74 20 61 6e 20 62 65 20 68 65 6c 64 20 65 6e 74  t an be held ent
8290: 69 72 65 6c 79 20 69 6e 20 6d 65 6d 6f 72 79 2c  irely in memory,
82a0: 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  .** depending on
82b0: 20 74 68 65 20 76 61 6c 75 65 73 20 6f 66 20 74   the values of t
82c0: 68 65 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53  he SQLITE_TEMP_S
82d0: 54 4f 52 45 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  TORE compile-tim
82e0: 65 20 6d 61 63 72 6f 20 61 6e 64 20 74 68 65 0a  e macro and the.
82f0: 2a 2a 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  ** db->temp_stor
8300: 65 20 76 61 72 69 61 62 6c 65 2c 20 61 63 63 6f  e variable, acco
8310: 72 64 69 6e 67 20 74 6f 20 74 68 65 20 66 6f 6c  rding to the fol
8320: 6c 6f 77 69 6e 67 20 63 68 61 72 74 3a 0a 2a 2a  lowing chart:.**
8330: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d  .**   SQLITE_TEM
8340: 50 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e  P_STORE     db->
8350: 74 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c  temp_store     L
8360: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f  ocation of tempo
8370: 72 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  rary database.**
8380: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
8390: 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
83a0: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
83b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
83d0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
83e0: 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20        any       
83f0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 0a 2a 2a           file.**
8400: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
8410: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
8420: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
8430: 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
8440: 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
8450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
8460: 65 6d 6f 72 79 0a 2a 2a 20 20 20 31 20 20 20 20  emory.**   1    
8470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8480: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
8490: 20 20 20 20 66 69 6c 65 0a 2a 2a 20 20 20 32 20      file.**   2 
84a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
84b0: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
84c0: 20 20 20 20 20 20 20 66 69 6c 65 0a 2a 2a 20 20         file.**  
84d0: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
84e0: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
84f0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
8500: 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
8510: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
8520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
8530: 65 6d 6f 72 79 0a 2a 2a 20 20 20 33 20 20 20 20  emory.**   3    
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
8560: 20 20 20 20 6d 65 6d 6f 72 79 0a 2a 2f 0a 69 6e      memory.*/.in
8570: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61  t sqlite3BtreeFa
8580: 63 74 6f 72 79 28 0a 20 20 63 6f 6e 73 74 20 73  ctory(.  const s
8590: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
85a0: 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74 61 62     /* Main datab
85b0: 61 73 65 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  ase when opening
85c0: 20 61 75 78 20 6f 74 68 65 72 77 69 73 65 20 30   aux otherwise 0
85d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
85e0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
85f0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
8600: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
8610: 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73  he BTree databas
8620: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 4a  e */.  int omitJ
8630: 6f 75 72 6e 61 6c 2c 20 20 20 20 20 20 20 20 20  ournal,         
8640: 20 2f 2a 20 69 66 20 54 52 55 45 20 74 68 65 6e   /* if TRUE then
8650: 20 64 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 20   do not journal 
8660: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
8670: 6e 74 20 6e 43 61 63 68 65 2c 20 20 20 20 20 20  nt nCache,      
8680: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
8690: 6d 61 6e 79 20 70 61 67 65 73 20 69 6e 20 74 68  many pages in th
86a0: 65 20 70 61 67 65 20 63 61 63 68 65 20 2a 2f 0a  e page cache */.
86b0: 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20    int vfsFlags, 
86c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
86d0: 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
86e0: 75 67 68 20 74 6f 20 76 66 73 4f 70 65 6e 20 2a  ugh to vfsOpen *
86f0: 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
8700: 72 65 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ree           /*
8710: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
8720: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
8730: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
8740: 20 20 69 6e 74 20 62 74 46 6c 61 67 73 20 3d 20    int btFlags = 
8750: 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a  0;.  int rc;.  .
8760: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
8770: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
8780: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
8790: 65 72 74 28 20 70 70 42 74 72 65 65 20 21 3d 20  ert( ppBtree != 
87a0: 30 29 3b 0a 20 20 69 66 28 20 6f 6d 69 74 4a 6f  0);.  if( omitJo
87b0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 62 74 46  urnal ){.    btF
87c0: 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4f 4d  lags |= BTREE_OM
87d0: 49 54 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 7d 0a  IT_JOURNAL;.  }.
87e0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
87f0: 26 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61 64 6c  & SQLITE_NoReadl
8800: 6f 63 6b 20 29 7b 0a 20 20 20 20 62 74 46 6c 61  ock ){.    btFla
8810: 67 73 20 7c 3d 20 42 54 52 45 45 5f 4e 4f 5f 52  gs |= BTREE_NO_R
8820: 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 0a 20 20 69  EADLOCK;.  }.  i
8830: 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
8840: 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  ){.#if SQLITE_TE
8850: 4d 50 5f 53 54 4f 52 45 3d 3d 30 0a 20 20 20 20  MP_STORE==0.    
8860: 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
8870: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20  .#endif.#ifndef 
8880: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
8890: 52 59 44 42 0a 23 69 66 20 53 51 4c 49 54 45 5f  RYDB.#if SQLITE_
88a0: 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20  TEMP_STORE==1.  
88b0: 20 20 69 66 28 20 64 62 2d 3e 74 65 6d 70 5f 73    if( db->temp_s
88c0: 74 6f 72 65 3d 3d 32 20 29 20 7a 46 69 6c 65 6e  tore==2 ) zFilen
88d0: 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22  ame = ":memory:"
88e0: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
88f0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d  ITE_TEMP_STORE==
8900: 32 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 74 65  2.    if( db->te
8910: 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 20 7a 46  mp_store!=1 ) zF
8920: 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f  ilename = ":memo
8930: 72 79 3a 22 3b 0a 23 65 6e 64 69 66 0a 23 69 66  ry:";.#endif.#if
8940: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
8950: 52 45 3d 3d 33 0a 20 20 20 20 7a 46 69 6c 65 6e  RE==3.    zFilen
8960: 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22  ame = ":memory:"
8970: 3b 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 20  ;.#endif.#endif 
8980: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  /* SQLITE_OMIT_M
8990: 45 4d 4f 52 59 44 42 20 2a 2f 0a 20 20 7d 0a 0a  EMORYDB */.  }..
89a0: 20 20 69 66 28 20 28 76 66 73 46 6c 61 67 73 20    if( (vfsFlags 
89b0: 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  & SQLITE_OPEN_MA
89c0: 49 4e 5f 44 42 29 21 3d 30 20 26 26 20 28 7a 46  IN_DB)!=0 && (zF
89d0: 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a  ilename==0 || *z
89e0: 46 69 6c 65 6e 61 6d 65 3d 3d 30 29 20 29 7b 0a  Filename==0) ){.
89f0: 20 20 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28      vfsFlags = (
8a00: 76 66 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49  vfsFlags & ~SQLI
8a10: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29  TE_OPEN_MAIN_DB)
8a20: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54   | SQLITE_OPEN_T
8a30: 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 72 63  EMP_DB;.  }.  rc
8a40: 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
8a50: 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 28  pen(zFilename, (
8a60: 73 71 6c 69 74 65 33 20 2a 29 64 62 2c 20 70 70  sqlite3 *)db, pp
8a70: 42 74 72 65 65 2c 20 62 74 46 6c 61 67 73 2c 20  Btree, btFlags, 
8a80: 76 66 73 46 6c 61 67 73 29 3b 0a 0a 20 20 2f 2a  vfsFlags);..  /*
8a90: 20 49 66 20 74 68 65 20 42 2d 54 72 65 65 20 77   If the B-Tree w
8aa0: 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
8ab0: 6f 70 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20  opened, set the 
8ac0: 70 61 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65  pager-cache size
8ad0: 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 65 66   to the.  ** def
8ae0: 61 75 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65  ault value. Exce
8af0: 70 74 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 20  pt, if the call 
8b00: 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29 20 72  to BtreeOpen() r
8b10: 65 74 75 72 6e 65 64 20 61 20 68 61 6e 64 6c 65  eturned a handle
8b20: 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 61 6e  .  ** open on an
8b30: 20 65 78 69 73 74 69 6e 67 20 73 68 61 72 65 64   existing shared
8b40: 20 70 61 67 65 72 2d 63 61 63 68 65 2c 20 64 6f   pager-cache, do
8b50: 20 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20   not change the 
8b60: 70 61 67 65 72 2d 63 61 63 68 65 20 0a 20 20 2a  pager-cache .  *
8b70: 2a 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69  * size..  */.  i
8b80: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
8b90: 20 26 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 74   && 0==sqlite3Bt
8ba0: 72 65 65 53 63 68 65 6d 61 28 2a 70 70 42 74 72  reeSchema(*ppBtr
8bb0: 65 65 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  ee, 0, 0) ){.   
8bc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74   sqlite3BtreeSet
8bd0: 43 61 63 68 65 53 69 7a 65 28 2a 70 70 42 74 72  CacheSize(*ppBtr
8be0: 65 65 2c 20 6e 43 61 63 68 65 29 3b 0a 20 20 7d  ee, nCache);.  }
8bf0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8c00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
8c10: 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  F-8 encoded Engl
8c20: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
8c30: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
8c40: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
8c50: 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  rror..*/.const c
8c60: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
8c70: 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29  msg(sqlite3 *db)
8c80: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
8c90: 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
8ca0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
8cb0: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
8cc0: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66  NOMEM);.  }.  if
8cd0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
8ce0: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
8cf0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
8d00: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
8d10: 4c 49 54 45 5f 4d 49 53 55 53 45 29 3b 0a 20 20  LITE_MISUSE);.  
8d20: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
8d30: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
8d40: 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
8d50: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
8d60: 29 3b 0a 20 20 7a 20 3d 20 28 63 68 61 72 2a 29  );.  z = (char*)
8d70: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
8d80: 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  xt(db->pErr);.  
8d90: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
8da0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 69  locFailed );.  i
8db0: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 7a  f( z==0 ){.    z
8dc0: 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
8dd0: 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20  (db->errCode);. 
8de0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
8df0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
8e00: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  ex);.  return z;
8e10: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
8e20: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
8e30: 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31  .** Return UTF-1
8e40: 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  6 encoded Englis
8e50: 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
8e60: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
8e70: 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
8e80: 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  or..*/.const voi
8e90: 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  d *sqlite3_errms
8ea0: 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29  g16(sqlite3 *db)
8eb0: 7b 0a 20 20 2f 2a 20 42 65 63 61 75 73 65 20 61  {.  /* Because a
8ec0: 6c 6c 20 74 68 65 20 63 68 61 72 61 63 74 65 72  ll the character
8ed0: 73 20 69 6e 20 74 68 65 20 73 74 72 69 6e 67 20  s in the string 
8ee0: 61 72 65 20 69 6e 20 74 68 65 20 75 6e 69 63 6f  are in the unico
8ef0: 64 65 0a 20 20 2a 2a 20 72 61 6e 67 65 20 30 78  de.  ** range 0x
8f00: 30 30 2d 30 78 46 46 2c 20 69 66 20 77 65 20 70  00-0xFF, if we p
8f10: 61 64 20 74 68 65 20 62 69 67 2d 65 6e 64 69 61  ad the big-endia
8f20: 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20 61 20  n string with a 
8f30: 0a 20 20 2a 2a 20 7a 65 72 6f 20 62 79 74 65 2c  .  ** zero byte,
8f40: 20 77 65 20 63 61 6e 20 6f 62 74 61 69 6e 20 74   we can obtain t
8f50: 68 65 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e  he little-endian
8f60: 20 73 74 72 69 6e 67 20 77 69 74 68 0a 20 20 2a   string with.  *
8f70: 2a 20 26 62 69 67 5f 65 6e 64 69 61 6e 5b 31 5d  * &big_endian[1]
8f80: 2e 0a 20 20 2a 2f 0a 20 20 73 74 61 74 69 63 20  ..  */.  static 
8f90: 63 6f 6e 73 74 20 63 68 61 72 20 6f 75 74 4f 66  const char outOf
8fa0: 4d 65 6d 42 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  MemBe[] = {.    
8fb0: 30 2c 20 27 6f 27 2c 20 30 2c 20 27 75 27 2c 20  0, 'o', 0, 'u', 
8fc0: 30 2c 20 27 74 27 2c 20 30 2c 20 27 20 27 2c 20  0, 't', 0, ' ', 
8fd0: 0a 20 20 20 20 30 2c 20 27 6f 27 2c 20 30 2c 20  .    0, 'o', 0, 
8fe0: 27 66 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20  'f', 0, ' ', .  
8ff0: 20 20 30 2c 20 27 6d 27 2c 20 30 2c 20 27 65 27    0, 'm', 0, 'e'
9000: 2c 20 30 2c 20 27 6d 27 2c 20 30 2c 20 27 6f 27  , 0, 'm', 0, 'o'
9010: 2c 20 30 2c 20 27 72 27 2c 20 30 2c 20 27 79 27  , 0, 'r', 0, 'y'
9020: 2c 20 30 2c 20 30 2c 20 30 0a 20 20 7d 3b 0a 20  , 0, 0, 0.  };. 
9030: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
9040: 61 72 20 6d 69 73 75 73 65 42 65 20 5b 5d 20 3d  ar misuseBe [] =
9050: 20 7b 0a 20 20 20 20 30 2c 20 27 6c 27 2c 20 30   {.    0, 'l', 0
9060: 2c 20 27 69 27 2c 20 30 2c 20 27 62 27 2c 20 30  , 'i', 0, 'b', 0
9070: 2c 20 27 72 27 2c 20 30 2c 20 27 61 27 2c 20 30  , 'r', 0, 'a', 0
9080: 2c 20 27 72 27 2c 20 30 2c 20 27 79 27 2c 20 30  , 'r', 0, 'y', 0
9090: 2c 20 27 20 27 2c 20 0a 20 20 20 20 30 2c 20 27  , ' ', .    0, '
90a0: 72 27 2c 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27  r', 0, 'o', 0, '
90b0: 75 27 2c 20 30 2c 20 27 74 27 2c 20 30 2c 20 27  u', 0, 't', 0, '
90c0: 69 27 2c 20 30 2c 20 27 6e 27 2c 20 30 2c 20 27  i', 0, 'n', 0, '
90d0: 65 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20 20  e', 0, ' ', .   
90e0: 20 30 2c 20 27 63 27 2c 20 30 2c 20 27 61 27 2c   0, 'c', 0, 'a',
90f0: 20 30 2c 20 27 6c 27 2c 20 30 2c 20 27 6c 27 2c   0, 'l', 0, 'l',
9100: 20 30 2c 20 27 65 27 2c 20 30 2c 20 27 64 27 2c   0, 'e', 0, 'd',
9110: 20 30 2c 20 27 20 27 2c 20 0a 20 20 20 20 30 2c   0, ' ', .    0,
9120: 20 27 6f 27 2c 20 30 2c 20 27 75 27 2c 20 30 2c   'o', 0, 'u', 0,
9130: 20 27 74 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20   't', 0, ' ', . 
9140: 20 20 20 30 2c 20 27 6f 27 2c 20 30 2c 20 27 66     0, 'o', 0, 'f
9150: 27 2c 20 30 2c 20 27 20 27 2c 20 0a 20 20 20 20  ', 0, ' ', .    
9160: 30 2c 20 27 73 27 2c 20 30 2c 20 27 65 27 2c 20  0, 's', 0, 'e', 
9170: 30 2c 20 27 71 27 2c 20 30 2c 20 27 75 27 2c 20  0, 'q', 0, 'u', 
9180: 30 2c 20 27 65 27 2c 20 30 2c 20 27 6e 27 2c 20  0, 'e', 0, 'n', 
9190: 30 2c 20 27 63 27 2c 20 30 2c 20 27 65 27 2c 20  0, 'c', 0, 'e', 
91a0: 30 2c 20 30 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20  0, 0, 0.  };..  
91b0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20  const void *z;. 
91c0: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
91d0: 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 28  return (void *)(
91e0: 26 6f 75 74 4f 66 4d 65 6d 42 65 5b 53 51 4c 49  &outOfMemBe[SQLI
91f0: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3d 3d  TE_UTF16NATIVE==
9200: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 3f 31  SQLITE_UTF16LE?1
9210: 3a 30 5d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  :0]);.  }.  if( 
9220: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
9230: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
9240: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76  ){.    return (v
9250: 6f 69 64 20 2a 29 28 26 6d 69 73 75 73 65 42 65  oid *)(&misuseBe
9260: 5b 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54  [SQLITE_UTF16NAT
9270: 49 56 45 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  IVE==SQLITE_UTF1
9280: 36 4c 45 3f 31 3a 30 5d 29 3b 0a 20 20 7d 0a 20  6LE?1:0]);.  }. 
9290: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
92a0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
92b0: 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
92c0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
92d0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
92e0: 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70  lue_text16(db->p
92f0: 45 72 72 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  Err);.  if( z==0
9300: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
9310: 61 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70  alueSetStr(db->p
9320: 45 72 72 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33  Err, -1, sqlite3
9330: 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f  ErrStr(db->errCo
9340: 64 65 29 2c 0a 20 20 20 20 20 20 20 20 20 53 51  de),.         SQ
9350: 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49 54  LITE_UTF8, SQLIT
9360: 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 7a  E_STATIC);.    z
9370: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
9380: 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72  _text16(db->pErr
9390: 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 41 20 6d 61  );.  }.  /* A ma
93a0: 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20  lloc() may have 
93b0: 66 61 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68  failed within th
93c0: 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  e call to sqlite
93d0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29  3_value_text16()
93e0: 0a 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20  .  ** above. If 
93f0: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
9400: 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d  , then the db->m
9410: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
9420: 20 6e 65 65 64 73 20 74 6f 0a 20 20 2a 2a 20 62   needs to.  ** b
9430: 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
9440: 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74   returning. Do t
9450: 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e  his directly, in
9460: 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 2a  stead of via.  *
9470: 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  * sqlite3ApiExit
9480: 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65 74  (), to avoid set
9490: 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ting the databas
94a0: 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d  e handle error m
94b0: 65 73 73 61 67 65 2e 0a 20 20 2a 2f 0a 20 20 64  essage..  */.  d
94c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
94d0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
94e0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
94f0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
9500: 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  z;.}.#endif /* S
9510: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
9520: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72   */../*.** Retur
9530: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
9540: 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65 6e  t error code gen
9550: 65 72 61 74 65 64 20 62 79 20 61 6e 20 53 51 4c  erated by an SQL
9560: 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66 20  ite routine. If 
9570: 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65  NULL is.** passe
9580: 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  d to this functi
9590: 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61 20  on, we assume a 
95a0: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
95b0: 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f  during sqlite3_o
95c0: 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pen()..*/.int sq
95d0: 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73 71  lite3_errcode(sq
95e0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66  lite3 *db){.  if
95f0: 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33  ( db && !sqlite3
9600: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
9610: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
9620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
9630: 55 53 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  USE;.  }.  if( !
9640: 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
9650: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
9660: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
9670: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
9680: 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62  db->errCode & db
9690: 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 0a 2f 2a  ->errMask;.}../*
96a0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
96b0: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
96c0: 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65  ion for database
96d0: 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65   "db".  The name
96e0: 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64   is zName.** and
96f0: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73   the encoding is
9700: 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   enc..*/.static 
9710: 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  int createCollat
9720: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  ion(.  sqlite3* 
9730: 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
9740: 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
9750: 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
9760: 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
9770: 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
9780: 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
9790: 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
97a0: 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
97b0: 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20  *).){.  CollSeq 
97c0: 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e  *pColl;.  int en
97d0: 63 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  c2;.  int nName;
97e0: 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
97f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9800: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  (db->mutex) );..
9810: 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
9820: 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
9830: 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
9840: 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
9850: 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
9860: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
9870: 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
9880: 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
9890: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
98a0: 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
98b0: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
98c0: 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
98d0: 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32  lly..  */.  enc2
98e0: 20 3d 20 65 6e 63 20 26 20 7e 53 51 4c 49 54 45   = enc & ~SQLITE
98f0: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 3b 0a  _UTF16_ALIGNED;.
9900: 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49    if( enc2==SQLI
9910: 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20  TE_UTF16 ){.    
9920: 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55 54  enc2 = SQLITE_UT
9930: 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20  F16NATIVE;.  }. 
9940: 20 69 66 28 20 28 65 6e 63 32 26 7e 33 29 21 3d   if( (enc2&~3)!=
9950: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
9960: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
9970: 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
9980: 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72  f this call is r
9990: 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61  emoving or repla
99a0: 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67  cing an existing
99b0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a   collation .  **
99c0: 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f   sequence. If so
99d0: 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
99e0: 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75  active VMs, retu
99f0: 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65 72  rn busy. If ther
9a00: 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63  e.  ** are no ac
9a10: 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69  tive VMs, invali
9a20: 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d  date any pre-com
9a30: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
9a40: 2e 0a 20 20 2a 2f 0a 20 20 6e 4e 61 6d 65 20 3d  ..  */.  nName =
9a50: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 28 64   sqlite3Strlen(d
9a60: 62 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 70 43 6f  b, zName);.  pCo
9a70: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
9a80: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
9a90: 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  enc2, zName, nNa
9aa0: 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43  me, 0);.  if( pC
9ab0: 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43  oll && pColl->xC
9ac0: 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62  mp ){.    if( db
9ad0: 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74 20  ->activeVdbeCnt 
9ae0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
9af0: 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
9b00: 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
9b10: 22 55 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74  "Unable to delet
9b20: 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69  e/modify collati
9b30: 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20  on sequence due 
9b40: 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
9b50: 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65  ents");.      re
9b60: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
9b70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
9b80: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
9b90: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
9ba0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c  ..    /* If coll
9bb0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70  ation sequence p
9bc0: 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64  Coll was created
9bd0: 20 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63   directly by a c
9be0: 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71  all to.    ** sq
9bf0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
9c00: 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20  lation, and not 
9c10: 67 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e  generated by syn
9c20: 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20  thCollSeq(),.   
9c30: 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70   ** then any cop
9c40: 69 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74  ies made by synt
9c50: 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20  hCollSeq() need 
9c60: 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65  to be invalidate
9c70: 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20  d..    ** Also, 
9c80: 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75  collation destru
9c90: 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78  ctor - CollSeq.x
9ca0: 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e  Del() - function
9cb0: 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a   may need.    **
9cc0: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20   to be called.. 
9cd0: 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28     */ .    if( (
9ce0: 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51  pColl->enc & ~SQ
9cf0: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
9d00: 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20  ED)==enc2 ){.   
9d10: 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c     CollSeq *aCol
9d20: 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46  l = sqlite3HashF
9d30: 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ind(&db->aCollSe
9d40: 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  q, zName, nName)
9d50: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
9d60: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
9d70: 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  3; j++){.       
9d80: 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61   CollSeq *p = &a
9d90: 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  Coll[j];.       
9da0: 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f   if( p->enc==pCo
9db0: 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20  ll->enc ){.     
9dc0: 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65 6c       if( p->xDel
9dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9de0: 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65 72  p->xDel(p->pUser
9df0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
9e00: 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d 70           p->xCmp
9e10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
9e20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9e30: 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  }..  pColl = sql
9e40: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
9e50: 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e  db, (u8)enc2, zN
9e60: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 31 29 3b 0a  ame, nName, 1);.
9e70: 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a 20    if( pColl ){. 
9e80: 20 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d     pColl->xCmp =
9e90: 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 70   xCompare;.    p
9ea0: 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43  Coll->pUser = pC
9eb0: 74 78 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 78  tx;.    pColl->x
9ec0: 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 20 20  Del = xDel;.    
9ed0: 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 65 6e 63  pColl->enc = enc
9ee0: 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54  2 | (enc & SQLIT
9ef0: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
9f00: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
9f10: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
9f20: 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e  OK, 0);.  return
9f30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
9f40: 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79  /*.** This array
9f50: 20 64 65 66 69 6e 65 73 20 68 61 72 64 20 75 70   defines hard up
9f60: 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69  per bounds on li
9f70: 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65  mit values.  The
9f80: 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20  .** initializer 
9f90: 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20  must be kept in 
9fa0: 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 53 51  sync with the SQ
9fb0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20  LITE_LIMIT_*.** 
9fc0: 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69  #defines in sqli
9fd0: 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63  te3.h..*/.static
9fe0: 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64   const int aHard
9ff0: 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51  Limit[] = {.  SQ
a000: 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c  LITE_MAX_LENGTH,
a010: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51  .  SQLITE_MAX_SQ
a020: 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  L_LENGTH,.  SQLI
a030: 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20  TE_MAX_COLUMN,. 
a040: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
a050: 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45  _DEPTH,.  SQLITE
a060: 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
a070: 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LECT,.  SQLITE_M
a080: 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51  AX_VDBE_OP,.  SQ
a090: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
a0a0: 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f  N_ARG,.  SQLITE_
a0b0: 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20  MAX_ATTACHED,.  
a0c0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
a0d0: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a  PATTERN_LENGTH,.
a0e0: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52    SQLITE_MAX_VAR
a0f0: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a 7d 3b  IABLE_NUMBER,.};
a100: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72  ../*.** Make sur
a110: 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74  e the hard limit
a120: 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61  s are set to rea
a130: 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a  sonable values.*
a140: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  /.#if SQLITE_MAX
a150: 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72  _LENGTH<100.# er
a160: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
a170: 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
a180: 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
a190: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
a1a0: 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _SQL_LENGTH<100.
a1b0: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
a1c0: 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75  AX_SQL_LENGTH mu
a1d0: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
a1e0: 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
a1f0: 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
a200: 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  GTH>SQLITE_MAX_L
a210: 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51  ENGTH.# error SQ
a220: 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
a230: 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20  GTH must not be 
a240: 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c  greater than SQL
a250: 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23  ITE_MAX_LENGTH.#
a260: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
a270: 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
a280: 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53  LECT<2.# error S
a290: 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
a2a0: 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62  ND_SELECT must b
a2b0: 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e  e at least 2.#en
a2c0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
a2d0: 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20  AX_VDBE_OP<40.# 
a2e0: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
a2f0: 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65  _VDBE_OP must be
a300: 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e   at least 40.#en
a310: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
a320: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c  AX_FUNCTION_ARG<
a330: 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
a340: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 32 37  FUNCTION_ARG>127
a350: 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
a360: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
a370: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
a380: 20 30 20 61 6e 64 20 31 32 37 0a 23 65 6e 64 69   0 and 127.#endi
a390: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
a3a0: 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53  _ATTACHED<0 || S
a3b0: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
a3c0: 45 44 3e 33 30 0a 23 20 65 72 72 6f 72 20 53 51  ED>30.# error SQ
a3d0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
a3e0: 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  D must be betwee
a3f0: 6e 20 30 20 61 6e 64 20 33 30 0a 23 65 6e 64 69  n 0 and 30.#endi
a400: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
a410: 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
a420: 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53  NGTH<1.# error S
a430: 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
a440: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75  ATTERN_LENGTH mu
a450: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
a460: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
a470: 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
a480: 4e 55 4d 42 45 52 3c 31 0a 23 20 65 72 72 6f 72  NUMBER<1.# error
a490: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
a4a0: 41 42 4c 45 5f 4e 55 4d 42 45 52 20 6d 75 73 74  ABLE_NUMBER must
a4b0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
a4c0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
a4d0: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36  _MAX_COLUMN>3276
a4e0: 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  7.# error SQLITE
a4f0: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74  _MAX_COLUMN must
a500: 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36   not exceed 3276
a510: 37 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  7.#endif.../*.**
a520: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
a530: 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52  e of a limit.  R
a540: 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
a550: 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  lue..** If an in
a560: 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65  valid limit inde
a570: 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72  x is supplied, r
a580: 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b  eport -1..** Mak
a590: 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74  e no changes but
a5a0: 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68   still report th
a5b0: 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74  e old value if t
a5c0: 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20  he.** new limit 
a5d0: 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  is negative..**.
a5e0: 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c  ** A new lower l
a5f0: 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68  imit does not sh
a600: 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f  rink existing co
a610: 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20  nstructs..** It 
a620: 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20  merely prevents 
a630: 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74  new constructs t
a640: 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20 6c  hat exceed the l
a650: 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72  imit.** from for
a660: 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ming..*/.int sql
a670: 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74  ite3_limit(sqlit
a680: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69  e3 *db, int limi
a690: 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69  tId, int newLimi
a6a0: 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d  t){.  int oldLim
a6b0: 69 74 3b 0a 20 20 69 66 28 20 6c 69 6d 69 74 49  it;.  if( limitI
a6c0: 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d  d<0 || limitId>=
a6d0: 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29  SQLITE_N_LIMIT )
a6e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
a6f0: 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20  .  }.  oldLimit 
a700: 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d  = db->aLimit[lim
a710: 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77  itId];.  if( new
a720: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
a730: 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61  if( newLimit>aHa
a740: 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
a750: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d   ){.      newLim
a760: 69 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b  it = aHardLimit[
a770: 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 20 20 7d 0a  limitId];.    }.
a780: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c      db->aLimit[l
a790: 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d  imitId] = newLim
a7a0: 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
a7b0: 20 6f 6c 64 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a   oldLimit;.}../*
a7c0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a7d0: 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f   does the work o
a7e0: 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61  f opening a data
a7f0: 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f  base on behalf o
a800: 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  f.** sqlite3_ope
a810: 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  n() and sqlite3_
a820: 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61  open16(). The da
a830: 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
a840: 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a  "zFilename"  .**
a850: 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65   is UTF-8 encode
a860: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
a870: 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20   openDatabase(. 
a880: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
a890: 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62  lename, /* Datab
a8a0: 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46  ase filename UTF
a8b0: 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20  -8 encoded */.  
a8c0: 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
a8d0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
a8e0: 65 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65  eturned database
a8f0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73   handle */.  uns
a900: 69 67 6e 65 64 20 66 6c 61 67 73 2c 20 20 20 20  igned flags,    
a910: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e      /* Operation
a920: 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  al flags */.  co
a930: 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
a940: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
a950: 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a  the VFS to use *
a960: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
a970: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
a980: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
a990: 20 20 69 6e 74 20 69 73 54 68 72 65 61 64 73 61    int isThreadsa
a9a0: 66 65 20 3d 20 31 3b 0a 0a 23 69 66 6e 64 65 66  fe = 1;..#ifndef
a9b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
a9c0: 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c  OINIT.  rc = sql
a9d0: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
a9e0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
a9f0: 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
aa00: 0a 20 20 69 66 28 20 66 6c 61 67 73 26 53 51 4c  .  if( flags&SQL
aa10: 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
aa20: 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
aa30: 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20  safe = 0;.  }.. 
aa40: 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66   /* Remove harmf
aa50: 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65  ul bits from the
aa60: 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
aa70: 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20   */.  flags &=  
aa80: 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  ~( SQLITE_OPEN_D
aa90: 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20  ELETEONCLOSE |. 
aaa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
aab0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
aac0: 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  B |.            
aad0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
aae0: 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20  EMP_DB | .      
aaf0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
ab00: 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
ab10: 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  B | .           
ab20: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
ab30: 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a  MAIN_JOURNAL | .
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
ab50: 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
ab60: 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
ab70: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
ab80: 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
ab90: 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
aba0: 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
abb0: 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a  ASTER_JOURNAL |.
abc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
abd0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
abe0: 45 58 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  EX.             
abf0: 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
ac00: 65 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74  e the sqlite dat
ac10: 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  a structure */. 
ac20: 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c   db = sqlite3Mal
ac30: 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
ac40: 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66  sqlite3) );.  if
ac50: 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f  ( db==0 ) goto o
ac60: 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28  pendb_out;.  if(
ac70: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
ac80: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
ac90: 26 26 20 69 73 54 68 72 65 61 64 73 61 66 65 20  && isThreadsafe 
aca0: 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78  ){.    db->mutex
acb0: 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41   = sqlite3MutexA
acc0: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
acd0: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
ace0: 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d    if( db->mutex=
acf0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
ad00: 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20  te3_free(db);.  
ad10: 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20      db = 0;.    
ad20: 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
ad30: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  t;.    }.  }.  s
ad40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
ad50: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
ad60: 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30   db->errMask = 0
ad70: 78 66 66 3b 0a 20 20 64 62 2d 3e 70 72 69 6f 72  xff;.  db->prior
ad80: 4e 65 77 52 6f 77 69 64 20 3d 20 30 3b 0a 20 20  NewRowid = 0;.  
ad90: 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64  db->nDb = 2;.  d
ada0: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
adb0: 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20  E_MAGIC_BUSY;.  
adc0: 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44  db->aDb = db->aD
add0: 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65  bStatic;..  asse
ade0: 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  rt( sizeof(db->a
adf0: 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61  Limit)==sizeof(a
ae00: 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20  HardLimit) );.  
ae10: 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69  memcpy(db->aLimi
ae20: 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73  t, aHardLimit, s
ae30: 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
ae40: 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f  ));.  db->autoCo
ae50: 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e  mmit = 1;.  db->
ae60: 6e 65 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31  nextAutovac = -1
ae70: 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  ;.  db->nextPage
ae80: 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  size = 0;.  db->
ae90: 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
aea0: 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 0a 23 69  ShortColNames.#i
aeb0: 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
aec0: 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20  _FILE_FORMAT<4. 
aed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aee0: 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46  | SQLITE_LegacyF
aef0: 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69  ileFmt.#endif.#i
af00: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
af10: 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
af20: 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
af30: 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64     | SQLITE_Load
af40: 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66  Extension.#endif
af50: 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74  .      ;.  sqlit
af60: 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e  e3HashInit(&db->
af70: 61 43 6f 6c 6c 53 65 71 2c 20 53 51 4c 49 54 45  aCollSeq, SQLITE
af80: 5f 48 41 53 48 5f 53 54 52 49 4e 47 2c 20 30 29  _HASH_STRING, 0)
af90: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
afa0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
afb0: 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68  LE.  sqlite3Hash
afc0: 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c  Init(&db->aModul
afd0: 65 2c 20 53 51 4c 49 54 45 5f 48 41 53 48 5f 53  e, SQLITE_HASH_S
afe0: 54 52 49 4e 47 2c 20 30 29 3b 0a 23 65 6e 64 69  TRING, 0);.#endi
aff0: 66 0a 0a 20 20 64 62 2d 3e 70 56 66 73 20 3d 20  f..  db->pVfs = 
b000: 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
b010: 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20 21 64  (zVfs);.  if( !d
b020: 62 2d 3e 70 56 66 73 20 29 7b 0a 20 20 20 20 72  b->pVfs ){.    r
b030: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
b040: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
b050: 6f 72 28 64 62 2c 20 72 63 2c 20 22 6e 6f 20 73  or(db, rc, "no s
b060: 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20 7a 56  uch vfs: %s", zV
b070: 66 73 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  fs);.    goto op
b080: 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20  endb_out;.  }.. 
b090: 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65 66 61   /* Add the defa
b0a0: 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ult collation se
b0b0: 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e 20 42  quence BINARY. B
b0c0: 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f 72 20  INARY works for 
b0d0: 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20  both UTF-8.  ** 
b0e0: 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f 20 61  and UTF-16, so a
b0f0: 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66 6f 72  dd a version for
b100: 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64 20 61   each to avoid a
b110: 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79 0a 20  ny unnecessary. 
b120: 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e   ** conversions.
b130: 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20   The only error 
b140: 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72 20 68  that can occur h
b150: 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28  ere is a malloc(
b160: 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2f 0a  ) failure..  */.
b170: 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
b180: 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20  n(db, "BINARY", 
b190: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20  SQLITE_UTF8, 0, 
b1a0: 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
b1b0: 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
b1c0: 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
b1d0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c   SQLITE_UTF16BE,
b1e0: 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
b1f0: 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
b200: 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
b210: 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  RY", SQLITE_UTF1
b220: 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  6LE, 0, binCollF
b230: 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
b240: 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
b250: 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55  RTRIM", SQLITE_U
b260: 54 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62  TF8, (void*)1, b
b270: 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
b280: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
b290: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
b2a0: 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
b2b0: 20 7d 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f   }.  db->pDfltCo
b2c0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
b2d0: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49  CollSeq(db, SQLI
b2e0: 54 45 5f 55 54 46 38 2c 20 22 42 49 4e 41 52 59  TE_UTF8, "BINARY
b2f0: 22 2c 20 36 2c 20 30 29 3b 0a 20 20 61 73 73 65  ", 6, 0);.  asse
b300: 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  rt( db->pDfltCol
b310: 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  l!=0 );..  /* Al
b320: 73 6f 20 61 64 64 20 61 20 55 54 46 2d 38 20 63  so add a UTF-8 c
b330: 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
b340: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
b350: 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61 74 65 43  ce. */.  createC
b360: 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f  ollation(db, "NO
b370: 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54  CASE", SQLITE_UT
b380: 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c  F8, 0, nocaseCol
b390: 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a  latingFunc, 0);.
b3a0: 0a 20 20 2f 2a 20 53 65 74 20 66 6c 61 67 73 20  .  /* Set flags 
b3b0: 6f 6e 20 74 68 65 20 62 75 69 6c 74 2d 69 6e 20  on the built-in 
b3c0: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
b3d0: 63 65 73 20 2a 2f 0a 20 20 64 62 2d 3e 70 44 66  ces */.  db->pDf
b3e0: 6c 74 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d 20 53  ltColl->type = S
b3f0: 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e 41 52  QLITE_COLL_BINAR
b400: 59 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  Y;.  pColl = sql
b410: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
b420: 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  db, SQLITE_UTF8,
b430: 20 22 4e 4f 43 41 53 45 22 2c 20 36 2c 20 30 29   "NOCASE", 6, 0)
b440: 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b  ;.  if( pColl ){
b450: 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 74 79 70 65  .    pColl->type
b460: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e   = SQLITE_COLL_N
b470: 4f 43 41 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  OCASE;.  }..  /*
b480: 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e   Open the backen
b490: 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65  d database drive
b4a0: 72 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46  r */.  db->openF
b4b0: 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
b4c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
b4d0: 65 46 61 63 74 6f 72 79 28 64 62 2c 20 7a 46 69  eFactory(db, zFi
b4e0: 6c 65 6e 61 6d 65 2c 20 30 2c 20 53 51 4c 49 54  lename, 0, SQLIT
b4f0: 45 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f  E_DEFAULT_CACHE_
b500: 53 49 5a 45 2c 20 0a 20 20 20 20 20 20 20 20 20  SIZE, .         
b510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b520: 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45    flags | SQLITE
b530: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 2c 0a 20  _OPEN_MAIN_DB,. 
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b550: 20 20 20 20 20 20 20 20 20 20 26 64 62 2d 3e 61            &db->a
b560: 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66  Db[0].pBt);.  if
b570: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b580: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
b590: 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a  ror(db, rc, 0);.
b5a0: 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
b5b0: 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61  out;.  }.  db->a
b5c0: 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[0].pSchema = 
b5d0: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
b5e0: 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  (db, db->aDb[0].
b5f0: 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  pBt);.  db->aDb[
b600: 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  1].pSchema = sql
b610: 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62  ite3SchemaGet(db
b620: 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65  , 0);...  /* The
b630: 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f   default safety_
b640: 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61  level for the ma
b650: 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 27  in database is '
b660: 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74  full'; for the t
b670: 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  emp.  ** databas
b680: 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20  e it is 'NONE'. 
b690: 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65  This matches the
b6a0: 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65 66   pager layer def
b6b0: 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20  aults.  .  */.  
b6c0: 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65  db->aDb[0].zName
b6d0: 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d   = "main";.  db-
b6e0: 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[0].safety_l
b6f0: 65 76 65 6c 20 3d 20 33 3b 0a 23 69 66 6e 64 65  evel = 3;.#ifnde
b700: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  f SQLITE_OMIT_TE
b710: 4d 50 44 42 0a 20 20 64 62 2d 3e 61 44 62 5b 31  MPDB.  db->aDb[1
b720: 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22  ].zName = "temp"
b730: 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73  ;.  db->aDb[1].s
b740: 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b  afety_level = 1;
b750: 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d  .#endif..  db->m
b760: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
b770: 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20  GIC_OPEN;.  if( 
b780: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
b790: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
b7a0: 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ndb_out;.  }..  
b7b0: 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20  /* Register all 
b7c0: 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f  built-in functio
b7d0: 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61  ns, but do not a
b7e0: 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74  ttempt to read t
b7f0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
b800: 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69   schema yet. Thi
b810: 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74  s is delayed unt
b820: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  il the first tim
b830: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  e the database. 
b840: 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e   ** is accessed.
b850: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
b860: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
b870: 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  OK, 0);.  sqlite
b880: 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e  3RegisterBuiltin
b890: 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a  Functions(db);..
b8a0: 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61    /* Load automa
b8b0: 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d  tic extensions -
b8c0: 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74   extensions that
b8d0: 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73   have been regis
b8e0: 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67  tered.  ** using
b8f0: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74   the sqlite3_aut
b900: 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e  omatic_extension
b910: 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 28  () API..  */.  (
b920: 76 6f 69 64 29 73 71 6c 69 74 65 33 41 75 74 6f  void)sqlite3Auto
b930: 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64  LoadExtensions(d
b940: 62 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  b);.  if( sqlite
b950: 33 5f 65 72 72 63 6f 64 65 28 64 62 29 21 3d 53  3_errcode(db)!=S
b960: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b970: 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
b980: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
b990: 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a  ITE_ENABLE_FTS1.
b9a0: 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
b9b0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65  cFailed ){.    e
b9c0: 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
b9d0: 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65  3Fts1Init(sqlite
b9e0: 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
b9f0: 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62  lite3Fts1Init(db
ba00: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
ba10: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
ba20: 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21  BLE_FTS2.  if( !
ba30: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ba40: 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
ba50: 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20  K ){.    extern 
ba60: 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49  int sqlite3Fts2I
ba70: 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20  nit(sqlite3*);. 
ba80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
ba90: 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts2Init(db);.  }
baa0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
bab0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
bac0: 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S3.  if( !db->ma
bad0: 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63  llocFailed && rc
bae0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
baf0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46     rc = sqlite3F
bb00: 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  ts3Init(db);.  }
bb10: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
bb20: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43  SQLITE_ENABLE_IC
bb30: 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  U.  if( !db->mal
bb40: 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
bb50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bb60: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
bb70: 69 74 65 33 49 63 75 49 6e 69 74 28 73 71 6c 69  ite3IcuInit(sqli
bb80: 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  te3*);.    rc = 
bb90: 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64  sqlite3IcuInit(d
bba0: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
bbb0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
bbc0: 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28  ABLE_RTREE.  if(
bbd0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
bbe0: 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
bbf0: 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
bc00: 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28  qlite3RtreeInit(
bc10: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
bc20: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
bc30: 64 62 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f  db, rc, 0);..  /
bc40: 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55  * -DSQLITE_DEFAU
bc50: 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
bc60: 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56  1 makes EXCLUSIV
bc70: 45 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  E the default lo
bc80: 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
bc90: 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55    -DSQLITE_DEFAU
bca0: 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
bcb0: 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68  0 make NORMAL th
bcc0: 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
bcd0: 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f  g.  ** mode.  Do
bce0: 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61  ing nothing at a
bcf0: 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f  ll also makes NO
bd00: 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
bd10: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
bd20: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
bd30: 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e  KING_MODE.  db->
bd40: 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53  dfltLockMode = S
bd50: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
bd60: 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71  CKING_MODE;.  sq
bd70: 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
bd80: 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72  gMode(sqlite3Btr
bd90: 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b  eePager(db->aDb[
bda0: 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20  0].pBt),.       
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdc0: 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
bdd0: 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b  T_LOCKING_MODE);
bde0: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e  .#endif..  /* En
bdf0: 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69  able the lookasi
be00: 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  de-malloc subsys
be10: 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f  tem */.  setupLo
be20: 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73  okaside(db, 0, s
be30: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
be40: 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 20  ig.szLookaside, 
be50: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
be60: 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b  fig.nLookaside);
be70: 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20  ..opendb_out:.  
be80: 69 66 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73  if( db ){.    as
be90: 73 65 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21  sert( db->mutex!
bea0: 3d 30 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61  =0 || isThreadsa
beb0: 66 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  fe==0 || sqlite3
bec0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
bed0: 6c 6c 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20  llMutex==0 );.  
bee0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
bef0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
bf00: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
bf10: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
bf20: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
bf30: 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
bf40: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
bf50: 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  );.    db = 0;. 
bf60: 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
bf70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
bf80: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
bf90: 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20  TE_MAGIC_SICK;. 
bfa0: 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b   }.  *ppDb = db;
bfb0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
bfc0: 33 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b  3ApiExit(0, rc);
bfd0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
bfe0: 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61   new database ha
bff0: 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
c000: 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e  ite3_open(.  con
c010: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
c020: 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  me, .  sqlite3 *
c030: 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75  *ppDb .){.  retu
c040: 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  rn openDatabase(
c050: 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c  zFilename, ppDb,
c060: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c070: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
c080: 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
c090: 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
c0a0: 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c  E, 0);.}.int sql
c0b0: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20  ite3_open_v2(.  
c0c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65  const char *file
c0d0: 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62  name,   /* Datab
c0e0: 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54  ase filename (UT
c0f0: 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65  F-8) */.  sqlite
c100: 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20  3 **ppDb,       
c110: 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65    /* OUT: SQLite
c120: 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20   db handle */.  
c130: 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
c140: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
c150: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
c160: 20 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a   *zVfs        /*
c170: 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64   Name of VFS mod
c180: 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b  ule to use */.){
c190: 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61  .  return openDa
c1a0: 74 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c  tabase(filename,
c1b0: 20 70 70 44 62 2c 20 66 6c 61 67 73 2c 20 7a 56   ppDb, flags, zV
c1c0: 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  fs);.}..#ifndef 
c1d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
c1e0: 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  6./*.** Open a n
c1f0: 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ew database hand
c200: 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
c210: 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e  e3_open16(.  con
c220: 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61  st void *zFilena
c230: 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  me, .  sqlite3 *
c240: 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61 72 20  *ppDb.){.  char 
c250: 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65  const *zFilename
c260: 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d  8;   /* zFilenam
c270: 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46  e encoded in UTF
c280: 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20 55 54  -8 instead of UT
c290: 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65  F-16 */.  sqlite
c2a0: 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
c2b0: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65   int rc;..  asse
c2c0: 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b  rt( zFilename );
c2d0: 0a 20 20 61 73 73 65 72 74 28 20 70 70 44 62 20  .  assert( ppDb 
c2e0: 29 3b 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a  );.  *ppDb = 0;.
c2f0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
c300: 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72  MIT_AUTOINIT.  r
c310: 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74  c = sqlite3_init
c320: 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20  ialize();.  if( 
c330: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
c340: 23 65 6e 64 69 66 0a 20 20 70 56 61 6c 20 3d 20  #endif.  pVal = 
c350: 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65 77 28  sqlite3ValueNew(
c360: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 61 6c  0);.  sqlite3Val
c370: 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c 20 2d  ueSetStr(pVal, -
c380: 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51  1, zFilename, SQ
c390: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
c3a0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
c3b0: 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d  ;.  zFilename8 =
c3c0: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54 65 78   sqlite3ValueTex
c3d0: 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55  t(pVal, SQLITE_U
c3e0: 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c  TF8);.  if( zFil
c3f0: 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63  ename8 ){.    rc
c400: 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28   = openDatabase(
c410: 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62  zFilename8, ppDb
c420: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
c430: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
c440: 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20  PEN_READWRITE | 
c450: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
c460: 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73 73 65  TE, 0);.    asse
c470: 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d  rt( *ppDb || rc=
c480: 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
c490: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
c4a0: 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48 61 73  ITE_OK && !DbHas
c4b0: 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62 2c 20  Property(*ppDb, 
c4c0: 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64  0, DB_SchemaLoad
c4d0: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 45 4e 43  ed) ){.      ENC
c4e0: 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49 54 45  (*ppDb) = SQLITE
c4f0: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
c500: 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
c510: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
c520: 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  EM;.  }.  sqlite
c530: 33 56 61 6c 75 65 46 72 65 65 28 70 56 61 6c 29  3ValueFree(pVal)
c540: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ;..  return sqli
c550: 74 65 33 41 70 69 45 78 69 74 28 30 2c 20 72 63  te3ApiExit(0, rc
c560: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
c570: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
c580: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73   */../*.** Regis
c590: 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
c5a0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
c5b0: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
c5c0: 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
c5d0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
c5e0: 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c  collation(.  sql
c5f0: 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
c600: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
c610: 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76  .  int enc, .  v
c620: 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74  oid* pCtx,.  int
c630: 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64  (*xCompare)(void
c640: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
c650: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64  *,int,const void
c660: 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
c670: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
c680: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
c690: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
c6a0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
c6b0: 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f  .  rc = createCo
c6c0: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
c6d0: 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78 43  e, enc, pCtx, xC
c6e0: 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72 63  ompare, 0);.  rc
c6f0: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
c700: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
c710: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
c720: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
c730: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c740: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
c750: 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
c760: 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
c770: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
c780: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c790: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
c7a0: 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a  n_v2(.  sqlite3*
c7b0: 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68   db, .  const ch
c7c0: 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e  ar *zName, .  in
c7d0: 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
c7e0: 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
c7f0: 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
c800: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
c810: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20  ,const void*),. 
c820: 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69   void(*xDel)(voi
c830: 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  d*).){.  int rc;
c840: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
c850: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
c860: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
c870: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c880: 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43  ;.  rc = createC
c890: 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  ollation(db, zNa
c8a0: 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78  me, enc, pCtx, x
c8b0: 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a  Compare, xDel);.
c8c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
c8d0: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
c8e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
c8f0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
c900: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
c910: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c920: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
c930: 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
c940: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
c950: 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
c960: 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
c970: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
c980: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31  reate_collation1
c990: 36 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  6(.  sqlite3* db
c9a0: 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  , .  const void 
c9b0: 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e  *zName,.  int en
c9c0: 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
c9d0: 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
c9e0: 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
c9f0: 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
ca00: 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  st void*).){.  i
ca10: 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
ca20: 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65  K;.  char *zName
ca30: 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  8;.  sqlite3_mut
ca40: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
ca50: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
ca60: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
ca70: 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73   );.  zName8 = s
ca80: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
ca90: 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20  b, zName, -1);. 
caa0: 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20   if( zName8 ){. 
cab0: 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f     rc = createCo
cac0: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
cad0: 65 38 2c 20 65 6e 63 2c 20 70 43 74 78 2c 20 78  e8, enc, pCtx, x
cae0: 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 20  Compare, 0);.   
caf0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
cb00: 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a  b, zName8);.  }.
cb10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
cb20: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
cb30: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
cb40: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
cb50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
cb60: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
cb70: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
cb80: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
cb90: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
cba0: 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c  nce factory call
cbb0: 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61  back with the da
cbc0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
cbd0: 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79   db. Replace any
cbe0: 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74   previously inst
cbf0: 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  alled collation 
cc00: 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
cc10: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cc20: 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
cc30: 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  d(.  sqlite3 *db
cc40: 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c  , .  void *pColl
cc50: 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f  NeededArg, .  vo
cc60: 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29  id(*xCollNeeded)
cc70: 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c  (void*,sqlite3*,
cc80: 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e  int eTextRep,con
cc90: 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73  st char*).){.  s
cca0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
ccb0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
ccc0: 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
ccd0: 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a   = xCollNeeded;.
cce0: 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
ccf0: 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70  d16 = 0;.  db->p
cd00: 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20  CollNeededArg = 
cd10: 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a  pCollNeededArg;.
cd20: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
cd30: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
cd40: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
cd50: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
cd60: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
cd70: 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  16./*.** Registe
cd80: 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  r a collation se
cd90: 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63  quence factory c
cda0: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
cdb0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
cdc0: 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20  .** db. Replace 
cdd0: 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69  any previously i
cde0: 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69  nstalled collati
cdf0: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
ce00: 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ory..*/.int sqli
ce10: 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
ce20: 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65  eded16(.  sqlite
ce30: 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a  3 *db, .  void *
ce40: 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20  pCollNeededArg, 
ce50: 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65  .  void(*xCollNe
ce60: 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71  eded16)(void*,sq
ce70: 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74  lite3*,int eText
ce80: 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29  Rep,const void*)
ce90: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
cea0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
ceb0: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  tex);.  db->xCol
cec0: 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20 64  lNeeded = 0;.  d
ced0: 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
cee0: 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36   = xCollNeeded16
cef0: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65  ;.  db->pCollNee
cf00: 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65  dedArg = pCollNe
cf10: 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74  ededArg;.  sqlit
cf20: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
cf30: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
cf40: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
cf50: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
cf60: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
cf70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
cf80: 4f 4d 49 54 5f 47 4c 4f 42 41 4c 52 45 43 4f 56  OMIT_GLOBALRECOV
cf90: 45 52 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ER./*.** This fu
cfa0: 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e  nction is now an
cfb0: 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74   anachronism. It
cfc0: 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64   used to be used
cfd0: 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d   to recover from
cfe0: 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66   a.** malloc() f
cff0: 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69  ailure, but SQLi
d000: 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73  te now does this
d010: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a   automatically..
d020: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67  */.int sqlite3_g
d030: 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f  lobal_recover(vo
d040: 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  id){.  return SQ
d050: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
d060: 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f  f../*.** Test to
d070: 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
d080: 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
d090: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69   connection is i
d0a0: 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20  n autocommit.** 
d0b0: 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52  mode.  Return TR
d0c0: 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20  UE if it is and 
d0d0: 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41  FALSE if not.  A
d0e0: 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69  utocommit mode i
d0f0: 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75  s on.** by defau
d100: 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  lt.  Autocommit 
d110: 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61  is disabled by a
d120: 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
d130: 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a   and reenabled.*
d140: 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f  * by the next CO
d150: 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  MMIT or ROLLBACK
d160: 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48 49  ..**.******* THI
d170: 53 20 49 53 20 41 4e 20 45 58 50 45 52 49 4d 45  S IS AN EXPERIME
d180: 4e 54 41 4c 20 41 50 49 20 41 4e 44 20 49 53 20  NTAL API AND IS 
d190: 53 55 42 4a 45 43 54 20 54 4f 20 43 48 41 4e 47  SUBJECT TO CHANG
d1a0: 45 20 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20  E ******.*/.int 
d1b0: 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f  sqlite3_get_auto
d1c0: 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  commit(sqlite3 *
d1d0: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
d1e0: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a  ->autoCommit;.}.
d1f0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
d200: 45 42 55 47 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  EBUG./*.** The f
d210: 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65  ollowing routine
d220: 20 69 73 20 73 75 62 74 69 74 75 74 65 64 20 66   is subtituted f
d230: 6f 72 20 63 6f 6e 73 74 61 6e 74 20 53 51 4c 49  or constant SQLI
d240: 54 45 5f 43 4f 52 52 55 50 54 20 69 6e 0a 2a 2a  TE_CORRUPT in.**
d250: 20 64 65 62 75 67 67 69 6e 67 20 62 75 69 6c 64   debugging build
d260: 73 2e 20 20 54 68 69 73 20 70 72 6f 76 69 64 65  s.  This provide
d270: 73 20 61 20 77 61 79 20 74 6f 20 73 65 74 20 61  s a way to set a
d280: 20 62 72 65 61 6b 70 6f 69 6e 74 20 66 6f 72 20   breakpoint for 
d290: 77 68 65 6e 0a 2a 2a 20 63 6f 72 72 75 70 74 69  when.** corrupti
d2a0: 6f 6e 20 69 73 20 66 69 72 73 74 20 64 65 74 65  on is first dete
d2b0: 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  cted..*/.int sql
d2c0: 69 74 65 33 43 6f 72 72 75 70 74 28 76 6f 69 64  ite3Corrupt(void
d2d0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
d2e0: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 23 65  TE_CORRUPT;.}.#e
d2f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
d300: 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63   is a convenienc
d310: 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d  e routine that m
d320: 61 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61  akes sure that a
d330: 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66  ll thread-specif
d340: 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74  ic.** data for t
d350: 68 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62  his thread has b
d360: 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e  een deallocated.
d370: 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f  .**.** SQLite no
d380: 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72   longer uses thr
d390: 65 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74  ead-specific dat
d3a0: 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  a so this routin
d3b0: 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f  e is now a.** no
d3c0: 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61  -op.  It is reta
d3d0: 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69  ined for histori
d3e0: 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  cal compatibilit
d3f0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
d400: 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75  e3_thread_cleanu
d410: 70 28 76 6f 69 64 29 7b 0a 7d 0a 0a 2f 2a 0a 2a  p(void){.}../*.*
d420: 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e  * Return meta in
d430: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
d440: 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d  a specific colum
d450: 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  n of a database 
d460: 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  table..** See co
d470: 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33  mment in sqlite3
d480: 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29  .h (sqlite.h.in)
d490: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
d4a0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
d4b0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
d4c0: 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65  ADATA.int sqlite
d4d0: 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
d4e0: 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74  etadata(.  sqlit
d4f0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
d500: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
d510: 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  tion handle */. 
d520: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
d530: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
d540: 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72  Database name or
d550: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
d560: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d   char *zTableNam
d570: 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  e,     /* Table 
d580: 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  name */.  const 
d590: 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d  char *zColumnNam
d5a0: 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  e,    /* Column 
d5b0: 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  name */.  char c
d5c0: 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70  onst **pzDataTyp
d5d0: 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  e,    /* OUTPUT:
d5e0: 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74   Declared data t
d5f0: 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ype */.  char co
d600: 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c  nst **pzCollSeq,
d610: 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
d620: 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
d630: 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  ce name */.  int
d640: 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20   *pNotNull,     
d650: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
d660: 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20  UT: True if NOT 
d670: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20  NULL constraint 
d680: 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20  exists */.  int 
d690: 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20  *pPrimaryKey,   
d6a0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
d6b0: 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
d6c0: 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a  n part of PK */.
d6d0: 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20    int *pAutoinc 
d6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d6f0: 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
d700: 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d   column is auto-
d710: 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  increment */.){.
d720: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
d730: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
d740: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
d750: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
d760: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
d770: 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ;..  char const 
d780: 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a  *zDataType = 0;.
d790: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43    char const *zC
d7a0: 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e  ollSeq = 0;.  in
d7b0: 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20  t notnull = 0;. 
d7c0: 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20   int primarykey 
d7d0: 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69  = 0;.  int autoi
d7e0: 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e  nc = 0;..  /* En
d7f0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
d800: 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65  e schema has bee
d810: 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71  n loaded */.  sq
d820: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
d830: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
d840: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
d850: 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c  etyOn(db);.  sql
d860: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
d870: 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71  l(db);.  rc = sq
d880: 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a  lite3Init(db, &z
d890: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
d8a0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
d8b0: 64 62 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  db);.  if( SQLIT
d8c0: 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
d8d0: 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
d8e0: 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
d8f0: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75   the table in qu
d900: 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62  estion */.  pTab
d910: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
d920: 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61  ble(db, zTableNa
d930: 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  me, zDbName);.  
d940: 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61  if( !pTab || pTa
d950: 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
d960: 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
d970: 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
d980: 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74    }..  /* Find t
d990: 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68  he column for wh
d9a0: 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75  ich info is requ
d9b0: 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 73  ested */.  if( s
d9c0: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
d9d0: 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  olumnName) ){.  
d9e0: 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69    iCol = pTab->i
d9f0: 50 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 69 43  PKey;.    if( iC
da00: 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ol>=0 ){.      p
da10: 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
da20: 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20  l[iCol];.    }. 
da30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
da40: 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
da50: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
da60: 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26  {.      pCol = &
da70: 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
da80: 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
da90: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
daa0: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75  ol->zName, zColu
dab0: 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  mnName) ){.     
dac0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
dad0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
dae0: 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  iCol==pTab->nCol
daf0: 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
db00: 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   0;.      goto e
db10: 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  rror_out;.    }.
db20: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
db30: 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74  llowing block st
db40: 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e  ores the meta in
db50: 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
db60: 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a  ill be returned.
db70: 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c    ** to the call
db80: 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  er in local vari
db90: 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c  ables zDataType,
dba0: 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75   zCollSeq, notnu
dbb0: 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20  ll, primarykey. 
dbc0: 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e   ** and autoinc.
dbd0: 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
dbe0: 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73  here are two pos
dbf0: 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a  sibilities:.  **
dc00: 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68   .  **     1. Th
dc10: 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75  e specified colu
dc20: 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69  mn name was rowi
dc30: 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72  d", "oid" or "_r
dc40: 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20  owid_" .  **    
dc50: 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69 73      and there is
dc60: 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64   no explicitly d
dc70: 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75  eclared IPK colu
dc80: 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  mn. .  **.  **  
dc90: 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20     2. The table 
dca0: 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e  is not a view an
dcb0: 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  d the column nam
dcc0: 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20  e identified an 
dcd0: 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70  .  **        exp
dce0: 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64  licitly declared
dcf0: 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65   column. Copy me
dd00: 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ta information f
dd10: 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20  rom *pCol..  */ 
dd20: 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
dd30: 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70     zDataType = p
dd40: 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20  Col->zType;.    
dd50: 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d  zCollSeq = pCol-
dd60: 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e  >zColl;.    notn
dd70: 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e  ull = pCol->notN
dd80: 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d  ull!=0;.    prim
dd90: 61 72 79 6b 65 79 20 20 3d 20 70 43 6f 6c 2d 3e  arykey  = pCol->
dda0: 69 73 50 72 69 6d 4b 65 79 21 3d 30 3b 0a 20 20  isPrimKey!=0;.  
ddb0: 20 20 61 75 74 6f 69 6e 63 20 3d 20 70 54 61 62    autoinc = pTab
ddc0: 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26  ->iPKey==iCol &&
ddd0: 20 28 70 54 61 62 2d 3e 74 61 62 46 6c 61 67 73   (pTab->tabFlags
dde0: 20 26 20 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d   & TF_Autoincrem
ddf0: 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65  ent)!=0;.  }else
de00: 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65 20  {.    zDataType 
de10: 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a 20 20 20  = "INTEGER";.   
de20: 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b   primarykey = 1;
de30: 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c  .  }.  if( !zCol
de40: 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c  lSeq ){.    zCol
de50: 6c 53 65 71 20 3d 20 22 42 49 4e 41 52 59 22 3b  lSeq = "BINARY";
de60: 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a  .  }..error_out:
de70: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
de80: 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a  SafetyOff(db);..
de90: 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65    /* Whether the
dea0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73   function call s
deb0: 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c  ucceeded or fail
dec0: 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70  ed, set the outp
ded0: 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20  ut parameters.  
dee0: 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74  ** to whatever t
def0: 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74  heir local count
df00: 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e  erparts contain.
df10: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64   If an error did
df20: 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69   occur,.  ** thi
df30: 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  s has the effect
df40: 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20   of zeroing all 
df50: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
df60: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a  s..  */.  if( pz
df70: 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61  DataType ) *pzDa
df80: 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79  taType = zDataTy
df90: 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c  pe;.  if( pzColl
dfa0: 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71  Seq ) *pzCollSeq
dfb0: 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69   = zCollSeq;.  i
dfc0: 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70  f( pNotNull ) *p
dfd0: 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c  NotNull = notnul
dfe0: 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72  l;.  if( pPrimar
dff0: 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79  yKey ) *pPrimary
e000: 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79  Key = primarykey
e010: 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63  ;.  if( pAutoinc
e020: 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61   ) *pAutoinc = a
e030: 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53  utoinc;..  if( S
e040: 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20  QLITE_OK==rc && 
e050: 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  !pTab ){.    sql
e060: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
e070: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72  ErrMsg);.    zEr
e080: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  rMsg = sqlite3MP
e090: 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75  rintf(db, "no su
e0a0: 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a  ch table column:
e0b0: 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e   %s.%s", zTableN
e0c0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f  ame,.        zCo
e0d0: 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72  lumnName);.    r
e0e0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
e0f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
e100: 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a 45  rror(db, rc, (zE
e110: 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a  rrMsg?"%s":0), z
e120: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
e130: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
e140: 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71  rMsg);.  rc = sq
e150: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
e160: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
e170: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
e180: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
e190: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
e1a0: 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
e1b0: 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
e1c0: 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
e1d0: 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
e1e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
e1f0: 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20  sleep(int ms){. 
e200: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
e210: 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
e220: 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
e230: 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
e240: 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75  ( pVfs==0 ) retu
e250: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rn 0;..  /* This
e260: 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
e270: 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  in milliseconds,
e280: 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79   but the underly
e290: 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20  ing OsSleep() . 
e2a0: 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63   ** API uses mic
e2b0: 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65  roseconds. Hence
e2c0: 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a   the 1000's..  *
e2d0: 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65  /.  rc = (sqlite
e2e0: 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31  3OsSleep(pVfs, 1
e2f0: 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20  000*ms)/1000);. 
e300: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
e310: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
e320: 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e  isable the exten
e330: 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73  ded result codes
e340: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e350: 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
e360: 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a  _codes(sqlite3 *
e370: 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a  db, int onoff){.
e380: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e390: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
e3a0: 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
e3b0: 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66  = onoff ? 0xffff
e3c0: 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73  ffff : 0xff;.  s
e3d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
e3e0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
e3f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
e400: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  K;.}../*.** Invo
e410: 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74  ke the xFileCont
e420: 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20  rol method on a 
e430: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
e440: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
e450: 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
e460: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
e470: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
e480: 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
e490: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
e4a0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
e4b0: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71  .  int iDb;.  sq
e4c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
e4d0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
e4e0: 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29  if( zDbName==0 )
e4f0: 7b 0a 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20  {.    iDb = 0;. 
e500: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
e510: 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e  iDb=0; iDb<db->n
e520: 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  Db; iDb++){.    
e530: 20 20 69 66 28 20 73 74 72 63 6d 70 28 64 62 2d    if( strcmp(db-
e540: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
e550: 20 7a 44 62 4e 61 6d 65 29 3d 3d 30 20 29 20 62   zDbName)==0 ) b
e560: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
e570: 20 20 69 66 28 20 69 44 62 3c 64 62 2d 3e 6e 44    if( iDb<db->nD
e580: 62 20 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  b ){.    Btree *
e590: 70 42 74 72 65 65 20 3d 20 64 62 2d 3e 61 44 62  pBtree = db->aDb
e5a0: 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69  [iDb].pBt;.    i
e5b0: 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
e5c0: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
e5d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
e5e0: 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 20 20  file *fd;.      
e5f0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
e600: 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 20  r(pBtree);.     
e610: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
e620: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 72  3BtreePager(pBtr
e630: 65 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ee);.      asser
e640: 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
e650: 20 20 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74        fd = sqlit
e660: 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
e670: 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
e680: 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20  t( fd!=0 );.    
e690: 20 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f    if( fd->pMetho
e6a0: 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ds ){.        rc
e6b0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
e6c0: 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20  Control(fd, op, 
e6d0: 70 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pArg);.      }. 
e6e0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
e6f0: 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
e700: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
e710: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
e720: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
e730: 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f  turn rc;   .}../
e740: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  *.** Interface t
e750: 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f  o the testing lo
e760: 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  gic..*/.int sqli
e770: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
e780: 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20  (int op, ...){. 
e790: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66   int rc = 0;.#if
e7a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
e7b0: 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20  _BUILTIN_TEST.  
e7c0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
e7d0: 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a  _start(ap, op);.
e7e0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
e7f0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
e800: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
e810: 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
e820: 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  G..    */.    ca
e830: 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
e840: 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a  RL_PRNG_SAVE: {.
e850: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
e860: 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20  gSaveState();.  
e870: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e880: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
e890: 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74  Restore the stat
e8a0: 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f  e of the PRNG to
e8b0: 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20   the last state 
e8c0: 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20  saved using.    
e8d0: 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49  ** PRNG_SAVE.  I
e8e0: 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20  f PRNG_SAVE has 
e8f0: 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65  never before bee
e900: 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20  n called, then. 
e910: 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20     ** this verb 
e920: 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52  acts like PRNG_R
e930: 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ESET..    */.   
e940: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
e950: 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f  TCTRL_PRNG_RESTO
e960: 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  RE: {.      sqli
e970: 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74  te3PrngRestoreSt
e980: 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
e990: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
e9a0: 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74  *.    ** Reset t
e9b0: 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20  he PRNG back to 
e9c0: 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  its uninitialize
e9d0: 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65  d state.  The ne
e9e0: 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  xt call.    ** t
e9f0: 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  o sqlite3_random
ea00: 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65  ness() will rese
ea10: 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e  ed the PRNG usin
ea20: 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a  g a single call.
ea30: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52      ** to the xR
ea40: 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64  andomness method
ea50: 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
ea60: 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  VFS..    */.    
ea70: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
ea80: 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a  CTRL_PRNG_RESET:
ea90: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
eaa0: 50 72 6e 67 52 65 73 65 74 53 74 61 74 65 28 29  PrngResetState()
eab0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
eac0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
ead0: 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
eae0: 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43  t_control(BITVEC
eaf0: 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f  _TEST, size, pro
eb00: 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20  gram).    **.   
eb10: 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61   ** Run a test a
eb20: 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20  gainst a Bitvec 
eb30: 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20  object of size. 
eb40: 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67   The program arg
eb50: 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20  ument.    ** is 
eb60: 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65  an array of inte
eb70: 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65  gers that define
eb80: 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74  s the test.  Ret
eb90: 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20  urn -1 on a.    
eba0: 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
ebb0: 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e  tion error, 0 on
ebc0: 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e   success, or non
ebd0: 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72  -zero for an err
ebe0: 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  or..    ** See t
ebf0: 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  he sqlite3Bitvec
ec00: 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f  BuiltinTest() fo
ec10: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
ec20: 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
ec30: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
ec40: 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43  _TESTCTRL_BITVEC
ec50: 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69  _TEST: {.      i
ec60: 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
ec70: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
ec80: 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61  nt *aProg = va_a
ec90: 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20  rg(ap, int*);.  
eca0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ecb0: 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73  BitvecBuiltinTes
ecc0: 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20  t(sz, aProg);.  
ecd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ece0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
ecf0: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
ed00: 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c  ntrol(BENIGN_MAL
ed10: 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69  LOC_HOOKS, xBegi
ed20: 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a  n, xEnd).    **.
ed30: 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20      ** Register 
ed40: 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f  hooks to call to
ed50: 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20   indicate which 
ed60: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
ed70: 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65  s .    ** are be
ed80: 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nign..    */.   
ed90: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
eda0: 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c  TCTRL_BENIGN_MAL
edb0: 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20  LOC_HOOKS: {.   
edc0: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20     typedef void 
edd0: 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  (*void_function)
ede0: 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f  (void);.      vo
edf0: 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
ee00: 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20  ignBegin;.      
ee10: 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
ee20: 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20  enignEnd;.      
ee30: 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76  xBenignBegin = v
ee40: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
ee50: 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
ee60: 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f  xBenignEnd = va_
ee70: 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
ee80: 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  ction);.      sq
ee90: 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f  lite3BenignMallo
eea0: 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65  cHooks(xBenignBe
eeb0: 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29  gin, xBenignEnd)
eec0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
eed0: 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
eee0: 64 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  d(ap);.#endif /*
eef0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49   SQLITE_OMIT_BUI
ef00: 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72  LTIN_TEST */.  r
ef10: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.