/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 09fbadd5ea3d4f9052d37925a1427f9cb0ee75dc:


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 35 35 32 20 32 30 30 39 2f 30 35  ,v 1.552 2009/05
0280: 2f 31 32 20 31 33 3a 33 35 3a 31 32 20 64 72 68  /12 13:35:12 drh
0290: 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75   Exp $.*/.#inclu
02a0: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
02b0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
02c0: 45 4e 41 42 4c 45 5f 46 54 53 33 0a 23 20 69 6e  ENABLE_FTS3.# in
02d0: 63 6c 75 64 65 20 22 66 74 73 33 2e 68 22 0a 23  clude "fts3.h".#
02e0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
02f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45  ITE_ENABLE_RTREE
0300: 0a 23 20 69 6e 63 6c 75 64 65 20 22 72 74 72 65  .# include "rtre
0310: 65 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69 66 64  e.h".#endif.#ifd
0320: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
0330: 5f 49 43 55 0a 23 20 69 6e 63 6c 75 64 65 20 22  _ICU.# include "
0340: 73 71 6c 69 74 65 69 63 75 2e 68 22 0a 23 65 6e  sqliteicu.h".#en
0350: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 76  dif../*.** The v
0360: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69  ersion of the li
0370: 62 72 61 72 79 0a 2a 2f 0a 23 69 66 6e 64 65 66  brary.*/.#ifndef
0380: 20 53 51 4c 49 54 45 5f 41 4d 41 4c 47 41 4d 41   SQLITE_AMALGAMA
0390: 54 49 4f 4e 0a 63 6f 6e 73 74 20 63 68 61 72 20  TION.const char 
03a0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03b0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03c0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 63 6f 6e 73 74  ON;.#endif.const
03d0: 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 6c   char *sqlite3_l
03e0: 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29 7b  ibversion(void){
03f0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
0400: 76 65 72 73 69 6f 6e 3b 20 7d 0a 69 6e 74 20 73  version; }.int s
0410: 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69 6f  qlite3_libversio
0420: 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64 29 7b 20  n_number(void){ 
0430: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 56 45  return SQLITE_VE
0440: 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b 20 7d 0a  RSION_NUMBER; }.
0450: 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65  int sqlite3_thre
0460: 61 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65  adsafe(void){ re
0470: 74 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45  turn SQLITE_THRE
0480: 41 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21  ADSAFE; }..#if !
0490: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
04a0: 4d 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65  MIT_TRACE) && de
04b0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
04c0: 42 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a  BLE_IOTRACE)./*.
04d0: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
04e0: 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  ing function poi
04f0: 6e 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  nter is not NULL
0500: 20 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54   and if.** SQLIT
0510: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
0520: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
0530: 6e 20 6d 65 73 73 61 67 65 73 20 64 65 73 63 72  n messages descr
0540: 69 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74  ibing.** I/O act
0550: 69 76 65 20 61 72 65 20 77 72 69 74 74 65 6e 20  ive are written 
0560: 75 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  using this funct
0570: 69 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73  ion.  These mess
0580: 61 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65  ages.** are inte
0590: 6e 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 69  nded for debuggi
05a0: 6e 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79  ng activity only
05b0: 2e 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c 69  ..*/.void (*sqli
05c0: 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73  te3IoTrace)(cons
05d0: 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20  t char*, ...) = 
05e0: 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  0;.#endif../*.**
05f0: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
0600: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
0610: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
0620: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
0630: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
0640: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
0650: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
0660: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
0670: 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79  ore.** temporary
0680: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65   files..**.** Se
0690: 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47  e also the "PRAG
06a0: 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69  MA temp_store_di
06b0: 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d  rectory" SQL com
06c0: 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73  mand..*/.char *s
06d0: 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65  qlite3_temp_dire
06e0: 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  ctory = 0;../*.*
06f0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 53 51 4c  * Initialize SQL
0700: 69 74 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  ite.  .**.** Thi
0710: 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
0720: 65 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e 69 74  e called to init
0730: 69 61 6c 69 7a 65 20 74 68 65 20 6d 65 6d 6f 72  ialize the memor
0740: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 2c 0a 2a 2a  y allocation,.**
0750: 20 56 46 53 2c 20 61 6e 64 20 6d 75 74 65 78 20   VFS, and mutex 
0760: 73 75 62 73 79 73 74 65 6d 73 20 70 72 69 6f 72  subsystems prior
0770: 20 74 6f 20 64 6f 69 6e 67 20 61 6e 79 20 73 65   to doing any se
0780: 72 69 6f 75 73 20 77 6f 72 6b 20 77 69 74 68 0a  rious work with.
0790: 2a 2a 20 53 51 4c 69 74 65 2e 20 20 42 75 74 20  ** SQLite.  But 
07a0: 61 73 20 6c 6f 6e 67 20 61 73 20 79 6f 75 20 64  as long as you d
07b0: 6f 20 6e 6f 74 20 63 6f 6d 70 69 6c 65 20 77 69  o not compile wi
07c0: 74 68 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  th SQLITE_OMIT_A
07d0: 55 54 4f 49 4e 49 54 0a 2a 2a 20 74 68 69 73 20  UTOINIT.** this 
07e0: 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 62 65 20  routine will be 
07f0: 63 61 6c 6c 65 64 20 61 75 74 6f 6d 61 74 69 63  called automatic
0800: 61 6c 6c 79 20 62 79 20 6b 65 79 20 72 6f 75 74  ally by key rout
0810: 69 6e 65 73 20 73 75 63 68 20 61 73 0a 2a 2a 20  ines such as.** 
0820: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 20  sqlite3_open(). 
0830: 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75   .**.** This rou
0840: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 20  tine is a no-op 
0850: 65 78 63 65 70 74 20 6f 6e 20 69 74 73 20 76 65  except on its ve
0860: 72 79 20 66 69 72 73 74 20 63 61 6c 6c 20 66 6f  ry first call fo
0870: 72 20 74 68 65 20 70 72 6f 63 65 73 73 2c 0a 2a  r the process,.*
0880: 2a 20 6f 72 20 66 6f 72 20 74 68 65 20 66 69 72  * or for the fir
0890: 73 74 20 63 61 6c 6c 20 61 66 74 65 72 20 61 20  st call after a 
08a0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
08b0: 73 68 75 74 64 6f 77 6e 2e 0a 2a 2a 0a 2a 2a 20  shutdown..**.** 
08c0: 54 68 65 20 66 69 72 73 74 20 74 68 72 65 61 64  The first thread
08d0: 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 72 6f   to call this ro
08e0: 75 74 69 6e 65 20 72 75 6e 73 20 74 68 65 20 69  utine runs the i
08f0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 74 6f  nitialization to
0900: 0a 2a 2a 20 63 6f 6d 70 6c 65 74 69 6f 6e 2e 20  .** completion. 
0910: 20 49 66 20 73 75 62 73 65 71 75 65 6e 74 20 74   If subsequent t
0920: 68 72 65 61 64 73 20 63 61 6c 6c 20 74 68 69 73  hreads call this
0930: 20 72 6f 75 74 69 6e 65 20 62 65 66 6f 72 65 20   routine before 
0940: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 74 68 72  the first.** thr
0950: 65 61 64 20 68 61 73 20 66 69 6e 69 73 68 65 64  ead has finished
0960: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0970: 69 6f 6e 20 70 72 6f 63 65 73 73 2c 20 74 68 65  ion process, the
0980: 6e 20 74 68 65 20 73 75 62 73 65 71 75 65 6e 74  n the subsequent
0990: 0a 2a 2a 20 74 68 72 65 61 64 73 20 6d 75 73 74  .** threads must
09a0: 20 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65   block until the
09b0: 20 66 69 72 73 74 20 74 68 72 65 61 64 20 66 69   first thread fi
09c0: 6e 69 73 68 65 73 20 77 69 74 68 20 74 68 65 20  nishes with the 
09d0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a  initialization..
09e0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
09f0: 74 68 72 65 61 64 20 6d 69 67 68 74 20 63 61 6c  thread might cal
0a00: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  l this routine r
0a10: 65 63 75 72 73 69 76 65 6c 79 2e 20 20 52 65 63  ecursively.  Rec
0a20: 75 72 73 69 76 65 0a 2a 2a 20 63 61 6c 6c 73 20  ursive.** calls 
0a30: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
0a40: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 6c 6f 63 6b  should not block
0a50: 2c 20 6f 66 20 63 6f 75 72 73 65 2e 20 20 4f 74  , of course.  Ot
0a60: 68 65 72 77 69 73 65 20 74 68 65 0a 2a 2a 20 69  herwise the.** i
0a70: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72  nitialization pr
0a80: 6f 63 65 73 73 20 77 6f 75 6c 64 20 6e 65 76 65  ocess would neve
0a90: 72 20 63 6f 6d 70 6c 65 74 65 2e 0a 2a 2a 0a 2a  r complete..**.*
0aa0: 2a 20 4c 65 74 20 58 20 62 65 20 74 68 65 20 66  * Let X be the f
0ab0: 69 72 73 74 20 74 68 72 65 61 64 20 74 6f 20 65  irst thread to e
0ac0: 6e 74 65 72 20 74 68 69 73 20 72 6f 75 74 69 6e  nter this routin
0ad0: 65 2e 20 20 4c 65 74 20 59 20 62 65 20 73 6f 6d  e.  Let Y be som
0ae0: 65 20 6f 74 68 65 72 0a 2a 2a 20 74 68 72 65 61  e other.** threa
0af0: 64 2e 20 20 54 68 65 6e 20 77 68 69 6c 65 20 74  d.  Then while t
0b00: 68 65 20 69 6e 69 74 69 61 6c 20 69 6e 76 6f 63  he initial invoc
0b10: 61 74 69 6f 6e 20 6f 66 20 74 68 69 73 20 72 6f  ation of this ro
0b20: 75 74 69 6e 65 20 62 79 20 58 20 69 73 0a 2a 2a  utine by X is.**
0b30: 20 69 6e 63 6f 6d 70 6c 65 74 65 2c 20 69 74 20   incomplete, it 
0b40: 69 73 20 72 65 71 75 69 72 65 64 20 74 68 61 74  is required that
0b50: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 43 61  :.**.**    *  Ca
0b60: 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75 74  lls to this rout
0b70: 69 6e 65 20 66 72 6f 6d 20 59 20 6d 75 73 74 20  ine from Y must 
0b80: 62 6c 6f 63 6b 20 75 6e 74 69 6c 20 74 68 65 20  block until the 
0b90: 6f 75 74 65 72 2d 6d 6f 73 74 0a 2a 2a 20 20 20  outer-most.**   
0ba0: 20 20 20 20 63 61 6c 6c 20 62 79 20 58 20 63 6f      call by X co
0bb0: 6d 70 6c 65 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  mpletes..**.**  
0bc0: 20 20 2a 20 20 52 65 63 75 72 73 69 76 65 20 63    *  Recursive c
0bd0: 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f 75  alls to this rou
0be0: 74 69 6e 65 20 66 72 6f 6d 20 74 68 72 65 61 64  tine from thread
0bf0: 20 58 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69   X return immedi
0c00: 61 74 65 6c 79 0a 2a 2a 20 20 20 20 20 20 20 77  ately.**       w
0c10: 69 74 68 6f 75 74 20 62 6c 6f 63 6b 69 6e 67 2e  ithout blocking.
0c20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
0c30: 69 6e 69 74 69 61 6c 69 7a 65 28 76 6f 69 64 29  initialize(void)
0c40: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
0c50: 78 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 20  x *pMaster;     
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 73 74 61   /* The main sta
0c80: 74 69 63 20 6d 75 74 65 78 20 2a 2f 0a 20 20 69  tic mutex */.  i
0c90: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
0cc0: 65 73 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 23  esult code */..#
0cd0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
0ce0: 54 5f 57 53 44 0a 20 20 72 63 20 3d 20 73 71 6c  T_WSD.  rc = sql
0cf0: 69 74 65 33 5f 77 73 64 5f 69 6e 69 74 28 34 30  ite3_wsd_init(40
0d00: 39 36 2c 20 32 34 29 3b 0a 20 20 69 66 28 20 72  96, 24);.  if( r
0d10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
0d20: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
0d30: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
0d40: 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72  If SQLite is alr
0d50: 65 61 64 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20  eady completely 
0d60: 69 6e 69 74 69 61 6c 69 7a 65 64 2c 20 74 68 65  initialized, the
0d70: 6e 20 74 68 69 73 20 63 61 6c 6c 0a 20 20 2a 2a  n this call.  **
0d80: 20 74 6f 20 73 71 6c 69 74 65 33 5f 69 6e 69 74   to sqlite3_init
0d90: 69 61 6c 69 7a 65 28 29 20 73 68 6f 75 6c 64 20  ialize() should 
0da0: 62 65 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  be a no-op.  But
0db0: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0dc0: 69 6f 6e 0a 20 20 2a 2a 20 6d 75 73 74 20 62 65  ion.  ** must be
0dd0: 20 63 6f 6d 70 6c 65 74 65 2e 20 20 53 6f 20 69   complete.  So i
0de0: 73 49 6e 69 74 20 6d 75 73 74 20 6e 6f 74 20 62  sInit must not b
0df0: 65 20 73 65 74 20 75 6e 74 69 6c 20 74 68 65 20  e set until the 
0e00: 76 65 72 79 20 65 6e 64 0a 20 20 2a 2a 20 6f 66  very end.  ** of
0e10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 20   this routine.. 
0e20: 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
0e30: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
0e40: 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53 51  Init ) return SQ
0e50: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 4d  LITE_OK;..  /* M
0e60: 61 6b 65 20 73 75 72 65 20 74 68 65 20 6d 75 74  ake sure the mut
0e70: 65 78 20 73 75 62 73 79 73 74 65 6d 20 69 73 20  ex subsystem is 
0e80: 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 20 49 66  initialized.  If
0e90: 20 75 6e 61 62 6c 65 20 74 6f 20 0a 20 20 2a 2a   unable to .  **
0ea0: 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
0eb0: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 2c  mutex subsystem,
0ec0: 20 72 65 74 75 72 6e 20 65 61 72 6c 79 20 77 69   return early wi
0ed0: 74 68 20 74 68 65 20 65 72 72 6f 72 2e 0a 20 20  th the error..  
0ee0: 2a 2a 20 49 66 20 74 68 65 20 73 79 73 74 65 6d  ** If the system
0ef0: 20 69 73 20 73 6f 20 73 69 63 6b 20 74 68 61 74   is so sick that
0f00: 20 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74   we are unable t
0f10: 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6d 75 74  o allocate a mut
0f20: 65 78 2c 0a 20 20 2a 2a 20 74 68 65 72 65 20 69  ex,.  ** there i
0f30: 73 20 6e 6f 74 20 6d 75 63 68 20 53 51 4c 69 74  s not much SQLit
0f40: 65 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 62 65  e is going to be
0f50: 20 61 62 6c 65 20 74 6f 20 64 6f 2e 0a 20 20 2a   able to do..  *
0f60: 2a 0a 20 20 2a 2a 20 54 68 65 20 6d 75 74 65 78  *.  ** The mutex
0f70: 20 73 75 62 73 79 73 74 65 6d 20 6d 75 73 74 20   subsystem must 
0f80: 74 61 6b 65 20 63 61 72 65 20 6f 66 20 73 65 72  take care of ser
0f90: 69 61 6c 69 7a 69 6e 67 20 69 74 73 20 6f 77 6e  ializing its own
0fa0: 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61  .  ** initializa
0fb0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
0fc0: 3d 20 73 71 6c 69 74 65 33 4d 75 74 65 78 49 6e  = sqlite3MutexIn
0fd0: 69 74 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29  it();.  if( rc )
0fe0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
0ff0: 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  * Initialize the
1000: 20 6d 61 6c 6c 6f 63 28 29 20 73 79 73 74 65 6d   malloc() system
1010: 20 61 6e 64 20 74 68 65 20 72 65 63 75 72 73 69   and the recursi
1020: 76 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75  ve pInitMutex mu
1030: 74 65 78 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  tex..  ** This o
1040: 70 65 72 61 74 69 6f 6e 20 69 73 20 70 72 6f 74  peration is prot
1050: 65 63 74 65 64 20 62 79 20 74 68 65 20 53 54 41  ected by the STA
1060: 54 49 43 5f 4d 41 53 54 45 52 20 6d 75 74 65 78  TIC_MASTER mutex
1070: 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 2a  .  Note that.  *
1080: 2a 20 4d 75 74 65 78 41 6c 6c 6f 63 28 29 20 69  * MutexAlloc() i
1090: 73 20 63 61 6c 6c 65 64 20 66 6f 72 20 61 20 73  s called for a s
10a0: 74 61 74 69 63 20 6d 75 74 65 78 20 70 72 69 6f  tatic mutex prio
10b0: 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 69 6e  r to initializin
10c0: 67 20 74 68 65 0a 20 20 2a 2a 20 6d 61 6c 6c 6f  g the.  ** mallo
10d0: 63 20 73 75 62 73 79 73 74 65 6d 20 2d 20 74 68  c subsystem - th
10e0: 69 73 20 69 6d 70 6c 69 65 73 20 74 68 61 74 20  is implies that 
10f0: 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 6f  the allocation o
1100: 66 20 61 20 73 74 61 74 69 63 0a 20 20 2a 2a 20  f a static.  ** 
1110: 6d 75 74 65 78 20 6d 75 73 74 20 6e 6f 74 20 72  mutex must not r
1120: 65 71 75 69 72 65 20 73 75 70 70 6f 72 74 20 66  equire support f
1130: 72 6f 6d 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73  rom the malloc s
1140: 75 62 73 79 73 74 65 6d 2e 0a 20 20 2a 2f 0a 20  ubsystem..  */. 
1150: 20 70 4d 61 73 74 65 72 20 3d 20 73 71 6c 69 74   pMaster = sqlit
1160: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
1170: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
1180: 5f 4d 41 53 54 45 52 29 3b 0a 20 20 73 71 6c 69  _MASTER);.  sqli
1190: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
11a0: 70 4d 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20  pMaster);.  if( 
11b0: 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  !sqlite3GlobalCo
11c0: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
11d0: 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  t ){.    rc = sq
11e0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28  lite3MallocInit(
11f0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1200: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1210: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1220: 6f 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e  onfig.isMallocIn
1230: 69 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20  it = 1;.    if( 
1240: 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  !sqlite3GlobalCo
1250: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20  nfig.pInitMutex 
1260: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
1270: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1280: 69 74 4d 75 74 65 78 20 3d 20 73 71 6c 69 74 65  itMutex = sqlite
1290: 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49  3MutexAlloc(SQLI
12a0: 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49  TE_MUTEX_RECURSI
12b0: 56 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  VE);.      if( s
12c0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
12d0: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 26 26  ig.bCoreMutex &&
12e0: 20 21 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43   !sqlite3GlobalC
12f0: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1300: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1310: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1320: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1330: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1340: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
1350: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1360: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 2b 2b 3b  nRefInitMutex++;
1370: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1380: 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74  utex_leave(pMast
1390: 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 75 6e  er);..  /* If un
13a0: 61 62 6c 65 20 74 6f 20 69 6e 69 74 69 61 6c 69  able to initiali
13b0: 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 75  ze the malloc su
13c0: 62 73 79 73 74 65 6d 2c 20 74 68 65 6e 20 72 65  bsystem, then re
13d0: 74 75 72 6e 20 65 61 72 6c 79 2e 0a 20 20 2a 2a  turn early..  **
13e0: 20 54 68 65 72 65 20 69 73 20 6c 69 74 74 6c 65   There is little
13f0: 20 68 6f 70 65 20 6f 66 20 67 65 74 74 69 6e 67   hope of getting
1400: 20 53 51 4c 69 74 65 20 74 6f 20 72 75 6e 20 69   SQLite to run i
1410: 66 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20 20 2a  f the malloc.  *
1420: 2a 20 73 75 62 73 79 73 74 65 6d 20 63 61 6e 6e  * subsystem cann
1430: 6f 74 20 62 65 20 69 6e 69 74 69 61 6c 69 7a 65  ot be initialize
1440: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  d..  */.  if( rc
1450: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1460: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1470: 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 72  }..  /* Do the r
1480: 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74 69  est of the initi
1490: 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20  alization under 
14a0: 74 68 65 20 72 65 63 75 72 73 69 76 65 20 6d 75  the recursive mu
14b0: 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  tex so.  ** that
14c0: 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c 65   we will be able
14d0: 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75 72   to handle recur
14e0: 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a  sive calls into.
14f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69    ** sqlite3_ini
1500: 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65 20  tialize().  The 
1510: 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20  recursive calls 
1520: 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68  normally come th
1530: 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74  rough.  ** sqlit
1540: 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68 65  e3_os_init() whe
1550: 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c  n it invokes sql
1560: 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1570: 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a 20  r(), but other. 
1580: 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63 61   ** recursive ca
1590: 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  lls might also b
15a0: 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2f  e possible..  */
15b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15c0: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 47 6c  _enter(sqlite3Gl
15d0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
15e0: 4d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  Mutex);.  if( sq
15f0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1600: 67 2e 69 73 49 6e 69 74 3d 3d 30 20 26 26 20 73  g.isInit==0 && s
1610: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1620: 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30  ig.inProgress==0
1630: 20 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 48   ){.    FuncDefH
1640: 61 73 68 20 2a 70 48 61 73 68 20 3d 20 26 47 4c  ash *pHash = &GL
1650: 4f 42 41 4c 28 46 75 6e 63 44 65 66 48 61 73 68  OBAL(FuncDefHash
1660: 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46  , sqlite3GlobalF
1670: 75 6e 63 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73  unctions);.    s
1680: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1690: 69 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20  ig.inProgress = 
16a0: 31 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 48  1;.    memset(pH
16b0: 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  ash, 0, sizeof(s
16c0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63  qlite3GlobalFunc
16d0: 74 69 6f 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c  tions));.    sql
16e0: 69 74 65 33 52 65 67 69 73 74 65 72 47 6c 6f 62  ite3RegisterGlob
16f0: 61 6c 46 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20  alFunctions();. 
1700: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1710: 63 61 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28  cacheInitialize(
1720: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
1730: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1740: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
1750: 73 5f 69 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a  s_init();.    }.
1760: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1770: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73  TE_OK ){.      s
1780: 71 6c 69 74 65 33 50 43 61 63 68 65 42 75 66 66  qlite3PCacheBuff
1790: 65 72 53 65 74 75 70 28 20 73 71 6c 69 74 65 33  erSetup( sqlite3
17a0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61  GlobalConfig.pPa
17b0: 67 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  ge, .          s
17c0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
17d0: 69 67 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74  ig.szPage, sqlit
17e0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
17f0: 50 61 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  Page);.      sql
1800: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1810: 2e 69 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20  .isInit = 1;.   
1820: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c   }.    sqlite3Gl
1830: 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f  obalConfig.inPro
1840: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20  gress = 0;.  }. 
1850: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1860: 65 61 76 65 28 73 71 6c 69 74 65 33 47 6c 6f 62  eave(sqlite3Glob
1870: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
1880: 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62  tex);..  /* Go b
1890: 61 63 6b 20 75 6e 64 65 72 20 74 68 65 20 73 74  ack under the st
18a0: 61 74 69 63 20 6d 75 74 65 78 20 61 6e 64 20 63  atic mutex and c
18b0: 6c 65 61 6e 20 75 70 20 74 68 65 20 72 65 63 75  lean up the recu
18c0: 72 73 69 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78  rsive.  ** mutex
18d0: 20 74 6f 20 70 72 65 76 65 6e 74 20 61 20 72 65   to prevent a re
18e0: 73 6f 75 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a  source leak..  *
18f0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  /.  sqlite3_mute
1900: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
1910: 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ;.  sqlite3Globa
1920: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
1930: 4d 75 74 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73  Mutex--;.  if( s
1940: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1950: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
1960: 3c 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  <=0 ){.    asser
1970: 74 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  t( sqlite3Global
1980: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
1990: 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73  utex==0 );.    s
19a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65  qlite3_mutex_fre
19b0: 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  e(sqlite3GlobalC
19c0: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
19d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c  );.    sqlite3Gl
19e0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
19f0: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20  Mutex = 0;.  }. 
1a00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1a10: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
1a20: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
1a30: 6e 67 20 69 73 20 6a 75 73 74 20 61 20 73 61 6e  ng is just a san
1a40: 69 74 79 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b  ity check to mak
1a50: 65 20 73 75 72 65 20 53 51 4c 69 74 65 20 68 61  e sure SQLite ha
1a60: 73 0a 20 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70  s.  ** been comp
1a70: 69 6c 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 20  iled correctly. 
1a80: 20 49 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74   It is important
1a90: 20 74 6f 20 72 75 6e 20 74 68 69 73 20 63 6f 64   to run this cod
1aa0: 65 2c 20 62 75 74 0a 20 20 2a 2a 20 77 65 20 64  e, but.  ** we d
1ab0: 6f 6e 27 74 20 77 61 6e 74 20 74 6f 20 72 75 6e  on't want to run
1ac0: 20 69 74 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e   it too often an
1ad0: 64 20 73 6f 61 6b 20 75 70 20 43 50 55 20 63 79  d soak up CPU cy
1ae0: 63 6c 65 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a  cles for no.  **
1af0: 20 72 65 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20   reason.  So we 
1b00: 72 75 6e 20 69 74 20 6f 6e 63 65 20 64 75 72 69  run it once duri
1b10: 6e 67 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  ng initializatio
1b20: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  n..  */.#ifndef 
1b30: 4e 44 45 42 55 47 0a 23 69 66 6e 64 65 66 20 53  NDEBUG.#ifndef S
1b40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
1b50: 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54  ING_POINT.  /* T
1b60: 68 69 73 20 73 65 63 74 69 6f 6e 20 6f 66 20 63  his section of c
1b70: 6f 64 65 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70  ode's only "outp
1b80: 75 74 22 20 69 73 20 76 69 61 20 61 73 73 65 72  ut" is via asser
1b90: 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  t() statements. 
1ba0: 2a 2f 0a 20 20 69 66 20 28 20 72 63 3d 3d 53 51  */.  if ( rc==SQ
1bb0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
1bc0: 36 34 20 78 20 3d 20 28 28 28 75 36 34 29 31 29  64 x = (((u64)1)
1bd0: 3c 3c 36 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75  <<63)-1;.    dou
1be0: 62 6c 65 20 79 3b 0a 20 20 20 20 61 73 73 65 72  ble y;.    asser
1bf0: 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b  t(sizeof(x)==8);
1c00: 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a 65  .    assert(size
1c10: 6f 66 28 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29  of(x)==sizeof(y)
1c20: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 79  );.    memcpy(&y
1c30: 2c 20 26 78 2c 20 38 29 3b 0a 20 20 20 20 61 73  , &x, 8);.    as
1c40: 73 65 72 74 28 20 73 71 6c 69 74 65 33 49 73 4e  sert( sqlite3IsN
1c50: 61 4e 28 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e  aN(y) );.  }.#en
1c60: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65  dif.#endif..  re
1c70: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
1c80: 2a 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63  * Undo the effec
1c90: 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e  ts of sqlite3_in
1ca0: 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73  itialize().  Mus
1cb0: 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20  t not be called 
1cc0: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61  while.** there a
1cd0: 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64  re outstanding d
1ce0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1cf0: 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c  ons or memory al
1d00: 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20  locations or.** 
1d10: 77 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f  while any part o
1d20: 66 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65  f SQLite is othe
1d30: 72 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20  rwise in use in 
1d40: 61 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69  any thread.  Thi
1d50: 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20  s.** routine is 
1d60: 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20  not threadsafe. 
1d70: 20 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20   But it is safe 
1d80: 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72  to invoke this r
1d90: 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65  outine.** on whe
1da0: 6e 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  n SQLite is alre
1db0: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20  ady shut down.  
1dc0: 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72  If SQLite is alr
1dd0: 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a  eady shut down.*
1de0: 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * when this rout
1df0: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20  ine is invoked, 
1e00: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
1e10: 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20  e is a harmless 
1e20: 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71  no-op..*/.int sq
1e30: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76  lite3_shutdown(v
1e40: 6f 69 64 29 7b 0a 20 20 69 66 28 20 73 71 6c 69  oid){.  if( sqli
1e50: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1e60: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  isInit ){.    sq
1e70: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1e80: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d  g.isMallocInit =
1e90: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   0;.    sqlite3P
1ea0: 63 61 63 68 65 53 68 75 74 64 6f 77 6e 28 29 3b  cacheShutdown();
1eb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f  .    sqlite3_os_
1ec0: 65 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  end();.    sqlit
1ed0: 65 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78  e3_reset_auto_ex
1ee0: 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73  tension();.    s
1ef0: 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 45 6e 64 28  qlite3MallocEnd(
1f00: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 75  );.    sqlite3Mu
1f10: 74 65 78 45 6e 64 28 29 3b 0a 20 20 20 20 73 71  texEnd();.    sq
1f20: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1f30: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
1f40: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
1f50: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  E_OK;.}../*.** T
1f60: 68 69 73 20 41 50 49 20 61 6c 6c 6f 77 73 20 61  his API allows a
1f70: 70 70 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d  pplications to m
1f80: 6f 64 69 66 79 20 74 68 65 20 67 6c 6f 62 61 6c  odify the global
1f90: 20 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f   configuration o
1fa0: 66 0a 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20  f.** the SQLite 
1fb0: 6c 69 62 72 61 72 79 20 61 74 20 72 75 6e 2d 74  library at run-t
1fc0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ime..**.** This 
1fd0: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
1fe0: 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68  nly be called wh
1ff0: 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  en there are no 
2000: 6f 75 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64  outstanding.** d
2010: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2020: 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c  ons or memory al
2030: 6c 6f 63 61 74 69 6f 6e 73 2e 20 20 54 68 69 73  locations.  This
2040: 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a   routine is not.
2050: 2a 2a 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ** threadsafe.  
2060: 46 61 69 6c 75 72 65 20 74 6f 20 68 65 65 64 20  Failure to heed 
2070: 74 68 65 73 65 20 77 61 72 6e 69 6e 67 73 20 63  these warnings c
2080: 61 6e 20 6c 65 61 64 20 74 6f 20 75 6e 70 72 65  an lead to unpre
2090: 64 69 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61  dictable.** beha
20a0: 76 69 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  vior..*/.int sql
20b0: 69 74 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20  ite3_config(int 
20c0: 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  op, ...){.  va_l
20d0: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63  ist ap;.  int rc
20e0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
20f0: 20 2f 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66   /* sqlite3_conf
2100: 69 67 28 29 20 73 68 61 6c 6c 20 72 65 74 75 72  ig() shall retur
2110: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20  n SQLITE_MISUSE 
2120: 69 66 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64  if it is invoked
2130: 20 77 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20   while.  ** the 
2140: 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69  SQLite library i
2150: 73 20 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69  s in use. */.  i
2160: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
2170: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20  Config.isInit ) 
2180: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
2190: 53 55 53 45 3b 0a 0a 20 20 76 61 5f 73 74 61 72  SUSE;..  va_star
21a0: 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
21b0: 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20  tch( op ){..    
21c0: 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75  /* Mutex configu
21d0: 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61  ration options a
21e0: 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c  re only availabl
21f0: 65 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66  e in a threadsaf
2200: 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65  e.    ** compile
2210: 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66 20 53 51  . .    */.#if SQ
2220: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 0a  LITE_THREADSAFE.
2230: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2240: 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52  CONFIG_SINGLETHR
2250: 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EAD: {.      /* 
2260: 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65  Disable all mute
2270: 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 71  xing */.      sq
2280: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2290: 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 30  g.bCoreMutex = 0
22a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
22b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c  lobalConfig.bFul
22c0: 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20  lMutex = 0;.    
22d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
22e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
22f0: 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45 41  ONFIG_MULTITHREA
2300: 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69  D: {.      /* Di
2310: 73 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f  sable mutexing o
2320: 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  f database conne
2330: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20  ctions */.      
2340: 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 69  /* Enable mutexi
2350: 6e 67 20 6f 66 20 63 6f 72 65 20 64 61 74 61 20  ng of core data 
2360: 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20  structures */.  
2370: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2380: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
2390: 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  ex = 1;.      sq
23a0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
23b0: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30  g.bFullMutex = 0
23c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
23d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
23e0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49  LITE_CONFIG_SERI
23f0: 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20  ALIZED: {.      
2400: 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20 6d 75  /* Enable all mu
2410: 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  texing */.      
2420: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2430: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d  fig.bCoreMutex =
2440: 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   1;.      sqlite
2450: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
2460: 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20  ullMutex = 1;.  
2470: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
2480: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2490: 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b  _CONFIG_MUTEX: {
24a0: 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66  .      /* Specif
24b0: 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  y an alternative
24c0: 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74   mutex implement
24d0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73  ation */.      s
24e0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
24f0: 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61  ig.mutex = *va_a
2500: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d  rg(ap, sqlite3_m
2510: 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a  utex_methods*);.
2520: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2530: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
2540: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54  TE_CONFIG_GETMUT
2550: 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52  EX: {.      /* R
2560: 65 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72  etrieve the curr
2570: 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d  ent mutex implem
2580: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
2590: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
25a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68  lite3_mutex_meth
25b0: 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ods*) = sqlite3G
25c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65  lobalConfig.mute
25d0: 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  x;.      break;.
25e0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20      }.#endif... 
25f0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2600: 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a  ONFIG_MALLOC: {.
2610: 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79        /* Specify
2620: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
2630: 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74  malloc implement
2640: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73  ation */.      s
2650: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2660: 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61  ig.m = *va_arg(a
2670: 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d  p, sqlite3_mem_m
2680: 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20  ethods*);.      
2690: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
26a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
26b0: 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b  FIG_GETMALLOC: {
26c0: 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65  .      /* Retrie
26d0: 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  ve the current m
26e0: 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e  alloc() implemen
26f0: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
2700: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2710: 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f  lConfig.m.xMallo
2720: 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d 65  c==0 ) sqlite3Me
2730: 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20  mSetDefault();. 
2740: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
2750: 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74   sqlite3_mem_met
2760: 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33  hods*) = sqlite3
2770: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a  GlobalConfig.m;.
2780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2790: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
27a0: 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41  TE_CONFIG_MEMSTA
27b0: 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  TUS: {.      /* 
27c0: 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
27d0: 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 74 61  e the malloc sta
27e0: 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 2a  tus collection *
27f0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
2800: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d  lobalConfig.bMem
2810: 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61 70  stat = va_arg(ap
2820: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
2830: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
2840: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
2850: 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20 20  G_SCRATCH: {.   
2860: 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20     /* Designate 
2870: 61 20 62 75 66 66 65 72 20 66 6f 72 20 73 63 72  a buffer for scr
2880: 61 74 63 68 20 6d 65 6d 6f 72 79 20 73 70 61 63  atch memory spac
2890: 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  e */.      sqlit
28a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
28b0: 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67  Scratch = va_arg
28c0: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
28d0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
28e0: 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68  Config.szScratch
28f0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
2900: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
2910: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53  3GlobalConfig.nS
2920: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
2930: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
2940: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
2950: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2960: 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b  FIG_PAGECACHE: {
2970: 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e  .      /* Design
2980: 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72  ate a buffer for
2990: 20 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20   scratch memory 
29a0: 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73  space */.      s
29b0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
29c0: 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.pPage = va_ar
29d0: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
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 73 7a 50 61 67 65 20 3d  lConfig.szPage =
2a00: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
2a10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
2a20: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
2a30: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
2a40: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
2a50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
2a60: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2a70: 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20  PCACHE: {.      
2a80: 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61 6c  /* Specify an al
2a90: 74 65 72 6e 61 74 69 76 65 20 6d 61 6c 6c 6f 63  ternative malloc
2aa0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
2ab0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
2ac0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61  GlobalConfig.pca
2ad0: 63 68 65 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  che = *va_arg(ap
2ae0: 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  , sqlite3_pcache
2af0: 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20  _methods*);.    
2b00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
2b10: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2b20: 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45  CONFIG_GETPCACHE
2b30: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  : {.      if( sq
2b40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2b50: 67 2e 70 63 61 63 68 65 2e 78 49 6e 69 74 3d 3d  g.pcache.xInit==
2b60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
2b70: 69 74 65 33 50 43 61 63 68 65 53 65 74 44 65 66  ite3PCacheSetDef
2b80: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a  ault();.      }.
2b90: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
2ba0: 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  , sqlite3_pcache
2bb0: 5f 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c  _methods*) = sql
2bc0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2bd0: 2e 70 63 61 63 68 65 3b 0a 20 20 20 20 20 20 62  .pcache;.      b
2be0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
2bf0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2c00: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20  ENABLE_MEMSYS3) 
2c10: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
2c20: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
2c30: 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
2c40: 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b  E_CONFIG_HEAP: {
2c50: 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e  .      /* Design
2c60: 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72  ate a buffer for
2c70: 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 73 70 61   heap memory spa
2c80: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
2c90: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2ca0: 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  pHeap = va_arg(a
2cb0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
2cc0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2cd0: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
2ce0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
2cf0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2d00: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
2d10: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
2d20: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
2d30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2d40: 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  pHeap==0 ){.    
2d50: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 65      /* If the he
2d60: 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 4e 55  ap pointer is NU
2d70: 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65  LL, then restore
2d80: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c   the malloc impl
2d90: 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20  ementation.     
2da0: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55     ** back to NU
2db0: 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e  LL pointers too.
2dc0: 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
2dd0: 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20  e the malloc to 
2de0: 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61  go.        ** ba
2df0: 63 6b 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c  ck to its defaul
2e00: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
2e10: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e   when sqlite3_in
2e20: 69 74 69 61 6c 69 7a 65 28 29 20 69 73 0a 20 20  itialize() is.  
2e30: 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20        ** run..  
2e40: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2e50: 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33   memset(&sqlite3
2e60: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20  GlobalConfig.m, 
2e70: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
2e80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29  3GlobalConfig.m)
2e90: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2ea0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 68          /* The h
2eb0: 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 6e  eap pointer is n
2ec0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e  ot NULL, then in
2ed0: 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74 68 65  stall one of the
2ee0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 35  .        ** mem5
2ef0: 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68 6f 64  .c/mem3.c method
2f00: 73 2e 20 49 66 20 6e 65 69 74 68 65 72 20 45 4e  s. If neither EN
2f10: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6e 6f 72  ABLE_MEMSYS3 nor
2f20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 4e 41 42  .        ** ENAB
2f30: 4c 45 5f 4d 45 4d 53 59 53 35 20 69 73 20 64 65  LE_MEMSYS5 is de
2f40: 66 69 6e 65 64 2c 20 72 65 74 75 72 6e 20 61 6e  fined, return an
2f50: 20 65 72 72 6f 72 2e 0a 20 20 20 20 20 20 20 20   error..        
2f60: 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  ** the default c
2f70: 61 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ase and return a
2f80: 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 20 20 20  n error..       
2f90: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
2fa0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  E_ENABLE_MEMSYS3
2fb0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2fc0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
2fd0: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d   *sqlite3MemGetM
2fe0: 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e 64 69 66  emsys3();.#endif
2ff0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
3000: 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20  NABLE_MEMSYS5.  
3010: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3020: 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73  balConfig.m = *s
3030: 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73  qlite3MemGetMems
3040: 79 73 35 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  ys5();.#endif.  
3050: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
3060: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3070: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
3080: 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44  _CONFIG_LOOKASID
3090: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
30a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
30b0: 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f  zLookaside = va_
30c0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
30d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
30e0: 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69  lConfig.nLookasi
30f0: 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  de = va_arg(ap, 
3100: 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
3110: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 65  k;.    }..    de
3120: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
3130: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
3140: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3150: 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
3160: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
3170: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  rc;.}../*.** Set
3180: 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64   up the lookasid
3190: 65 20 62 75 66 66 65 72 73 20 66 6f 72 20 61 20  e buffers for a 
31a0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
31b0: 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 53  ion..** Return S
31c0: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
31d0: 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20 6c 6f 6f  ess.  .** If loo
31e0: 6b 61 73 69 64 65 20 69 73 20 61 6c 72 65 61 64  kaside is alread
31f0: 79 20 61 63 74 69 76 65 2c 20 72 65 74 75 72 6e  y active, return
3200: 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 2a 2a   SQLITE_BUSY..**
3210: 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61 72 61 6d  .** The sz param
3220: 65 74 65 72 20 69 73 20 74 68 65 20 6e 75 6d 62  eter is the numb
3230: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 65  er of bytes in e
3240: 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c  ach lookaside sl
3250: 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e 74 20 70  ot..** The cnt p
3260: 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20  arameter is the 
3270: 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f 74 73 2e  number of slots.
3280: 20 20 49 66 20 70 53 74 61 72 74 20 69 73 20 4e    If pStart is N
3290: 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70 61 63 65  ULL the.** space
32a0: 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b 61 73 69   for the lookasi
32b0: 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 6f 62 74  de memory is obt
32c0: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
32d0: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20  e3_malloc()..** 
32e0: 49 66 20 70 53 74 61 72 74 20 69 73 20 6e 6f 74  If pStart is not
32f0: 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73   NULL then it is
3300: 20 73 7a 2a 63 6e 74 20 62 79 74 65 73 20 6f 66   sz*cnt bytes of
3310: 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73 65 20 66   memory to use f
3320: 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f 6b 61 73  or.** the lookas
3330: 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  ide memory..*/.s
3340: 74 61 74 69 63 20 69 6e 74 20 73 65 74 75 70 4c  tatic int setupL
3350: 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69 74 65 33  ookaside(sqlite3
3360: 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70 42 75 66   *db, void *pBuf
3370: 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74 20 63 6e  , int sz, int cn
3380: 74 29 7b 0a 20 20 76 6f 69 64 20 2a 70 53 74 61  t){.  void *pSta
3390: 72 74 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f  rt;.  if( db->lo
33a0: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20 29 7b 0a  okaside.nOut ){.
33b0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33c0: 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 2f 2a  E_BUSY;.  }.  /*
33d0: 20 46 72 65 65 20 61 6e 79 20 65 78 69 73 74 69   Free any existi
33e0: 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66  ng lookaside buf
33f0: 66 65 72 20 66 6f 72 20 74 68 69 73 20 68 61 6e  fer for this han
3400: 64 6c 65 20 62 65 66 6f 72 65 0a 20 20 2a 2a 20  dle before.  ** 
3410: 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20 6e 65 77  allocating a new
3420: 20 6f 6e 65 20 73 6f 20 77 65 20 64 6f 6e 27 74   one so we don't
3430: 20 68 61 76 65 20 74 6f 20 68 61 76 65 20 73 70   have to have sp
3440: 61 63 65 20 66 6f 72 20 0a 20 20 2a 2a 20 62 6f  ace for .  ** bo
3450: 74 68 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  th at the same t
3460: 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ime..  */.  if( 
3470: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
3480: 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73  alloced ){.    s
3490: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
34a0: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
34b0: 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54 68 65 20  );.  }.  /* The 
34c0: 73 69 7a 65 20 6f 66 20 61 20 6c 6f 6f 6b 61 73  size of a lookas
34d0: 69 64 65 20 73 6c 6f 74 20 6e 65 65 64 73 20 74  ide slot needs t
34e0: 6f 20 62 65 20 6c 61 72 67 65 72 20 74 68 61 6e  o be larger than
34f0: 20 61 20 70 6f 69 6e 74 65 72 0a 20 20 2a 2a 20   a pointer.  ** 
3500: 74 6f 20 62 65 20 75 73 65 66 75 6c 2e 0a 20 20  to be useful..  
3510: 2a 2f 0a 20 20 69 66 28 20 73 7a 3c 3d 28 69 6e  */.  if( sz<=(in
3520: 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69  t)sizeof(Lookasi
3530: 64 65 53 6c 6f 74 2a 29 20 29 20 73 7a 20 3d 20  deSlot*) ) sz = 
3540: 30 3b 0a 20 20 69 66 28 20 63 6e 74 3c 30 20 29  0;.  if( cnt<0 )
3550: 20 63 6e 74 20 3d 20 30 3b 0a 20 20 69 66 28 20   cnt = 0;.  if( 
3560: 73 7a 3d 3d 30 20 7c 7c 20 63 6e 74 3d 3d 30 20  sz==0 || cnt==0 
3570: 29 7b 0a 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20  ){.    sz = 0;. 
3580: 20 20 20 70 53 74 61 72 74 20 3d 20 30 3b 0a 20     pStart = 0;. 
3590: 20 7d 65 6c 73 65 20 69 66 28 20 70 42 75 66 3d   }else if( pBuf=
35a0: 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d 20 52  =0 ){.    sz = R
35b0: 4f 55 4e 44 38 28 73 7a 29 3b 0a 20 20 20 20 73  OUND8(sz);.    s
35c0: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
35d0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 70  nMalloc();.    p
35e0: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 4d  Start = sqlite3M
35f0: 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20 29 3b  alloc( sz*cnt );
3600: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
3610: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
3620: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 7a 20 3d   }else{.    sz =
3630: 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b   ROUNDDOWN8(sz);
3640: 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 70 42  .    pStart = pB
3650: 75 66 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f  uf;.  }.  db->lo
3660: 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74 20 3d  okaside.pStart =
3670: 20 70 53 74 61 72 74 3b 0a 20 20 64 62 2d 3e 6c   pStart;.  db->l
3680: 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20 3d  ookaside.pFree =
3690: 20 30 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73   0;.  db->lookas
36a0: 69 64 65 2e 73 7a 20 3d 20 28 75 31 36 29 73 7a  ide.sz = (u16)sz
36b0: 3b 0a 20 20 69 66 28 20 70 53 74 61 72 74 20 29  ;.  if( pStart )
36c0: 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
36d0: 20 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 20 2a   LookasideSlot *
36e0: 70 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73  p;.    assert( s
36f0: 7a 20 3e 20 28 69 6e 74 29 73 69 7a 65 6f 66 28  z > (int)sizeof(
3700: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
3710: 29 3b 0a 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b  );.    p = (Look
3720: 61 73 69 64 65 53 6c 6f 74 2a 29 70 53 74 61 72  asideSlot*)pStar
3730: 74 3b 0a 20 20 20 20 66 6f 72 28 69 3d 63 6e 74  t;.    for(i=cnt
3740: 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a  -1; i>=0; i--){.
3750: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
3760: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
3770: 46 72 65 65 3b 0a 20 20 20 20 20 20 64 62 2d 3e  Free;.      db->
3780: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 20  lookaside.pFree 
3790: 3d 20 70 3b 0a 20 20 20 20 20 20 70 20 3d 20 28  = p;.      p = (
37a0: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 26  LookasideSlot*)&
37b0: 28 28 75 38 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20  ((u8*)p)[sz];.  
37c0: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b    }.    db->look
37d0: 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 70 3b 0a  aside.pEnd = p;.
37e0: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
37f0: 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 31 3b 0a  e.bEnabled = 1;.
3800: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
3810: 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 70 42  e.bMalloced = pB
3820: 75 66 3d 3d 30 20 3f 31 3a 30 3b 0a 20 20 7d 65  uf==0 ?1:0;.  }e
3830: 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f  lse{.    db->loo
3840: 6b 61 73 69 64 65 2e 70 45 6e 64 20 3d 20 30 3b  kaside.pEnd = 0;
3850: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
3860: 64 65 2e 62 45 6e 61 62 6c 65 64 20 3d 20 30 3b  de.bEnabled = 0;
3870: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
3880: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 3d 20 30  de.bMalloced = 0
3890: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
38a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
38b0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 75  ** Return the mu
38c0: 74 65 78 20 61 73 73 6f 63 69 61 74 65 64 20 77  tex associated w
38d0: 69 74 68 20 61 20 64 61 74 61 62 61 73 65 20 63  ith a database c
38e0: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71  onnection..*/.sq
38f0: 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 73 71 6c  lite3_mutex *sql
3900: 69 74 65 33 5f 64 62 5f 6d 75 74 65 78 28 73 71  ite3_db_mutex(sq
3910: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
3920: 74 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a  turn db->mutex;.
3930: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75  }../*.** Configu
3940: 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67 73 20  ration settings 
3950: 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64 75 61  for an individua
3960: 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  l database conne
3970: 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ction.*/.int sql
3980: 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 73  ite3_db_config(s
3990: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
39a0: 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  op, ...){.  va_l
39b0: 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63  ist ap;.  int rc
39c0: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
39d0: 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20   op);.  switch( 
39e0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53  op ){.    case S
39f0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4c  QLITE_DBCONFIG_L
3a00: 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20  OOKASIDE: {.    
3a10: 20 20 76 6f 69 64 20 2a 70 42 75 66 20 3d 20 76    void *pBuf = v
3a20: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
3a30: 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  ;.      int sz =
3a40: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
3a50: 3b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  ;.      int cnt 
3a60: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3a70: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  );.      rc = se
3a80: 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c  tupLookaside(db,
3a90: 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b   pBuf, sz, cnt);
3aa0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3ab0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
3ac0: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51   {.      rc = SQ
3ad0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
3ae0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3af0: 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
3b00: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3b10: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
3b20: 72 75 65 20 69 66 20 74 68 65 20 62 75 66 66 65  rue if the buffe
3b30: 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74  r z[0..n-1] cont
3b40: 61 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e  ains all spaces.
3b50: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
3b60: 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63  llSpaces(const c
3b70: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
3b80: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
3b90: 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e  z[n-1]==' ' ){ n
3ba0: 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  --; }.  return n
3bb0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ==0;.}../*.** Th
3bc0: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
3bd0: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  t collating func
3be0: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41  tion named "BINA
3bf0: 52 59 22 20 77 68 69 63 68 20 69 73 20 61 6c 77  RY" which is alw
3c00: 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ays.** available
3c10: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
3c20: 61 64 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  adFlag argument 
3c30: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
3c40: 20 73 70 61 63 65 20 70 61 64 64 69 6e 67 20 61   space padding a
3c50: 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20  t the end.** of 
3c60: 73 74 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72  strings is ignor
3c70: 65 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d  ed.  This implem
3c80: 65 6e 74 73 20 74 68 65 20 52 54 52 49 4d 20 63  ents the RTRIM c
3c90: 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ollation..*/.sta
3ca0: 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46  tic int binCollF
3cb0: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64  unc(.  void *pad
3cc0: 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Flag,.  int nKey
3cd0: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
3ce0: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
3cf0: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
3d00: 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Key2.){.  int rc
3d10: 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31  , n;.  n = nKey1
3d20: 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a  <nKey2 ? nKey1 :
3d30: 20 6e 4b 65 79 32 3b 0a 20 20 72 63 20 3d 20 6d   nKey2;.  rc = m
3d40: 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65  emcmp(pKey1, pKe
3d50: 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63  y2, n);.  if( rc
3d60: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
3d70: 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61  adFlag.     && a
3d80: 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a  llSpaces(((char*
3d90: 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31  )pKey1)+n, nKey1
3da0: 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53  -n).     && allS
3db0: 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b  paces(((char*)pK
3dc0: 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29  ey2)+n, nKey2-n)
3dd0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
3de0: 20 4c 65 61 76 65 20 72 63 20 75 6e 63 68 61 6e   Leave rc unchan
3df0: 67 65 64 20 61 74 20 30 20 2a 2f 0a 20 20 20 20  ged at 0 */.    
3e00: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
3e10: 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
3e20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
3e30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
3e40: 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69   Another built-i
3e50: 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  n collating sequ
3e60: 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a  ence: NOCASE. .*
3e70: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74  *.** This collat
3e80: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
3e90: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
3ea0: 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e  sed for "case in
3eb0: 64 65 70 65 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d  dependant.** com
3ec0: 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65  parison". SQLite
3ed0: 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  's knowledge of 
3ee0: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
3ef0: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73  case equivalents
3f00: 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79  .** extends only
3f10: 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61   to the 26 chara
3f20: 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68  cters used in th
3f30: 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e English langua
3f40: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  ge..**.** At the
3f50: 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73   moment there is
3f60: 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d   only a UTF-8 im
3f70: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
3f80: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61  .static int noca
3f90: 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28  seCollatingFunc(
3fa0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
3fb0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
3fc0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
3fd0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
3fe0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
3ff0: 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71  .){.  int r = sq
4000: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20  lite3StrNICmp(. 
4010: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
4020: 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74   *)pKey1, (const
4030: 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28   char *)pKey2, (
4040: 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65  nKey1<nKey2)?nKe
4050: 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55  y1:nKey2);.  UNU
4060: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
4070: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d  tUsed);.  if( 0=
4080: 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b  =r ){.    r = nK
4090: 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  ey1-nKey2;.  }. 
40a0: 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a   return r;.}../*
40b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52  .** Return the R
40c0: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
40d0: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
40e0: 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  /.sqlite_int64 s
40f0: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
4100: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
4110: 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
4120: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d  db->lastRowid;.}
4130: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
4140: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
4150: 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74  nges in the most
4160: 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
4170: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
4180: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
4190: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
41a0: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
41b0: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  ->nChange;.}../*
41c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
41d0: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
41e0: 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62   since the datab
41f0: 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f  ase handle was o
4200: 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pened..*/.int sq
4210: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
4220: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
4230: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e  {.  return db->n
4240: 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a  TotalChange;.}..
4250: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
4260: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
4270: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   This function o
4280: 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20  nly manipulates 
4290: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a  fields of the.**
42a0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
42b0: 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73   object, it does
42c0: 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73   not close any s
42d0: 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d  avepoints that m
42e0: 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74  ay be open.** at
42f0: 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65   the b-tree/page
4300: 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64  r level..*/.void
4310: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
4320: 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20  epoints(sqlite3 
4330: 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64  *db){.  while( d
4340: 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  b->pSavepoint ){
4350: 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  .    Savepoint *
4360: 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65  pTmp = db->pSave
4370: 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70  point;.    db->p
4380: 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70  Savepoint = pTmp
4390: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
43a0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
43b0: 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  Tmp);.  }.  db->
43c0: 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
43d0: 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
43e0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72   = 0;.  db->isTr
43f0: 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69  ansactionSavepoi
4400: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
4410: 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69   Close an existi
4420: 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62 61  ng SQLite databa
4430: 73 65 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  se.*/.int sqlite
4440: 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20  3_close(sqlite3 
4450: 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d  *db){.  HashElem
4460: 20 2a 69 3b 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20   *i;.  int j;.. 
4470: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
4480: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4490: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
44a0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
44b0: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
44c0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
44d0: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 73  _MISUSE;.  }.  s
44e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
44f0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a  er(db->mutex);..
4500: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 53 53  #ifdef SQLITE_SS
4510: 45 0a 20 20 7b 0a 20 20 20 20 65 78 74 65 72 6e  E.  {.    extern
4520: 20 76 6f 69 64 20 73 71 6c 69 74 65 33 53 73 65   void sqlite3Sse
4530: 43 6c 65 61 6e 75 70 28 73 71 6c 69 74 65 33 2a  Cleanup(sqlite3*
4540: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 73  );.    sqlite3Ss
4550: 65 43 6c 65 61 6e 75 70 28 64 62 29 3b 0a 20 20  eCleanup(db);.  
4560: 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 73 71 6c  }.#endif ..  sql
4570: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
4580: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
4590: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
45a0: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
45b0: 74 68 65 20 52 65 73 65 74 49 6e 74 65 72 6e 61  the ResetInterna
45c0: 6c 53 63 68 65 6d 61 28 29 20 63 61 6c 6c 20 61  lSchema() call a
45d0: 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e  bove.  ** will n
45e0: 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74  ot have called t
45f0: 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29  he xDisconnect()
4600: 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76   method on any v
4610: 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c  irtual.  ** tabl
4620: 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56  es in the db->aV
4630: 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54  Trans[] array. T
4640: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
4650: 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b  ite3VtabRollback
4660: 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c  ().  ** call wil
4670: 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64  l do so. We need
4680: 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f   to do this befo
4690: 72 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72  re the check for
46a0: 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c   active.  ** SQL
46b0: 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f   statements belo
46c0: 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c  w, as the v-tabl
46d0: 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
46e0: 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a   may be storing.
46f0: 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72    ** some prepar
4700: 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  ed statements in
4710: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20  ternally..  */. 
4720: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
4730: 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  back(db);..  /* 
4740: 49 66 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  If there are any
4750: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 56 4d 73   outstanding VMs
4760: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
4770: 42 55 53 59 2e 20 2a 2f 0a 20 20 69 66 28 20 64  BUSY. */.  if( d
4780: 62 2d 3e 70 56 64 62 65 20 29 7b 0a 20 20 20 20  b->pVdbe ){.    
4790: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
47a0: 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
47b0: 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
47c0: 6f 20 63 6c 6f 73 65 20 64 75 65 20 74 6f 20 75  o close due to u
47d0: 6e 66 69 6e 61 6c 69 73 65 64 20 73 74 61 74 65  nfinalised state
47e0: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 73 71 6c  ments");.    sql
47f0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
4800: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
4810: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
4820: 55 53 59 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  USY;.  }.  asser
4830: 74 28 20 73 71 6c 69 74 65 33 53 61 66 65 74 79  t( sqlite3Safety
4840: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
4850: 29 20 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b  ) );..  for(j=0;
4860: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
4870: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
4880: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42   = db->aDb[j].pB
4890: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  t;.    if( pBt &
48a0: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
48b0: 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29 7b  InBackup(pBt) ){
48c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
48d0: 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  ror(db, SQLITE_B
48e0: 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 20 20  USY, .          
48f0: 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65  "unable to close
4900: 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 69 73 68   due to unfinish
4910: 65 64 20 62 61 63 6b 75 70 20 6f 70 65 72 61 74  ed backup operat
4920: 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20 73 71 6c  ion");.      sql
4930: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
4940: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
4950: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4960: 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 7d  _BUSY;.    }.  }
4970: 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  ..  /* Free any 
4980: 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65  outstanding Save
4990: 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73  point structures
49a0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c  . */.  sqlite3Cl
49b0: 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62  oseSavepoints(db
49c0: 29 3b 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  );..  for(j=0; j
49d0: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
49e0: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
49f0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d  Db = &db->aDb[j]
4a00: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
4a10: 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Bt ){.      sqli
4a20: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44  te3BtreeClose(pD
4a30: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70  b->pBt);.      p
4a40: 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20  Db->pBt = 0;.   
4a50: 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20     if( j!=1 ){. 
4a60: 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68         pDb->pSch
4a70: 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ema = 0;.      }
4a80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
4a90: 69 74 65 33 52 65 73 65 74 49 6e 74 65 72 6e 61  ite3ResetInterna
4aa0: 6c 53 63 68 65 6d 61 28 64 62 2c 20 30 29 3b 0a  lSchema(db, 0);.
4ab0: 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63  .  /* Tell the c
4ac0: 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20  ode in notify.c 
4ad0: 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  that the connect
4ae0: 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f  ion no longer ho
4af0: 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63  lds any.  ** loc
4b00: 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ks and does not 
4b10: 72 65 71 75 69 72 65 20 61 6e 79 20 66 75 72 74  require any furt
4b20: 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  her unlock-notif
4b30: 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
4b40: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  /.  sqlite3Conne
4b50: 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b  ctionClosed(db);
4b60: 0a 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ..  assert( db->
4b70: 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65  nDb<=2 );.  asse
4b80: 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d  rt( db->aDb==db-
4b90: 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a 20 20  >aDbStatic );.  
4ba0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79  for(j=0; j<Array
4bb0: 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61  Size(db->aFunc.a
4bc0: 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e  ); j++){.    Fun
4bd0: 63 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48  cDef *pNext, *pH
4be0: 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72  ash, *p;.    for
4bf0: 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a  (p=db->aFunc.a[j
4c00: 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a  ]; p; p=pHash){.
4c10: 20 20 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d        pHash = p-
4c20: 3e 70 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68  >pHash;.      wh
4c30: 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20  ile( p ){.      
4c40: 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65    pNext = p->pNe
4c50: 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  xt;.        sqli
4c60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 29  te3DbFree(db, p)
4c70: 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e  ;.        p = pN
4c80: 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
4c90: 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73   }.  }.  for(i=s
4ca0: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
4cb0: 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69  db->aCollSeq); i
4cc0: 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65  ; i=sqliteHashNe
4cd0: 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c  xt(i)){.    Coll
4ce0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f  Seq *pColl = (Co
4cf0: 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61  llSeq *)sqliteHa
4d00: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f  shData(i);.    /
4d10: 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73  * Invoke any des
4d20: 74 72 75 63 74 6f 72 73 20 72 65 67 69 73 74 65  tructors registe
4d30: 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f  red for collatio
4d40: 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65 72 20  n sequence user 
4d50: 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  data. */.    for
4d60: 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
4d70: 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c  .      if( pColl
4d80: 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20  [j].xDel ){.    
4d90: 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65      pColl[j].xDe
4da0: 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72  l(pColl[j].pUser
4db0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4dc0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
4dd0: 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20  ee(db, pColl);. 
4de0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68   }.  sqlite3Hash
4df0: 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c  Clear(&db->aColl
4e00: 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Seq);.#ifndef SQ
4e10: 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
4e20: 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73  LTABLE.  for(i=s
4e30: 71 6c 69 74 65 48 61 73 68 46 69 72 73 74 28 26  qliteHashFirst(&
4e40: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b  db->aModule); i;
4e50: 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   i=sqliteHashNex
4e60: 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c  t(i)){.    Modul
4e70: 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c  e *pMod = (Modul
4e80: 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  e *)sqliteHashDa
4e90: 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70  ta(i);.    if( p
4ea0: 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b  Mod->xDestroy ){
4eb0: 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65  .      pMod->xDe
4ec0: 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78  stroy(pMod->pAux
4ed0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
4ee0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
4ef0: 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Mod);.  }.  sqli
4f00: 74 65 33 48 61 73 68 43 6c 65 61 72 28 26 64 62  te3HashClear(&db
4f10: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64  ->aModule);.#end
4f20: 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72  if..  sqlite3Err
4f30: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
4f40: 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63  , 0); /* Dealloc
4f50: 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64 20  ates any cached 
4f60: 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a  error strings. *
4f70: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72  /.  if( db->pErr
4f80: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
4f90: 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72  alueFree(db->pEr
4fa0: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
4fb0: 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73  3CloseExtensions
4fc0: 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67  (db);..  db->mag
4fd0: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
4fe0: 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54  C_ERROR;..  /* T
4ff0: 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65  he temp-database
5000: 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63   schema is alloc
5010: 61 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  ated differently
5020: 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20   from the other 
5030: 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65  schema.  ** obje
5040: 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74  cts (using sqlit
5050: 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74  eMalloc() direct
5060: 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73  ly, instead of s
5070: 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65 6d  qlite3BtreeSchem
5080: 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74  a())..  ** So it
5090: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72 65   needs to be fre
50a0: 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57  ed here. Todo: W
50b0: 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20  hy not roll the 
50c0: 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f  temp schema into
50d0: 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73  .  ** the same s
50e0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73  qliteMalloc() as
50f0: 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c   the one that al
5100: 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61 74 61  locates the data
5110: 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63  base .  ** struc
5120: 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c  ture?.  */.  sql
5130: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 64  ite3DbFree(db, d
5140: 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
5150: 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  a);.  sqlite3_mu
5160: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
5170: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69  tex);.  db->magi
5180: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
5190: 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74  _CLOSED;.  sqlit
51a0: 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62  e3_mutex_free(db
51b0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
51c0: 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  rt( db->lookasid
51d0: 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a  e.nOut==0 );  /*
51e0: 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b   Fails on a look
51f0: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61  aside memory lea
5200: 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c  k */.  if( db->l
5210: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
5220: 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ed ){.    sqlite
5230: 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61  3_free(db->looka
5240: 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20  side.pStart);.  
5250: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
5260: 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  (db);.  return S
5270: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5280: 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
5290: 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a  database files..
52a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  */.void sqlite3R
52b0: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74  ollbackAll(sqlit
52c0: 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69  e3 *db){.  int i
52d0: 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20  ;.  int inTrans 
52e0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  = 0;.  assert( s
52f0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
5300: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
5310: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
5320: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
5330: 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
5340: 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
5350: 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
5360: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
5370: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 54 72  lite3BtreeIsInTr
5380: 61 6e 73 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  ans(db->aDb[i].p
5390: 42 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Bt) ){.        i
53a0: 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20  nTrans = 1;.    
53b0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
53c0: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 64  3BtreeRollback(d
53d0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 3b 0a  b->aDb[i].pBt);.
53e0: 20 20 20 20 20 20 64 62 2d 3e 61 44 62 5b 69 5d        db->aDb[i]
53f0: 2e 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20  .inTrans = 0;.  
5400: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
5410: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
5420: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
5430: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
5440: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 26    if( db->flags&
5450: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
5460: 6e 67 65 73 20 29 7b 0a 20 20 20 20 73 71 6c 69  nges ){.    sqli
5470: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
5480: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
5490: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
54a0: 74 49 6e 74 65 72 6e 61 6c 53 63 68 65 6d 61 28  tInternalSchema(
54b0: 64 62 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  db, 0);.  }..  /
54c0: 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65  * If one has bee
54d0: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e  n configured, in
54e0: 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63  voke the rollbac
54f0: 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20  k-hook callback 
5500: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f  */.  if( db->xRo
5510: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26  llbackCallback &
5520: 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64  & (inTrans || !d
5530: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29  b->autoCommit) )
5540: 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62  {.    db->xRollb
5550: 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ackCallback(db->
5560: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20  pRollbackArg);. 
5570: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
5580: 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69  rn a static stri
5590: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
55a0: 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72  s the kind of er
55b0: 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  ror specified in
55c0: 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   the.** argument
55d0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
55e0: 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69  *sqlite3ErrStr(i
55f0: 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74 69 63  nt rc){.  static
5600: 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e   const char* con
5610: 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20  st aMsg[] = {.  
5620: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20    /* SQLITE_OK  
5630: 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20          */ "not 
5640: 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f  an error",.    /
5650: 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 20  * SQLITE_ERROR  
5660: 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67       */ "SQL log
5670: 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73  ic error or miss
5680: 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20  ing database",. 
5690: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54     /* SQLITE_INT
56a0: 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20  ERNAL    */ 0,. 
56b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52     /* SQLITE_PER
56c0: 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61 63 63  M        */ "acc
56d0: 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64  ess permission d
56e0: 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  enied",.    /* S
56f0: 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20 20 20  QLITE_ABORT     
5700: 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72    */ "callback r
5710: 65 71 75 65 73 74 65 64 20 71 75 65 72 79 20 61  equested query a
5720: 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51  bort",.    /* SQ
5730: 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20 20 20  LITE_BUSY       
5740: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 69 73   */ "database is
5750: 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a   locked",.    /*
5760: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20   SQLITE_LOCKED  
5770: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
5780: 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64   table is locked
5790: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
57a0: 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20  _NOMEM       */ 
57b0: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c  "out of memory",
57c0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
57d0: 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61  EADONLY    */ "a
57e0: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
57f0: 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62  a readonly datab
5800: 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ase",.    /* SQL
5810: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 20 20  ITE_INTERRUPT   
5820: 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65 64 22  */ "interrupted"
5830: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
5840: 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f 20 22  IOERR       */ "
5850: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c  disk I/O error",
5860: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
5870: 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20 22 64  ORRUPT     */ "d
5880: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
5890: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22  ge is malformed"
58a0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
58b0: 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20 30  NOTFOUND    */ 0
58c0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
58d0: 46 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22  FULL        */ "
58e0: 64 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b  database or disk
58f0: 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f   is full",.    /
5900: 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  * SQLITE_CANTOPE
5910: 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20  N    */ "unable 
5920: 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
5930: 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53   file",.    /* S
5940: 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20  QLITE_PROTOCOL  
5950: 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a 20 53    */ 0,.    /* S
5960: 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20  QLITE_EMPTY     
5970: 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74    */ "table cont
5980: 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20  ains no data",. 
5990: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48     /* SQLITE_SCH
59a0: 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74  EMA      */ "dat
59b0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
59c0: 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f   changed",.    /
59d0: 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  * SQLITE_TOOBIG 
59e0: 20 20 20 20 20 2a 2f 20 22 53 74 72 69 6e 67 20       */ "String 
59f0: 6f 72 20 42 4c 4f 42 20 65 78 63 65 65 64 65 64  or BLOB exceeded
5a00: 20 73 69 7a 65 20 6c 69 6d 69 74 22 2c 0a 20 20   size limit",.  
5a10: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 53    /* SQLITE_CONS
5a20: 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f 6e 73  TRAINT  */ "cons
5a30: 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22 2c 0a  traint failed",.
5a40: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49      /* SQLITE_MI
5a50: 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22 64 61  SMATCH    */ "da
5a60: 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63 68 22  tatype mismatch"
5a70: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
5a80: 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f 20 22  MISUSE      */ "
5a90: 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e 65 20  library routine 
5aa0: 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20 73 65  called out of se
5ab0: 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f 2a 20  quence",.    /* 
5ac0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20 20 20  SQLITE_NOLFS    
5ad0: 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66 69 6c     */ "large fil
5ae0: 65 20 73 75 70 70 6f 72 74 20 69 73 20 64 69 73  e support is dis
5af0: 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  abled",.    /* S
5b00: 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20 20 20  QLITE_AUTH      
5b10: 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a 61 74    */ "authorizat
5b20: 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20  ion denied",.   
5b30: 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41   /* SQLITE_FORMA
5b40: 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78 69 6c  T      */ "auxil
5b50: 69 61 72 79 20 64 61 74 61 62 61 73 65 20 66 6f  iary database fo
5b60: 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20 20 20  rmat error",.   
5b70: 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e 47 45   /* SQLITE_RANGE
5b80: 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e 64 20         */ "bind 
5b90: 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20  or column index 
5ba0: 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c 0a 20  out of range",. 
5bb0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
5bc0: 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66 69 6c  ADB      */ "fil
5bd0: 65 20 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f  e is encrypted o
5be0: 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74 61 62  r is not a datab
5bf0: 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 72 63 20  ase",.  };.  rc 
5c00: 26 3d 20 30 78 66 66 3b 0a 20 20 69 66 28 20 41  &= 0xff;.  if( A
5c10: 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20  LWAYS(rc>=0) && 
5c20: 72 63 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28  rc<(int)(sizeof(
5c30: 61 4d 73 67 29 2f 73 69 7a 65 6f 66 28 61 4d 73  aMsg)/sizeof(aMs
5c40: 67 5b 30 5d 29 29 20 26 26 20 61 4d 73 67 5b 72  g[0])) && aMsg[r
5c50: 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  c]!=0 ){.    ret
5c60: 75 72 6e 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20  urn aMsg[rc];.  
5c70: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72  }else{.    retur
5c80: 6e 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  n "unknown error
5c90: 22 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ";.  }.}../*.** 
5ca0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
5cb0: 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63  lements a busy c
5cc0: 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65  allback that sle
5cd0: 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a  eps and tries.**
5ce0: 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74   again until a t
5cf0: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20  imeout value is 
5d00: 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69  reached.  The ti
5d10: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a  meout value is.*
5d20: 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  * an integer num
5d30: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
5d40: 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73  nds passed in as
5d50: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
5d60: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
5d70: 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61  c int sqliteDefa
5d80: 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28  ultBusyCallback(
5d90: 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20  . void *ptr,    
5da0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
5db0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
5dc0: 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20  n */. int count 
5dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5de0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  * Number of time
5df0: 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e  s table has been
5e00: 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20   busy */.){.#if 
5e10: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c  SQLITE_OS_WIN ||
5e20: 20 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55   (defined(HAVE_U
5e30: 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55  SLEEP) && HAVE_U
5e40: 53 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63 20  SLEEP).  static 
5e50: 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b  const u8 delays[
5e60: 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c  ] =.     { 1, 2,
5e70: 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20   5, 10, 15, 20, 
5e80: 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30  25, 25,  25,  50
5e90: 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20  ,  50, 100 };.  
5ea0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
5eb0: 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20  totals[] =.     
5ec0: 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31  { 0, 1, 3,  8, 1
5ed0: 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31  8, 33, 53, 78, 1
5ee0: 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32  03, 128, 178, 22
5ef0: 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44  8 };.# define ND
5f00: 45 4c 41 59 20 28 73 69 7a 65 6f 66 28 64 65 6c  ELAY (sizeof(del
5f10: 61 79 73 29 2f 73 69 7a 65 6f 66 28 64 65 6c 61  ays)/sizeof(dela
5f20: 79 73 5b 30 5d 29 29 0a 20 20 73 71 6c 69 74 65  ys[0])).  sqlite
5f30: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
5f40: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
5f50: 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79  meout = db->busy
5f60: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64  Timeout;.  int d
5f70: 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20  elay, prior;..  
5f80: 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30  assert( count>=0
5f90: 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20   );.  if( count 
5fa0: 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20  < NDELAY ){.    
5fb0: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63  delay = delays[c
5fc0: 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72  ount];.    prior
5fd0: 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d   = totals[count]
5fe0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
5ff0: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44  elay = delays[ND
6000: 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69  ELAY-1];.    pri
6010: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c  or = totals[NDEL
6020: 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63  AY-1] + delay*(c
6030: 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29  ount-(NDELAY-1))
6040: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f  ;.  }.  if( prio
6050: 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65  r + delay > time
6060: 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  out ){.    delay
6070: 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69   = timeout - pri
6080: 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61  or;.    if( dela
6090: 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y<=0 ) return 0;
60a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
60b0: 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20  Sleep(db->pVfs, 
60c0: 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72  delay*1000);.  r
60d0: 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20  eturn 1;.#else. 
60e0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
60f0: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
6100: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28   int timeout = (
6110: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d  (sqlite3 *)ptr)-
6120: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
6130: 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30  if( (count+1)*10
6140: 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  00 > timeout ){.
6150: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6160: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
6170: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30  ep(db->pVfs, 100
6180: 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0000);.  return 
6190: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
61a0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
61b0: 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ven busy handler
61c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
61d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
61e0: 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  hen an operation
61f0: 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c   failed with a l
6200: 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20  ock..** If this 
6210: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
6220: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
6230: 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20  ck is retried.  
6240: 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73  If it.** returns
6250: 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f   0, the operatio
6260: 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e  n aborts with an
6270: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
6280: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
6290: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
62a0: 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20  ler(BusyHandler 
62b0: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
62c0: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
62d0: 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20   || p->xFunc==0 
62e0: 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20  || p->nBusy<0 ) 
62f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
6300: 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72   p->xFunc(p->pAr
6310: 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20  g, p->nBusy);.  
6320: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
6330: 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a   p->nBusy = -1;.
6340: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
6350: 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72  nBusy++;.  }.  r
6360: 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a  eturn rc; .}../*
6370: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
6380: 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63   sets the busy c
6390: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
63a0: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
63b0: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
63c0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
63d0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
63e0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
63f0: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
6400: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
6410: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42   *db,.  int (*xB
6420: 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c  usy)(void*,int),
6430: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
6440: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
6450: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
6460: 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  );.  db->busyHan
6470: 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75  dler.xFunc = xBu
6480: 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  sy;.  db->busyHa
6490: 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72  ndler.pArg = pAr
64a0: 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  g;.  db->busyHan
64b0: 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
64c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
64d0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
64e0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
64f0: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
6500: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
6510: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f  GRESS_CALLBACK./
6520: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6530: 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67 72  e sets the progr
6540: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ess callback for
6550: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
6560: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
6570: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
6580: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
6590: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  iven argument. T
65a0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
65b0: 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  back will.** be 
65c0: 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f  invoked every nO
65d0: 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76  ps opcodes..*/.v
65e0: 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67  oid sqlite3_prog
65f0: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20  ress_handler(.  
6600: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
6610: 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20  int nOps,.  int 
6620: 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69  (*xProgress)(voi
6630: 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41  d*), .  void *pA
6640: 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  rg.){.  sqlite3_
6650: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
6660: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f  mutex);.  if( nO
6670: 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  ps>0 ){.    db->
6680: 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f  xProgress = xPro
6690: 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e  gress;.    db->n
66a0: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f  ProgressOps = nO
66b0: 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f  ps;.    db->pPro
66c0: 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b  gressArg = pArg;
66d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
66e0: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->xProgress = 0;
66f0: 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65  .    db->nProgre
6700: 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64  ssOps = 0;.    d
6710: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
6720: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
6730: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
6740: 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e  b->mutex);.}.#en
6750: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
6760: 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c   routine install
6770: 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79  s a default busy
6780: 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61   handler that wa
6790: 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  its for the.** s
67a0: 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20  pecified number 
67b0: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
67c0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
67d0: 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
67e0: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
67f0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6800: 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30   ms){.  if( ms>0
6810: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79   ){.    db->busy
6820: 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20  Timeout = ms;.  
6830: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
6840: 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74  andler(db, sqlit
6850: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
6860: 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29  back, (void*)db)
6870: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
6880: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
6890: 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20  ler(db, 0, 0);. 
68a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
68b0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
68c0: 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e  Cause any pendin
68d0: 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73  g operation to s
68e0: 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69  top at its earli
68f0: 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e  est opportunity.
6900: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6910: 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74  _interrupt(sqlit
6920: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75  e3 *db){.  db->u
6930: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
6940: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  = 1;.}.../*.** T
6950: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
6960: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
6970: 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61   as sqlite3_crea
6980: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65  te_function(), e
6990: 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74  xcept.** that it
69a0: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
69b0: 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74  be called by int
69c0: 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20  ernal code. The 
69d0: 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a  difference is.**
69e0: 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f   that if a mallo
69f0: 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c  c() fails in sql
6a00: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
6a10: 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72  tion(), an error
6a20: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75   code.** is retu
6a30: 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c  rned and the mal
6a40: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63  locFailed flag c
6a50: 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20  leared. .*/.int 
6a60: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
6a70: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
6a80: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
6a90: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
6aa0: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
6ab0: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55   enc,.  void *pU
6ac0: 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20  serData,.  void 
6ad0: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
6ae0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
6af0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
6b00: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
6b10: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
6b20: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
6b30: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
6b40: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
6b50: 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20  3_context*).){. 
6b60: 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69   FuncDef *p;.  i
6b70: 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73  nt nName;..  ass
6b80: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6b90: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
6ba0: 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e  x) );.  if( zFun
6bb0: 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a  ctionName==0 ||.
6bc0: 20 20 20 20 20 20 28 78 46 75 6e 63 20 26 26 20        (xFunc && 
6bd0: 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70  (xFinal || xStep
6be0: 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78  )) || .      (!x
6bf0: 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20  Func && (xFinal 
6c00: 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20  && !xStep)) ||. 
6c10: 20 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20       (!xFunc && 
6c20: 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65  (!xFinal && xSte
6c30: 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41  p)) ||.      (nA
6c40: 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51  rg<-1 || nArg>SQ
6c50: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
6c60: 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20  N_ARG) ||.      
6c70: 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71  (255<(nName = sq
6c80: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a  lite3Strlen30( z
6c90: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20  FunctionName))) 
6ca0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6cb0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
6cc0: 0a 20 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .  .#ifndef SQLI
6cd0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20  TE_OMIT_UTF16.  
6ce0: 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46  /* If SQLITE_UTF
6cf0: 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20  16 is specified 
6d00: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  as the encoding 
6d10: 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20  type, transform 
6d20: 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65  this.  ** to one
6d30: 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   of SQLITE_UTF16
6d40: 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46  LE or SQLITE_UTF
6d50: 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20  16BE using the. 
6d60: 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   ** SQLITE_UTF16
6d70: 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51  NATIVE macro. SQ
6d80: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f  LITE_UTF16 is no
6d90: 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  t used internall
6da0: 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  y..  **.  ** If 
6db0: 53 51 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70  SQLITE_ANY is sp
6dc0: 65 63 69 66 69 65 64 2c 20 61 64 64 20 74 68 72  ecified, add thr
6dd0: 65 65 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74  ee versions of t
6de0: 68 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a  he function.  **
6df0: 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62   to the hash tab
6e00: 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65  le..  */.  if( e
6e10: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
6e20: 20 29 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51   ){.    enc = SQ
6e30: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
6e40: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e  ;.  }else if( en
6e50: 63 3d 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b  c==SQLITE_ANY ){
6e60: 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
6e70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
6e80: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
6e90: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
6ea0: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20   SQLITE_UTF8,.  
6eb0: 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61         pUserData
6ec0: 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20  , xFunc, xStep, 
6ed0: 78 46 69 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28  xFinal);.    if(
6ee0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
6ef0: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
6f00: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
6f10: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
6f20: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
6f30: 54 46 31 36 4c 45 2c 0a 20 20 20 20 20 20 20 20  TF16LE,.        
6f40: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75    pUserData, xFu
6f50: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
6f60: 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  l);.    }.    if
6f70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6f80: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
6f90: 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e  rc;.    }.    en
6fa0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  c = SQLITE_UTF16
6fb0: 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20  BE;.  }.#else.  
6fc0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
6fd0: 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f  8;.#endif.  .  /
6fe0: 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78  * Check if an ex
6ff0: 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  isting function 
7000: 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64  is being overrid
7010: 64 65 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20  den or deleted. 
7020: 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20  If so,.  ** and 
7030: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
7040: 20 56 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72   VMs, then retur
7050: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49  n SQLITE_BUSY. I
7060: 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a  f a function.  *
7070: 2a 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72  * is being overr
7080: 69 64 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75  idden/deleted bu
7090: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  t there are no a
70a0: 63 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77  ctive VMs, allow
70b0: 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74   the.  ** operat
70c0: 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  ion to continue 
70d0: 62 75 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61  but invalidate a
70e0: 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73  ll precompiled s
70f0: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a  tatements..  */.
7100: 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e    p = sqlite3Fin
7110: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46  dFunction(db, zF
7120: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61  unctionName, nNa
7130: 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e  me, nArg, (u8)en
7140: 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26  c, 0);.  if( p &
7150: 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 65  & p->iPrefEnc==e
7160: 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e  nc && p->nArg==n
7170: 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Arg ){.    if( d
7180: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
7190: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
71a0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
71b0: 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
71c0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65   "unable to dele
71d0: 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d 66  te/modify user-f
71e0: 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20 61  unction due to a
71f0: 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
7200: 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ");.      assert
7210: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
7220: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
7230: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
7240: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
7250: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
7260: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
7270: 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  s(db);.    }.  }
7280: 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  ..  p = sqlite3F
7290: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
72a0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
72b0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29  Name, nArg, (u8)
72c0: 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  enc, 1);.  asser
72d0: 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  t(p || db->mallo
72e0: 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20  cFailed);.  if( 
72f0: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
7300: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
7310: 20 7d 0a 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20   }.  p->flags = 
7320: 30 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20  0;.  p->xFunc = 
7330: 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65  xFunc;.  p->xSte
7340: 70 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e  p = xStep;.  p->
7350: 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e  xFinalize = xFin
7360: 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61  al;.  p->pUserDa
7370: 74 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a  ta = pUserData;.
7380: 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36    p->nArg = (u16
7390: 29 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20  )nArg;.  return 
73a0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
73b0: 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75  .** Create new u
73c0: 73 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a  ser functions..*
73d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
73e0: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  eate_function(. 
73f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
7400: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
7410: 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  ctionName,.  int
7420: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63   nArg,.  int enc
7430: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
7440: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
7450: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
7460: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
7470: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
7480: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
7490: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
74a0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
74b0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
74c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a  lite3_context*).
74d0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
74e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
74f0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
7500: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
7510: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
7520: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
7530: 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20   enc, p, xFunc, 
7540: 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a  xStep, xFinal);.
7550: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
7560: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
7570: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
7580: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
7590: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
75a0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
75b0: 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20 73  OMIT_UTF16.int s
75c0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
75d0: 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69  nction16(.  sqli
75e0: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
75f0: 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f 6e   void *zFunction
7600: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
7610: 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65 70  ,.  int eTextRep
7620: 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76  ,.  void *p,.  v
7630: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
7640: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
7650: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
7660: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
7670: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
7680: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
7690: 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69  _value**),.  voi
76a0: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
76b0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
76c0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
76d0: 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71 6c  r *zFunc8;.  sql
76e0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
76f0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
7700: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
7710: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46  ocFailed );.  zF
7720: 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55 74  unc8 = sqlite3Ut
7730: 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63  f16to8(db, zFunc
7740: 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 29 3b 0a 20  tionName, -1);. 
7750: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
7760: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
7770: 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52  c8, nArg, eTextR
7780: 65 70 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  ep, p, xFunc, xS
7790: 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20  tep, xFinal);.  
77a0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
77b0: 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20  , zFunc8);.  rc 
77c0: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
77d0: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
77e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
77f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
7800: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
7810: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72  f.../*.** Declar
7820: 65 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f  e that a functio
7830: 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c  n has been overl
7840: 6f 61 64 65 64 20 62 79 20 61 20 76 69 72 74 75  oaded by a virtu
7850: 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  al table..**.** 
7860: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
7870: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61  already exists a
7880: 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62  s a regular glob
7890: 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65  al function, the
78a0: 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e  n.** this routin
78b0: 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49  e is a no-op.  I
78c0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64  f the function d
78d0: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74  oes not exist, t
78e0: 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20  hen create.** a 
78f0: 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77  new one that alw
7900: 61 79 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e  ays throws a run
7910: 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a  -time error.  .*
7920: 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61  *.** When virtua
7930: 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20  l tables intend 
7940: 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76  to provide an ov
7950: 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f  erloaded functio
7960: 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c  n, they.** shoul
7970: 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  d call this rout
7980: 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  ine to make sure
7990: 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63   the global func
79a0: 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20  tion exists..** 
79b0: 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f  A global functio
79c0: 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20  n must exist in 
79d0: 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72  order for name r
79e0: 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72  esolution to wor
79f0: 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a  k.** properly..*
7a00: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76  /.int sqlite3_ov
7a10: 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28  erload_function(
7a20: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a  .  sqlite3 *db,.
7a30: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
7a40: 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a  ame,.  int nArg.
7a50: 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  ){.  int nName =
7a60: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
7a70: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72  (zName);.  int r
7a80: 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  c;.  sqlite3_mut
7a90: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
7aa0: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
7ab0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
7ac0: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  b, zName, nName,
7ad0: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
7ae0: 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20  F8, 0)==0 ){.   
7af0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
7b00: 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41  nc(db, zName, nA
7b10: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
7b20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7b30: 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74 65         0, sqlite
7b40: 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e  3InvalidFunction
7b50: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
7b60: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
7b70: 69 74 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  it(db, SQLITE_OK
7b80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
7b90: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
7ba0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
7bb0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
7bc0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
7bd0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
7be0: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20  trace function. 
7bf0: 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
7c00: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
7c10: 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a  gistered trace.*
7c20: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  * is returned.  
7c30: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72  .**.** A NULL tr
7c40: 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ace function mea
7c50: 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69  ns that no traci
7c60: 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
7c70: 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74   A non-NULL.** t
7c80: 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65  race is a pointe
7c90: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
7ca0: 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
7cb0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
7cc0: 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74  each.** SQL stat
7cd0: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ement..*/.void *
7ce0: 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71  sqlite3_trace(sq
7cf0: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
7d00: 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c  (*xTrace)(void*,
7d10: 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f  const char*), vo
7d20: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69  id *pArg){.  voi
7d30: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
7d40: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
7d50: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
7d60: 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72  d = db->pTraceAr
7d70: 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20  g;.  db->xTrace 
7d80: 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e  = xTrace;.  db->
7d90: 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67  pTraceArg = pArg
7da0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
7db0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
7dc0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
7dd0: 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  d;.}./*.** Regis
7de0: 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75  ter a profile fu
7df0: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
7e00: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
7e10: 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
7e20: 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e   .** profile fun
7e30: 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65  ction is returne
7e40: 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  d.  .**.** A NUL
7e50: 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  L profile functi
7e60: 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  on means that no
7e70: 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78   profiling is ex
7e80: 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
7e90: 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69  ULL.** profile i
7ea0: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
7eb0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
7ec0: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
7ed0: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a   conclusion of.*
7ee0: 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  * each SQL state
7ef0: 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e  ment that is run
7f00: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
7f10: 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71  e3_profile(.  sq
7f20: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
7f30: 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f  d (*xProfile)(vo
7f40: 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  id*,const char*,
7f50: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a  sqlite_uint64),.
7f60: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
7f70: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20    void *pOld;.  
7f80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
7f90: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
7fa0: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72    pOld = db->pPr
7fb0: 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e  ofileArg;.  db->
7fc0: 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66  xProfile = xProf
7fd0: 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66  ile;.  db->pProf
7fe0: 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ileArg = pArg;. 
7ff0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
8000: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
8010: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
8020: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
8030: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f  TE_OMIT_TRACE */
8040: 0a 0a 2f 2a 2a 2a 20 45 58 50 45 52 49 4d 45 4e  ../*** EXPERIMEN
8050: 54 41 4c 20 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65  TAL ***.**.** Re
8060: 67 69 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f  gister a functio
8070: 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  n to be invoked 
8080: 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69  when a transacti
8090: 6f 6e 20 63 6f 6d 6d 65 6e 74 73 2e 0a 2a 2a 20  on comments..** 
80a0: 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64 20 66  If the invoked f
80b0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
80c0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74  non-zero, then t
80d0: 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65  he commit become
80e0: 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e  s a.** rollback.
80f0: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
8100: 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20  3_commit_hook(. 
8110: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
8120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
8130: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
8140: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
8150: 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  /.  int (*xCallb
8160: 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a  ack)(void*),  /*
8170: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76   Function to inv
8180: 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d  oke on each comm
8190: 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  it */.  void *pA
81a0: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
81b0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
81c0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
81d0: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  .){.  void *pOld
81e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
81f0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
8200: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
8210: 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64  >pCommitArg;.  d
8220: 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
8230: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
8240: 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67    db->pCommitArg
8250: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
8260: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
8270: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
8280: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a  urn pOld;.}../*.
8290: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
82a0: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
82b0: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
82c0: 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c   row is updated,
82d0: 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20  .** inserted or 
82e0: 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68  deleted using th
82f0: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
8300: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
8310: 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f  *sqlite3_update_
8320: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
8330: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
8340: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
8350: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
8360: 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20  abase */.  void 
8370: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
8380: 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73  d*,int,char cons
8390: 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  t *,char const *
83a0: 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a  ,sqlite_int64),.
83b0: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
83d0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
83e0: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
83f0: 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71  void *pRet;.  sq
8400: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
8410: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
8420: 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70 64 61  pRet = db->pUpda
8430: 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70  teArg;.  db->xUp
8440: 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78  dateCallback = x
8450: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
8460: 70 55 70 64 61 74 65 41 72 67 20 3d 20 70 41 72  pUpdateArg = pAr
8470: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
8480: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
8490: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
84a0: 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  et;.}../*.** Reg
84b0: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
84c0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
84d0: 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
84e0: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
84f0: 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68 69 73  .** back by this
8500: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
8510: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  tion..*/.void *s
8520: 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f  qlite3_rollback_
8530: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
8540: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
8550: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
8560: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
8570: 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20  abase */.  void 
8580: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
8590: 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  d*), /* Callback
85a0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76   function */.  v
85b0: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
85c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
85d0: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
85e0: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
85f0: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
8600: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
8610: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
8620: 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63  t = db->pRollbac
8630: 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c  kArg;.  db->xRol
8640: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20  lbackCallback = 
8650: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
8660: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20  >pRollbackArg = 
8670: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
8680: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
8690: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
86a0: 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pRet;.}../*.** 
86b0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
86c0: 74 75 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61  turns true if ma
86d0: 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64  in-memory should
86e0: 20 62 65 20 75 73 65 64 20 69 6e 73 74 65 61 64   be used instead
86f0: 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61   of.** a tempora
8700: 72 79 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e  ry file for tran
8710: 73 69 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65  sient pager file
8720: 73 20 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20  s and statement 
8730: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65  journals..** The
8740: 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   value returned 
8750: 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76  depends on the v
8760: 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70  alue of db->temp
8770: 5f 73 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a  _store (runtime.
8780: 2a 2a 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e  ** parameter) an
8790: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69  d the compile ti
87a0: 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49  me value of SQLI
87b0: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54  TE_TEMP_STORE. T
87c0: 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  he.** following 
87d0: 74 61 62 6c 65 20 64 65 73 63 72 69 62 65 73 20  table describes 
87e0: 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70  the relationship
87f0: 20 62 65 74 77 65 65 6e 20 74 68 65 73 65 20 74   between these t
8800: 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64  wo values.** and
8810: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20   this functions 
8820: 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a  return value..**
8830: 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d  .**   SQLITE_TEM
8840: 50 5f 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e  P_STORE     db->
8850: 74 65 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c  temp_store     L
8860: 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f  ocation of tempo
8870: 72 61 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  rary database.**
8880: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
8890: 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  ----     -------
88a0: 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d  -------     ----
88b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
88c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
88d0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
88e0: 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20        any       
88f0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
8900: 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
8910: 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20     1            
8920: 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20           1      
8930: 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65              file
8940: 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29        (return 0)
8950: 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20  .**   1         
8960: 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20              2   
8970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
8980: 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
8990: 20 31 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   1).**   1      
89a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
89b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89c0: 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
89d0: 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20  urn 0).**   2   
89e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89f0: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
8a00: 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
8a10: 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32  return 0).**   2
8a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a30: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
8a40: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
8a50: 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
8a60: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
8a70: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
8a80: 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72             memor
8a90: 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a  y    (return 1).
8aa0: 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20 20 20  **   3          
8ab0: 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
8ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
8ad0: 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
8ae0: 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  1).*/.int sqlite
8af0: 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f  3TempInMemory(co
8b00: 6e 73 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29  nst sqlite3 *db)
8b10: 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  {.#if SQLITE_TEM
8b20: 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74  P_STORE==1.  ret
8b30: 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73  urn ( db->temp_s
8b40: 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69  tore==2 );.#endi
8b50: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
8b60: 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74  P_STORE==2.  ret
8b70: 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73  urn ( db->temp_s
8b80: 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69  tore!=1 );.#endi
8b90: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
8ba0: 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74  P_STORE==3.  ret
8bb0: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 72  urn 1;.#else.  r
8bc0: 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a  eturn 0;.#endif.
8bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
8be0: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
8bf0: 74 6f 20 63 72 65 61 74 65 20 61 20 63 6f 6e 6e  to create a conn
8c00: 65 63 74 69 6f 6e 20 74 6f 20 61 20 64 61 74 61  ection to a data
8c10: 62 61 73 65 20 42 54 72 65 65 0a 2a 2a 20 64 72  base BTree.** dr
8c20: 69 76 65 72 2e 20 20 49 66 20 7a 46 69 6c 65 6e  iver.  If zFilen
8c30: 61 6d 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ame is the name 
8c40: 6f 66 20 61 20 66 69 6c 65 2c 20 74 68 65 6e 20  of a file, then 
8c50: 74 68 61 74 20 66 69 6c 65 20 69 73 0a 2a 2a 20  that file is.** 
8c60: 6f 70 65 6e 65 64 20 61 6e 64 20 75 73 65 64 2e  opened and used.
8c70: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
8c80: 73 20 74 68 65 20 6d 61 67 69 63 20 6e 61 6d 65  s the magic name
8c90: 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e   ":memory:" then
8ca0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
8cb0: 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65   is stored in me
8cc0: 6d 6f 72 79 20 28 61 6e 64 20 69 73 20 74 68 75  mory (and is thu
8cd0: 73 20 66 6f 72 67 6f 74 74 65 6e 20 61 73 20 73  s forgotten as s
8ce0: 6f 6f 6e 20 61 73 0a 2a 2a 20 74 68 65 20 63 6f  oon as.** the co
8cf0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73  nnection is clos
8d00: 65 64 2e 29 20 20 49 66 20 7a 46 69 6c 65 6e 61  ed.)  If zFilena
8d10: 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
8d20: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
8d30: 69 73 20 61 20 22 76 69 72 74 75 61 6c 22 20 64  is a "virtual" d
8d40: 61 74 61 62 61 73 65 20 66 6f 72 20 74 72 61 6e  atabase for tran
8d50: 73 69 65 6e 74 20 75 73 65 20 6f 6e 6c 79 20 61  sient use only a
8d60: 6e 64 20 69 73 20 64 65 6c 65 74 65 64 20 61 73  nd is deleted as
8d70: 0a 2a 2a 20 73 6f 6f 6e 20 61 73 20 74 68 65 20  .** soon as the 
8d80: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6c  connection is cl
8d90: 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 76 69  osed..**.** A vi
8da0: 72 74 75 61 6c 20 64 61 74 61 62 61 73 65 20 63  rtual database c
8db0: 61 6e 20 62 65 20 65 69 74 68 65 72 20 61 20 64  an be either a d
8dc0: 69 73 6b 20 66 69 6c 65 20 28 74 68 61 74 20 69  isk file (that i
8dd0: 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 0a  s automatically.
8de0: 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20  ** deleted when 
8df0: 74 68 65 20 66 69 6c 65 20 69 73 20 63 6c 6f 73  the file is clos
8e00: 65 64 29 20 6f 72 20 69 74 20 61 6e 20 62 65 20  ed) or it an be 
8e10: 68 65 6c 64 20 65 6e 74 69 72 65 6c 79 20 69 6e  held entirely in
8e20: 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 20 54 68 65 20   memory..** The 
8e30: 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
8e40: 6f 72 79 28 29 20 66 75 6e 63 74 69 6f 6e 20 69  ory() function i
8e50: 73 20 75 73 65 64 20 74 6f 20 64 65 74 65 72 6d  s used to determ
8e60: 69 6e 65 20 77 68 69 63 68 2e 0a 2a 2f 0a 69 6e  ine which..*/.in
8e70: 74 20 73 71 6c 69 74 65 33 42 74 72 65 65 46 61  t sqlite3BtreeFa
8e80: 63 74 6f 72 79 28 0a 20 20 63 6f 6e 73 74 20 73  ctory(.  const s
8e90: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
8ea0: 20 20 20 2f 2a 20 4d 61 69 6e 20 64 61 74 61 62     /* Main datab
8eb0: 61 73 65 20 77 68 65 6e 20 6f 70 65 6e 69 6e 67  ase when opening
8ec0: 20 61 75 78 20 6f 74 68 65 72 77 69 73 65 20 30   aux otherwise 0
8ed0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
8ee0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20   *zFilename,    
8ef0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
8f00: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ile containing t
8f10: 68 65 20 42 54 72 65 65 20 64 61 74 61 62 61 73  he BTree databas
8f20: 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 6d 69 74 4a  e */.  int omitJ
8f30: 6f 75 72 6e 61 6c 2c 20 20 20 20 20 20 20 20 20  ournal,         
8f40: 20 2f 2a 20 69 66 20 54 52 55 45 20 74 68 65 6e   /* if TRUE then
8f50: 20 64 6f 20 6e 6f 74 20 6a 6f 75 72 6e 61 6c 20   do not journal 
8f60: 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69  this file */.  i
8f70: 6e 74 20 6e 43 61 63 68 65 2c 20 20 20 20 20 20  nt nCache,      
8f80: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20           /* How 
8f90: 6d 61 6e 79 20 70 61 67 65 73 20 69 6e 20 74 68  many pages in th
8fa0: 65 20 70 61 67 65 20 63 61 63 68 65 20 2a 2f 0a  e page cache */.
8fb0: 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 2c 20    int vfsFlags, 
8fc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
8fd0: 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
8fe0: 75 67 68 20 74 6f 20 76 66 73 4f 70 65 6e 20 2a  ugh to vfsOpen *
8ff0: 2f 0a 20 20 42 74 72 65 65 20 2a 2a 70 70 42 74  /.  Btree **ppBt
9000: 72 65 65 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ree           /*
9010: 20 50 6f 69 6e 74 65 72 20 74 6f 20 6e 65 77 20   Pointer to new 
9020: 42 74 72 65 65 20 6f 62 6a 65 63 74 20 77 72 69  Btree object wri
9030: 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
9040: 20 20 69 6e 74 20 62 74 46 6c 61 67 73 20 3d 20    int btFlags = 
9050: 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 0a  0;.  int rc;.  .
9060: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
9070: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
9080: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73  >mutex) );.  ass
9090: 65 72 74 28 20 70 70 42 74 72 65 65 20 21 3d 20  ert( ppBtree != 
90a0: 30 29 3b 0a 20 20 69 66 28 20 6f 6d 69 74 4a 6f  0);.  if( omitJo
90b0: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 62 74 46  urnal ){.    btF
90c0: 6c 61 67 73 20 7c 3d 20 42 54 52 45 45 5f 4f 4d  lags |= BTREE_OM
90d0: 49 54 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 7d 0a  IT_JOURNAL;.  }.
90e0: 20 20 69 66 28 20 64 62 2d 3e 66 6c 61 67 73 20    if( db->flags 
90f0: 26 20 53 51 4c 49 54 45 5f 4e 6f 52 65 61 64 6c  & SQLITE_NoReadl
9100: 6f 63 6b 20 29 7b 0a 20 20 20 20 62 74 46 6c 61  ock ){.    btFla
9110: 67 73 20 7c 3d 20 42 54 52 45 45 5f 4e 4f 5f 52  gs |= BTREE_NO_R
9120: 45 41 44 4c 4f 43 4b 3b 0a 20 20 7d 0a 23 69 66  EADLOCK;.  }.#if
9130: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9140: 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 69 66 28 20  _MEMORYDB.  if( 
9150: 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 26 26 20  zFilename==0 && 
9160: 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
9170: 6f 72 79 28 64 62 29 20 29 7b 0a 20 20 20 20 7a  ory(db) ){.    z
9180: 46 69 6c 65 6e 61 6d 65 20 3d 20 22 3a 6d 65 6d  Filename = ":mem
9190: 6f 72 79 3a 22 3b 0a 20 20 7d 0a 23 65 6e 64 69  ory:";.  }.#endi
91a0: 66 0a 0a 20 20 69 66 28 20 28 76 66 73 46 6c 61  f..  if( (vfsFla
91b0: 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
91c0: 5f 4d 41 49 4e 5f 44 42 29 21 3d 30 20 26 26 20  _MAIN_DB)!=0 && 
91d0: 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 7c 7c  (zFilename==0 ||
91e0: 20 2a 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 29 20   *zFilename==0) 
91f0: 29 7b 0a 20 20 20 20 76 66 73 46 6c 61 67 73 20  ){.    vfsFlags 
9200: 3d 20 28 76 66 73 46 6c 61 67 73 20 26 20 7e 53  = (vfsFlags & ~S
9210: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
9220: 44 42 29 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  DB) | SQLITE_OPE
9230: 4e 5f 54 45 4d 50 5f 44 42 3b 0a 20 20 7d 0a 20  N_TEMP_DB;.  }. 
9240: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
9250: 65 65 4f 70 65 6e 28 7a 46 69 6c 65 6e 61 6d 65  eeOpen(zFilename
9260: 2c 20 28 73 71 6c 69 74 65 33 20 2a 29 64 62 2c  , (sqlite3 *)db,
9270: 20 70 70 42 74 72 65 65 2c 20 62 74 46 6c 61 67   ppBtree, btFlag
9280: 73 2c 20 76 66 73 46 6c 61 67 73 29 3b 0a 0a 20  s, vfsFlags);.. 
9290: 20 2f 2a 20 49 66 20 74 68 65 20 42 2d 54 72 65   /* If the B-Tre
92a0: 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
92b0: 6c 79 20 6f 70 65 6e 65 64 2c 20 73 65 74 20 74  ly opened, set t
92c0: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 73  he pager-cache s
92d0: 69 7a 65 20 74 6f 20 74 68 65 0a 20 20 2a 2a 20  ize to the.  ** 
92e0: 64 65 66 61 75 6c 74 20 76 61 6c 75 65 2e 20 45  default value. E
92f0: 78 63 65 70 74 2c 20 69 66 20 74 68 65 20 63 61  xcept, if the ca
9300: 6c 6c 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28  ll to BtreeOpen(
9310: 29 20 72 65 74 75 72 6e 65 64 20 61 20 68 61 6e  ) returned a han
9320: 64 6c 65 0a 20 20 2a 2a 20 6f 70 65 6e 20 6f 6e  dle.  ** open on
9330: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 73 68 61   an existing sha
9340: 72 65 64 20 70 61 67 65 72 2d 63 61 63 68 65 2c  red pager-cache,
9350: 20 64 6f 20 6e 6f 74 20 63 68 61 6e 67 65 20 74   do not change t
9360: 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 0a  he pager-cache .
9370: 20 20 2a 2a 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a    ** size..  */.
9380: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
9390: 5f 4f 4b 20 26 26 20 30 3d 3d 73 71 6c 69 74 65  _OK && 0==sqlite
93a0: 33 42 74 72 65 65 53 63 68 65 6d 61 28 2a 70 70  3BtreeSchema(*pp
93b0: 42 74 72 65 65 2c 20 30 2c 20 30 29 20 29 7b 0a  Btree, 0, 0) ){.
93c0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
93d0: 53 65 74 43 61 63 68 65 53 69 7a 65 28 2a 70 70  SetCacheSize(*pp
93e0: 42 74 72 65 65 2c 20 6e 43 61 63 68 65 29 3b 0a  Btree, nCache);.
93f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
9400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
9410: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 45   UTF-8 encoded E
9420: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
9430: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
9440: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a  he most recent.*
9450: 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73  * error..*/.cons
9460: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
9470: 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20 2a  errmsg(sqlite3 *
9480: 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  db){.  const cha
9490: 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20  r *z;.  if( !db 
94a0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
94b0: 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
94c0: 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20  TE_NOMEM);.  }. 
94d0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
94e0: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
94f0: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
9500: 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
9510: 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 29 3b  (SQLITE_MISUSE);
9520: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
9530: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
9540: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d  utex);.  if( db-
9550: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
9560: 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  .    z = sqlite3
9570: 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f  ErrStr(SQLITE_NO
9580: 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  MEM);.  }else{. 
9590: 20 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71     z = (char*)sq
95a0: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
95b0: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
95c0: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
95d0: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
95e0: 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
95f0: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72     z = sqlite3Er
9600: 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65  rStr(db->errCode
9610: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73  );.    }.  }.  s
9620: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
9630: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
9640: 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69   return z;.}..#i
9650: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
9660: 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65  T_UTF16./*.** Re
9670: 74 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f  turn UTF-16 enco
9680: 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  ded English lang
9690: 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
96a0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
96b0: 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f  ent.** error..*/
96c0: 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c  .const void *sql
96d0: 69 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71  ite3_errmsg16(sq
96e0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74  lite3 *db){.  st
96f0: 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f  atic const u16 o
9700: 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20  utOfMem[] = {.  
9710: 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c    'o', 'u', 't',
9720: 20 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20   ' ', 'o', 'f', 
9730: 27 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27  ' ', 'm', 'e', '
9740: 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79  m', 'o', 'r', 'y
9750: 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74  ', 0.  };.  stat
9760: 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73  ic const u16 mis
9770: 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c  use[] = {.    'l
9780: 27 2c 20 27 69 27 2c 20 27 62 27 2c 20 27 72 27  ', 'i', 'b', 'r'
9790: 2c 20 27 61 27 2c 20 27 72 27 2c 20 27 79 27 2c  , 'a', 'r', 'y',
97a0: 20 27 20 27 2c 20 0a 20 20 20 20 27 72 27 2c 20   ' ', .    'r', 
97b0: 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27  'o', 'u', 't', '
97c0: 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27 20  i', 'n', 'e', ' 
97d0: 27 2c 20 0a 20 20 20 20 27 63 27 2c 20 27 61 27  ', .    'c', 'a'
97e0: 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c  , 'l', 'l', 'e',
97f0: 20 27 64 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   'd', ' ', .    
9800: 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27  'o', 'u', 't', '
9810: 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 66   ', .    'o', 'f
9820: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 73 27  ', ' ', .    's'
9830: 2c 20 27 65 27 2c 20 27 71 27 2c 20 27 75 27 2c  , 'e', 'q', 'u',
9840: 20 27 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20   'e', 'n', 'c', 
9850: 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63  'e', 0.  };..  c
9860: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20  onst void *z;.  
9870: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
9880: 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75  eturn (void *)ou
9890: 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66  tOfMem;.  }.  if
98a0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
98b0: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
98c0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
98d0: 28 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a  (void *)misuse;.
98e0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
98f0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
9900: 74 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  tex);.  if( db->
9910: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
9920: 20 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29      z = (void *)
9930: 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73  outOfMem;.  }els
9940: 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  e{.    z = sqlit
9950: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
9960: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69  db->pErr);.    i
9970: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( z==0 ){.     
9980: 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53 65 74   sqlite3ValueSet
9990: 53 74 72 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31  Str(db->pErr, -1
99a0: 2c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  , sqlite3ErrStr(
99b0: 64 62 2d 3e 65 72 72 43 6f 64 65 29 2c 0a 20 20  db->errCode),.  
99c0: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
99d0: 55 54 46 38 2c 20 53 51 4c 49 54 45 5f 53 54 41  UTF8, SQLITE_STA
99e0: 54 49 43 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  TIC);.      z = 
99f0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
9a00: 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a  xt16(db->pErr);.
9a10: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d      }.    /* A m
9a20: 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61 76 65  alloc() may have
9a30: 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e 20 74   failed within t
9a40: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
9a50: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
9a60: 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20  ).    ** above. 
9a70: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
9a80: 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 64 62  ase, then the db
9a90: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
9aa0: 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  lag needs to.   
9ab0: 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64 20 62   ** be cleared b
9ac0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
9ad0: 20 44 6f 20 74 68 69 73 20 64 69 72 65 63 74 6c   Do this directl
9ae0: 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69  y, instead of vi
9af0: 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  a.    ** sqlite3
9b00: 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20 61 76  ApiExit(), to av
9b10: 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68 65 20  oid setting the 
9b20: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
9b30: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20  error message.. 
9b40: 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61     */.    db->ma
9b50: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
9b60: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
9b70: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
9b80: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  tex);.  return z
9b90: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9ba0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
9bb0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
9bc0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
9bd0: 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65 6e 65   error code gene
9be0: 72 61 74 65 64 20 62 79 20 61 6e 20 53 51 4c 69  rated by an SQLi
9bf0: 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e  te routine. If N
9c00: 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65 64  ULL is.** passed
9c10: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
9c20: 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61 20 6d  n, we assume a m
9c30: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 64  alloc() failed d
9c40: 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70  uring sqlite3_op
9c50: 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  en()..*/.int sql
9c60: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73 71 6c  ite3_errcode(sql
9c70: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
9c80: 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53   db && !sqlite3S
9c90: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
9ca0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
9cb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
9cc0: 53 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  SE;.  }.  if( !d
9cd0: 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
9ce0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
9cf0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
9d00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
9d10: 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d  b->errCode & db-
9d20: 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20  >errMask;.}.int 
9d30: 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
9d40: 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
9d50: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
9d60: 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
9d70: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
9d80: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
9d90: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
9da0: 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
9db0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
9dc0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
9dd0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
9de0: 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
9df0: 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrCode;.}../*.**
9e00: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f   Create a new co
9e10: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
9e20: 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 22 64   for database "d
9e30: 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73  b".  The name is
9e40: 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68   zName.** and th
9e50: 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e  e encoding is en
9e60: 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  c..*/.static int
9e70: 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
9e80: 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c  (.  sqlite3* db,
9e90: 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
9ea0: 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e  zName, .  int en
9eb0: 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  c, .  void* pCtx
9ec0: 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
9ed0: 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
9ee0: 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
9ef0: 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
9f00: 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
9f10: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
9f20: 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b  oll;.  int enc2;
9f30: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
9f40: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
9f50: 4e 61 6d 65 29 3b 0a 20 20 0a 20 20 61 73 73 65  Name);.  .  asse
9f60: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
9f70: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
9f80: 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51  ) );..  /* If SQ
9f90: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
9fa0: 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
9fb0: 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
9fc0: 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
9fd0: 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
9fe0: 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
9ff0: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
a000: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
a010: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
a020: 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
a030: 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
a040: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a  nternally..  */.
a050: 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20    enc2 = enc;.  
a060: 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
a070: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a  SQLITE_UTF16 );.
a080: 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
a090: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  ==SQLITE_UTF16_A
a0a0: 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20  LIGNED );.  if( 
a0b0: 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
a0c0: 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49  16 || enc2==SQLI
a0d0: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
a0e0: 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53   ){.    enc2 = S
a0f0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
a100: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63  E;.  }.  if( enc
a110: 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c  2<SQLITE_UTF8 ||
a120: 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46   enc2>SQLITE_UTF
a130: 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75  16BE ){.    retu
a140: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
a150: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63  ;.  }..  /* Chec
a160: 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69  k if this call i
a170: 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65  s removing or re
a180: 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74  placing an exist
a190: 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20  ing collation . 
a1a0: 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66   ** sequence. If
a1b0: 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61   so, and there a
a1c0: 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72  re active VMs, r
a1d0: 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74  eturn busy. If t
a1e0: 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f  here.  ** are no
a1f0: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76   active VMs, inv
a200: 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d  alidate any pre-
a210: 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65  compiled stateme
a220: 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c  nts..  */.  pCol
a230: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
a240: 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65  ollSeq(db, (u8)e
a250: 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a  nc2, zName, 0);.
a260: 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
a270: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  Coll->xCmp ){.  
a280: 20 20 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65    if( db->active
a290: 56 64 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20  VdbeCnt ){.     
a2a0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
a2b0: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
a2c0: 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
a2d0: 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79  to delete/modify
a2e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
a2f0: 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76  nce due to activ
a300: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
a310: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a320: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
a330: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
a340: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
a350: 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a  nts(db);..    /*
a360: 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   If collation se
a370: 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73  quence pColl was
a380: 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c   created directl
a390: 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20  y by a call to. 
a3a0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72     ** sqlite3_cr
a3b0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20  eate_collation, 
a3c0: 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  and not generate
a3d0: 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  d by synthCollSe
a3e0: 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  q(),.    ** then
a3f0: 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65   any copies made
a400: 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
a410: 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e  () need to be in
a420: 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a  validated..    *
a430: 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f  * Also, collatio
a440: 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43  n destructor - C
a450: 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20  ollSeq.xDel() - 
a460: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65  function may nee
a470: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63  d.    ** to be c
a480: 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20  alled..    */ . 
a490: 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65     if( (pColl->e
a4a0: 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46  nc & ~SQLITE_UTF
a4b0: 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63  16_ALIGNED)==enc
a4c0: 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  2 ){.      CollS
a4d0: 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *aColl = sqli
a4e0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
a4f0: 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
a500: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , nName);.      
a510: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
a520: 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
a530: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
a540: 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b   *p = &aColl[j];
a550: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
a560: 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
a570: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
a580: 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20   p->xDel ){.    
a590: 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28          p->xDel(
a5a0: 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  p->pUser);.     
a5b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a5c0: 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20   p->xCmp = 0;.  
a5d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a5e0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f      }.  }..  pCo
a5f0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
a600: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
a610: 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b  enc2, zName, 1);
a620: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a  .  if( pColl ){.
a630: 20 20 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20      pColl->xCmp 
a640: 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20  = xCompare;.    
a650: 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70  pColl->pUser = p
a660: 43 74 78 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e  Ctx;.    pColl->
a670: 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 20  xDel = xDel;.   
a680: 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75   pColl->enc = (u
a690: 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26  8)(enc2 | (enc &
a6a0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c   SQLITE_UTF16_AL
a6b0: 49 47 4e 45 44 29 29 3b 0a 20 20 7d 0a 20 20 73  IGNED));.  }.  s
a6c0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
a6d0: 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
a6e0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a6f0: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  K;.}.../*.** Thi
a700: 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73 20  s array defines 
a710: 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64  hard upper bound
a720: 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65  s on limit value
a730: 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69  s.  The.** initi
a740: 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b  alizer must be k
a750: 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68  ept in sync with
a760: 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
a770: 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20  T_*.** #defines 
a780: 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f  in sqlite3.h..*/
a790: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e  .static const in
a7a0: 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d  t aHardLimit[] =
a7b0: 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f   {.  SQLITE_MAX_
a7c0: 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
a7d0: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c  _MAX_SQL_LENGTH,
a7e0: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
a7f0: 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LUMN,.  SQLITE_M
a800: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20  AX_EXPR_DEPTH,. 
a810: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
a820: 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53  OUND_SELECT,.  S
a830: 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
a840: 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  P,.  SQLITE_MAX_
a850: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20  FUNCTION_ARG,.  
a860: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
a870: 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  HED,.  SQLITE_MA
a880: 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
a890: 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
a8a0: 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
a8b0: 42 45 52 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  BER,.};../*.** M
a8c0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61 72  ake sure the har
a8d0: 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74  d limits are set
a8e0: 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76   to reasonable v
a8f0: 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c  alues.*/.#if SQL
a900: 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31  ITE_MAX_LENGTH<1
a910: 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
a920: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73  E_MAX_LENGTH mus
a930: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
a940: 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
a950: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
a960: 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53  TH<100.# error S
a970: 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
a980: 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
a990: 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
a9a0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
a9b0: 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54  SQL_LENGTH>SQLIT
a9c0: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65  E_MAX_LENGTH.# e
a9d0: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
a9e0: 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  SQL_LENGTH must 
a9f0: 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20 74  not be greater t
aa00: 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  han SQLITE_MAX_L
aa10: 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66  ENGTH.#endif.#if
aa20: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
aa30: 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20  OUND_SELECT<2.# 
aa40: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
aa50: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
aa60: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
aa70: 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 2.#endif.#if S
aa80: 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
aa90: 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  P<40.# error SQL
aaa0: 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20  ITE_MAX_VDBE_OP 
aab0: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
aac0: 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   40.#endif.#if S
aad0: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
aae0: 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49  ON_ARG<0 || SQLI
aaf0: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
ab00: 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72  ARG>1000.# error
ab10: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
ab20: 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65  TION_ARG must be
ab30: 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31   between 0 and 1
ab40: 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  000.#endif.#if S
ab50: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
ab60: 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  ED<0 || SQLITE_M
ab70: 41 58 5f 41 54 54 41 43 48 45 44 3e 33 30 0a 23  AX_ATTACHED>30.#
ab80: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
ab90: 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74 20  X_ATTACHED must 
aba0: 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
abb0: 20 33 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   30.#endif.#if S
abc0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
abd0: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a  ATTERN_LENGTH<1.
abe0: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
abf0: 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
ac00: 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
ac10: 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66  t least 1.#endif
ac20: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
ac30: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 3c  VARIABLE_NUMBER<
ac40: 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  1.# error SQLITE
ac50: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
ac60: 4d 42 45 52 20 6d 75 73 74 20 62 65 20 61 74 20  MBER must be at 
ac70: 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23  least 1.#endif.#
ac80: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  if SQLITE_MAX_CO
ac90: 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72  LUMN>32767.# err
aca0: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  or SQLITE_MAX_CO
acb0: 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78  LUMN must not ex
acc0: 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69  ceed 32767.#endi
acd0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  f.../*.** Change
ace0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
acf0: 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74  limit.  Report t
ad00: 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a  he old value..**
ad10: 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c   If an invalid l
ad20: 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73 75  imit index is su
ad30: 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d  pplied, report -
ad40: 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68  1..** Make no ch
ad50: 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20  anges but still 
ad60: 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  report the old v
ad70: 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e  alue if the.** n
ad80: 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61  ew limit is nega
ad90: 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65  tive..**.** A ne
ada0: 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f  w lower limit do
adb0: 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78  es not shrink ex
adc0: 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74  isting construct
add0: 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20  s..** It merely 
ade0: 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e  prevents new con
adf0: 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78 63  structs that exc
ae00: 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a  eed the limit.**
ae10: 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a   from forming..*
ae20: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69  /.int sqlite3_li
ae30: 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  mit(sqlite3 *db,
ae40: 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e   int limitId, in
ae50: 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69  t newLimit){.  i
ae60: 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 20 20 69  nt oldLimit;.  i
ae70: 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20  f( limitId<0 || 
ae80: 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f  limitId>=SQLITE_
ae90: 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 72  N_LIMIT ){.    r
aea0: 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20  eturn -1;.  }.  
aeb0: 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61  oldLimit = db->a
aec0: 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a  Limit[limitId];.
aed0: 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d    if( newLimit>=
aee0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 65 77  0 ){.    if( new
aef0: 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74  Limit>aHardLimit
af00: 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20  [limitId] ){.   
af10: 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48     newLimit = aH
af20: 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ardLimit[limitId
af30: 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  ];.    }.    db-
af40: 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
af50: 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d   = newLimit;.  }
af60: 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d  .  return oldLim
af70: 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  it;.}../*.** Thi
af80: 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74  s routine does t
af90: 68 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69  he work of openi
afa0: 6e 67 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e  ng a database on
afb0: 20 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71   behalf of.** sq
afc0: 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64  lite3_open() and
afd0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
afe0: 29 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20  ). The database 
aff0: 66 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e  filename "zFilen
b000: 61 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46  ame"  .** is UTF
b010: 2d 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73  -8 encoded..*/.s
b020: 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61  tatic int openDa
b030: 74 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20  tabase(.  const 
b040: 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
b050: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c   /* Database fil
b060: 65 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f  ename UTF-8 enco
b070: 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ded */.  sqlite3
b080: 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
b090: 2f 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64  /* OUT: Returned
b0a0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
b0b0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 66   */.  unsigned f
b0c0: 6c 61 67 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  lags,        /* 
b0d0: 4f 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67  Operational flag
b0e0: 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  s */.  const cha
b0f0: 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a  r *zVfs       /*
b100: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53   Name of the VFS
b110: 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20   to use */.){.  
b120: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69  sqlite3 *db;.  i
b130: 6e 74 20 72 63 3b 0a 20 20 43 6f 6c 6c 53 65 71  nt rc;.  CollSeq
b140: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 69   *pColl;.  int i
b150: 73 54 68 72 65 61 64 73 61 66 65 3b 0a 0a 20 20  sThreadsafe;..  
b160: 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64  *ppDb = 0;.#ifnd
b170: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41  ef SQLITE_OMIT_A
b180: 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73  UTOINIT.  rc = s
b190: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
b1a0: 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  e();.  if( rc ) 
b1b0: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
b1c0: 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  f..  if( sqlite3
b1d0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
b1e0: 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  reMutex==0 ){.  
b1f0: 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
b200: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
b210: 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
b220: 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20  PEN_NOMUTEX ){. 
b230: 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
b240: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
b250: 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
b260: 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29  OPEN_FULLMUTEX )
b270: 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
b280: 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  fe = 1;.  }else{
b290: 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
b2a0: 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  e = sqlite3Globa
b2b0: 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
b2c0: 65 78 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ex;.  }..  /* Re
b2d0: 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74  move harmful bit
b2e0: 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73  s from the flags
b2f0: 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a   parameter.  **.
b300: 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    ** The SQLITE_
b310: 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64  OPEN_NOMUTEX and
b320: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
b330: 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65 72  LMUTEX flags wer
b340: 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74  e.  ** dealt wit
b350: 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  h in the previou
b360: 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42  s code block.  B
b370: 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74 68  esides these, th
b380: 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69  e only.  ** vali
b390: 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f  d input flags fo
b3a0: 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
b3b0: 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f  2() are SQLITE_O
b3c0: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20  PEN_READONLY,.  
b3d0: 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ** SQLITE_OPEN_R
b3e0: 45 41 44 57 52 49 54 45 2c 20 61 6e 64 20 53 51  EADWRITE, and SQ
b3f0: 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
b400: 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b  .  Silently mask
b410: 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74  .  ** off all ot
b420: 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a  her flags..  */.
b430: 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53    flags &=  ~( S
b440: 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54  QLITE_OPEN_DELET
b450: 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20  EONCLOSE |.     
b460: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
b470: 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
b480: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
b490: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
b4a0: 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20  N_DB |.         
b4b0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
b4c0: 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20  N_TEMP_DB | .   
b4d0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
b4e0: 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e  TE_OPEN_TRANSIEN
b4f0: 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  T_DB | .        
b500: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
b510: 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
b520: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
b530: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
b540: 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  MP_JOURNAL | .  
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
b560: 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
b570: 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
b580: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
b590: 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c  N_MASTER_JOURNAL
b5a0: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
b5b0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f    SQLITE_OPEN_NO
b5c0: 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
b5d0: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
b5e0: 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20 20  EN_FULLMUTEX.   
b5f0: 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20            );..  
b600: 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
b610: 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72 75  sqlite data stru
b620: 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20  cture */.  db = 
b630: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
b640: 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  o( sizeof(sqlite
b650: 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d  3) );.  if( db==
b660: 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f  0 ) goto opendb_
b670: 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72  out;.  if( isThr
b680: 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64  eadsafe ){.    d
b690: 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  b->mutex = sqlit
b6a0: 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
b6b0: 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53  ITE_MUTEX_RECURS
b6c0: 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62  IVE);.    if( db
b6d0: 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
b6e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b6f0: 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d  (db);.      db =
b700: 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f   0;.      goto o
b710: 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d  pendb_out;.    }
b720: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
b730: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
b740: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72  utex);.  db->err
b750: 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64  Mask = 0xff;.  d
b760: 62 2d 3e 70 72 69 6f 72 4e 65 77 52 6f 77 69 64  b->priorNewRowid
b770: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 62 20   = 0;.  db->nDb 
b780: 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63  = 2;.  db->magic
b790: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
b7a0: 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20  BUSY;.  db->aDb 
b7b0: 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b  = db->aDbStatic;
b7c0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a 65  ..  assert( size
b7d0: 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d  of(db->aLimit)==
b7e0: 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69  sizeof(aHardLimi
b7f0: 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64  t) );.  memcpy(d
b800: 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64  b->aLimit, aHard
b810: 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62  Limit, sizeof(db
b820: 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62  ->aLimit));.  db
b830: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31  ->autoCommit = 1
b840: 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f  ;.  db->nextAuto
b850: 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e  vac = -1;.  db->
b860: 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30  nextPagesize = 0
b870: 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
b880: 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
b890: 4e 61 6d 65 73 0a 23 69 66 20 53 51 4c 49 54 45  Names.#if SQLITE
b8a0: 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f  _DEFAULT_FILE_FO
b8b0: 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20  RMAT<4.         
b8c0: 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
b8d0: 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23  _LegacyFileFmt.#
b8e0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
b8f0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f  ITE_ENABLE_LOAD_
b900: 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20  EXTENSION.      
b910: 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
b920: 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f  ITE_LoadExtensio
b930: 6e 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b  n.#endif.      ;
b940: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
b950: 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  it(&db->aCollSeq
b960: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
b970: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
b980: 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73  BLE.  sqlite3Has
b990: 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75  hInit(&db->aModu
b9a0: 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64  le);.#endif..  d
b9b0: 62 2d 3e 70 56 66 73 20 3d 20 73 71 6c 69 74 65  b->pVfs = sqlite
b9c0: 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29  3_vfs_find(zVfs)
b9d0: 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 70 56 66  ;.  if( !db->pVf
b9e0: 73 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  s ){.    rc = SQ
b9f0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
ba00: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
ba10: 20 72 63 2c 20 22 6e 6f 20 73 75 63 68 20 76 66   rc, "no such vf
ba20: 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20  s: %s", zVfs);. 
ba30: 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
ba40: 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64  ut;.  }..  /* Ad
ba50: 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  d the default co
ba60: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
ba70: 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20   BINARY. BINARY 
ba80: 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55  works for both U
ba90: 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54  TF-8.  ** and UT
baa0: 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76  F-16, so add a v
bab0: 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  ersion for each 
bac0: 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e  to avoid any unn
bad0: 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f  ecessary.  ** co
bae0: 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f  nversions. The o
baf0: 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63  nly error that c
bb00: 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73  an occur here is
bb10: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
bb20: 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61  ure..  */.  crea
bb30: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
bb40: 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
bb50: 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c  _UTF8, 0, binCol
bb60: 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
bb70: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
bb80: 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
bb90: 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69  E_UTF16BE, 0, bi
bba0: 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
bbb0: 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
bbc0: 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53  (db, "BINARY", S
bbd0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30  QLITE_UTF16LE, 0
bbe0: 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
bbf0: 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
bc00: 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22  tion(db, "RTRIM"
bc10: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28  , SQLITE_UTF8, (
bc20: 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c  void*)1, binColl
bc30: 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  Func, 0);.  if( 
bc40: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
bc50: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
bc60: 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64  ndb_out;.  }.  d
bc70: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73  b->pDfltColl = s
bc80: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
bc90: 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
bca0: 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b  8, "BINARY", 0);
bcb0: 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
bcc0: 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a  DfltColl!=0 );..
bcd0: 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20    /* Also add a 
bce0: 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e  UTF-8 case-insen
bcf0: 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e  sitive collation
bd00: 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20   sequence. */.  
bd10: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
bd20: 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51  db, "NOCASE", SQ
bd30: 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f  LITE_UTF8, 0, no
bd40: 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e  caseCollatingFun
bd50: 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 53 65 74  c, 0);..  /* Set
bd60: 20 66 6c 61 67 73 20 6f 6e 20 74 68 65 20 62 75   flags on the bu
bd70: 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e 67  ilt-in collating
bd80: 20 73 65 71 75 65 6e 63 65 73 20 2a 2f 0a 20 20   sequences */.  
bd90: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e 74  db->pDfltColl->t
bda0: 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 43 4f 4c  ype = SQLITE_COL
bdb0: 4c 5f 42 49 4e 41 52 59 3b 0a 20 20 70 43 6f 6c  L_BINARY;.  pCol
bdc0: 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43  l = sqlite3FindC
bdd0: 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54  ollSeq(db, SQLIT
bde0: 45 5f 55 54 46 38 2c 20 22 4e 4f 43 41 53 45 22  E_UTF8, "NOCASE"
bdf0: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 0);.  if( pCol
be00: 6c 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e  l ){.    pColl->
be10: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 43 4f  type = SQLITE_CO
be20: 4c 4c 5f 4e 4f 43 41 53 45 3b 0a 20 20 7d 0a 0a  LL_NOCASE;.  }..
be30: 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61    /* Open the ba
be40: 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20 64  ckend database d
be50: 72 69 76 65 72 20 2a 2f 0a 20 20 64 62 2d 3e 6f  river */.  db->o
be60: 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73  penFlags = flags
be70: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
be80: 42 74 72 65 65 46 61 63 74 6f 72 79 28 64 62 2c  BtreeFactory(db,
be90: 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 30 2c 20 53   zFilename, 0, S
bea0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 43 41  QLITE_DEFAULT_CA
beb0: 43 48 45 5f 53 49 5a 45 2c 20 0a 20 20 20 20 20  CHE_SIZE, .     
bec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bed0: 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51        flags | SQ
bee0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
bef0: 42 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B,.             
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 64                &d
bf10: 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
bf20: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
bf30: 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
bf40: 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
bf50: 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72  NOMEM ){.      r
bf60: 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
bf70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
bf80: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
bf90: 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70   0);.    goto op
bfa0: 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  endb_out;.  }.  
bfb0: 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65  db->aDb[0].pSche
bfc0: 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  ma = sqlite3Sche
bfd0: 6d 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61 44  maGet(db, db->aD
bfe0: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d  b[0].pBt);.  db-
bff0: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20  >aDb[1].pSchema 
c000: 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
c010: 65 74 28 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f  et(db, 0);...  /
c020: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 61  * The default sa
c030: 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74  fety_level for t
c040: 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
c050: 20 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20   is 'full'; for 
c060: 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61  the temp.  ** da
c070: 74 61 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f  tabase it is 'NO
c080: 4e 45 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65  NE'. This matche
c090: 73 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  s the pager laye
c0a0: 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20  r defaults.  .  
c0b0: 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  */.  db->aDb[0].
c0c0: 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a  zName = "main";.
c0d0: 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66    db->aDb[0].saf
c0e0: 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 23  ety_level = 3;.#
c0f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c100: 49 54 5f 54 45 4d 50 44 42 0a 20 20 64 62 2d 3e  IT_TEMPDB.  db->
c110: 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22  aDb[1].zName = "
c120: 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62  temp";.  db->aDb
c130: 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c  [1].safety_level
c140: 20 3d 20 31 3b 0a 23 65 6e 64 69 66 0a 0a 20 20   = 1;.#endif..  
c150: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
c160: 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20  TE_MAGIC_OPEN;. 
c170: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
c180: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74  ailed ){.    got
c190: 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
c1a0: 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  }..  /* Register
c1b0: 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75   all built-in fu
c1c0: 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20  nctions, but do 
c1d0: 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72  not attempt to r
c1e0: 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74  ead the.  ** dat
c1f0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 79 65 74  abase schema yet
c200: 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61 79 65  . This is delaye
c210: 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73  d until the firs
c220: 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62  t time the datab
c230: 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65  ase.  ** is acce
c240: 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ssed..  */.  sql
c250: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51  ite3Error(db, SQ
c260: 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 73  LITE_OK, 0);.  s
c270: 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42 75  qlite3RegisterBu
c280: 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64  iltinFunctions(d
c290: 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61  b);..  /* Load a
c2a0: 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69  utomatic extensi
c2b0: 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73  ons - extensions
c2c0: 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20   that have been 
c2d0: 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20  registered.  ** 
c2e0: 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65  using the sqlite
c2f0: 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65  3_automatic_exte
c300: 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a  nsion() API..  *
c310: 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  /.  (void)sqlite
c320: 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69  3AutoLoadExtensi
c330: 6f 6e 73 28 64 62 29 3b 0a 20 20 69 66 28 20 73  ons(db);.  if( s
c340: 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
c350: 62 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  b)!=SQLITE_OK ){
c360: 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
c370: 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  _out;.  }..#ifde
c380: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c390: 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS1.  if( !db->
c3a0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
c3b0: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
c3c0: 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73  qlite3Fts1Init(s
c3d0: 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
c3e0: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e   = sqlite3Fts1In
c3f0: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
c400: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
c410: 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20  E_ENABLE_FTS2.  
c420: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
c430: 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
c440: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78  ITE_OK ){.    ex
c450: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
c460: 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts2Init(sqlite3
c470: 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
c480: 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29  ite3Fts2Init(db)
c490: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
c4a0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c4b0: 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64  LE_FTS3.  if( !d
c4c0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c4d0: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
c4e0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
c4f0: 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29  ite3Fts3Init(db)
c500: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
c510: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c520: 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62  LE_ICU.  if( !db
c530: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
c540: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
c550: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
c560: 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a  te3IcuInit(db);.
c570: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
c580: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c590: 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62  _RTREE.  if( !db
c5a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
c5b0: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
c5c0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
c5d0: 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b  e3RtreeInit(db);
c5e0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
c5f0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
c600: 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 2d 44  rc, 0);..  /* -D
c610: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
c620: 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61  OCKING_MODE=1 ma
c630: 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68  kes EXCLUSIVE th
c640: 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
c650: 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44  g.  ** mode.  -D
c660: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
c670: 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61  OCKING_MODE=0 ma
c680: 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65  ke NORMAL the de
c690: 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20  fault locking.  
c6a0: 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20  ** mode.  Doing 
c6b0: 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61  nothing at all a
c6c0: 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c  lso makes NORMAL
c6d0: 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20   the default..  
c6e0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
c6f0: 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
c700: 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74  _MODE.  db->dflt
c710: 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54  LockMode = SQLIT
c720: 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
c730: 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65  G_MODE;.  sqlite
c740: 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
c750: 65 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  e(sqlite3BtreePa
c760: 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ger(db->aDb[0].p
c770: 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Bt),.           
c780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
c790: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
c7a0: 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e  CKING_MODE);.#en
c7b0: 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65  dif..  /* Enable
c7c0: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d   the lookaside-m
c7d0: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
c7e0: 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73  */.  setupLookas
c7f0: 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74  ide(db, 0, sqlit
c800: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
c810: 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20  zLookaside,.    
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
c840: 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69  lConfig.nLookasi
c850: 64 65 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74  de);..opendb_out
c860: 3a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20  :.  if( db ){.  
c870: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75    assert( db->mu
c880: 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65  tex!=0 || isThre
c890: 61 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c  adsafe==0 || sql
c8a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
c8b0: 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29  .bFullMutex==0 )
c8c0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
c8d0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
c8e0: 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  tex);.  }.  rc =
c8f0: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
c900: 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  (db);.  if( rc==
c910: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
c920: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
c930: 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20  e(db);.    db = 
c940: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  0;.  }else if( r
c950: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c960: 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
c970: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43  SQLITE_MAGIC_SIC
c980: 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d  K;.  }.  *ppDb =
c990: 20 64 62 3b 0a 20 20 72 65 74 75 72 6e 20 73 71   db;.  return sq
c9a0: 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20  lite3ApiExit(0, 
c9b0: 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  rc);.}../*.** Op
c9c0: 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
c9d0: 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
c9e0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20   sqlite3_open(. 
c9f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
ca00: 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
ca10: 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20  e3 **ppDb .){.  
ca20: 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62  return openDatab
ca30: 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ase(zFilename, p
ca40: 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pDb,.           
ca50: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
ca60: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
ca70: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
ca80: 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74  REATE, 0);.}.int
ca90: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
caa0: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
cab0: 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44  filename,   /* D
cac0: 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
cad0: 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
cae0: 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
caf0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51        /* OUT: SQ
cb00: 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a  Lite db handle *
cb10: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
cb20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
cb30: 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
cb40: 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20  char *zVfs      
cb50: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53    /* Name of VFS
cb60: 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a   module to use *
cb70: 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70  /.){.  return op
cb80: 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e  enDatabase(filen
cb90: 61 6d 65 2c 20 70 70 44 62 2c 20 66 6c 61 67 73  ame, ppDb, flags
cba0: 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e  , zVfs);.}..#ifn
cbb0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cbc0: 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  UTF16./*.** Open
cbd0: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
cbe0: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
cbf0: 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20  qlite3_open16(. 
cc00: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
cc10: 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
cc20: 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63  e3 **ppDb.){.  c
cc30: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
cc40: 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c  name8;   /* zFil
cc50: 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e  ename encoded in
cc60: 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f   UTF-8 instead o
cc70: 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71  f UTF-16 */.  sq
cc80: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
cc90: 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  l;.  int rc;..  
cca0: 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
ccb0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
ccc0: 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d  pDb );.  *ppDb =
ccd0: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
cce0: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
ccf0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
cd00: 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
cd10: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
cd20: 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56 61  rc;.#endif.  pVa
cd30: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
cd40: 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  New(0);.  sqlite
cd50: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
cd60: 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  l, -1, zFilename
cd70: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
cd80: 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41  TIVE, SQLITE_STA
cd90: 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  TIC);.  zFilenam
cda0: 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  e8 = sqlite3Valu
cdb0: 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
cdc0: 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20  TE_UTF8);.  if( 
cdd0: 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20  zFilename8 ){.  
cde0: 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62    rc = openDatab
cdf0: 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20  ase(zFilename8, 
ce00: 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ppDb,.          
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
ce20: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
ce30: 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
ce40: 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20  CREATE, 0);.    
ce50: 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c  assert( *ppDb ||
ce60: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
ce70: 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  M );.    if( rc=
ce80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44  =SQLITE_OK && !D
ce90: 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70  bHasProperty(*pp
cea0: 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61  Db, 0, DB_Schema
ceb0: 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20  Loaded) ){.     
cec0: 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51   ENC(*ppDb) = SQ
ced0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
cee0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
cef0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
cf00: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71  _NOMEM;.  }.  sq
cf10: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
cf20: 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Val);..  return 
cf30: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30  sqlite3ApiExit(0
cf40: 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  , rc);.}.#endif 
cf50: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
cf60: 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
cf70: 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
cf80: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
cf90: 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
cfa0: 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
cfb0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
cfc0: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20  ate_collation(. 
cfd0: 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
cfe0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
cff0: 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
d000: 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
d010: 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
d020: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
d030: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
d040: 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
d050: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rc;.  sqlite3_mu
d060: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
d070: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
d080: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
d090: 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61  d );.  rc = crea
d0a0: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
d0b0: 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78  zName, enc, pCtx
d0c0: 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a  , xCompare, 0);.
d0d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
d0e0: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
d0f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d100: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d110: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d120: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
d130: 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
d140: 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
d150: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
d160: 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
d170: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
d180: 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69  ation_v2(.  sqli
d190: 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73  te3* db, .  cons
d1a0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
d1b0: 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
d1c0: 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
d1d0: 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
d1e0: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
d1f0: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
d200: 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29  ),.  void(*xDel)
d210: 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74  (void*).){.  int
d220: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   rc;.  sqlite3_m
d230: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
d240: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
d250: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
d260: 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65  ed );.  rc = cre
d270: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
d280: 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74   zName, enc, pCt
d290: 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65  x, xCompare, xDe
d2a0: 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  l);.  rc = sqlit
d2b0: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
d2c0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
d2d0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
d2e0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
d2f0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
d300: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
d310: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
d320: 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
d330: 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
d340: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
d350: 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
d360: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
d370: 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ion16(.  sqlite3
d380: 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76  * db, .  const v
d390: 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  oid *zName,.  in
d3a0: 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
d3b0: 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
d3c0: 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
d3d0: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
d3e0: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
d3f0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
d400: 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
d410: 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65 33  Name8;.  sqlite3
d420: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
d430: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
d440: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
d450: 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38  iled );.  zName8
d460: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74   = sqlite3Utf16t
d470: 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31  o8(db, zName, -1
d480: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20  );.  if( zName8 
d490: 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61  ){.    rc = crea
d4a0: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
d4b0: 7a 4e 61 6d 65 38 2c 20 65 6e 63 2c 20 70 43 74  zName8, enc, pCt
d4c0: 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
d4d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
d4e0: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a  ee(db, zName8);.
d4f0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
d500: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
d510: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
d520: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
d530: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
d540: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
d550: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
d560: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
d570: 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  er a collation s
d580: 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20  equence factory 
d590: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
d5a0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
d5b0: 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65  e.** db. Replace
d5c0: 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20   any previously 
d5d0: 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74  installed collat
d5e0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
d5f0: 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tory..*/.int sql
d600: 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
d610: 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33  eeded(.  sqlite3
d620: 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *db, .  void *p
d630: 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a  CollNeededArg, .
d640: 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65    void(*xCollNee
d650: 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  ded)(void*,sqlit
d660: 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
d670: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
d680: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d690: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
d6a0: 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
d6b0: 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  eded = xCollNeed
d6c0: 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  ed;.  db->xCollN
d6d0: 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64  eeded16 = 0;.  d
d6e0: 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
d6f0: 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
d700: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
d710: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
d720: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
d730: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
d740: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d750: 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
d760: 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
d770: 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
d780: 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
d790: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
d7a0: 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
d7b0: 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
d7c0: 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
d7d0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
d7e0: 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
d7f0: 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
d800: 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71  n_needed16(.  sq
d810: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f  lite3 *db, .  vo
d820: 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41  id *pCollNeededA
d830: 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f  rg, .  void(*xCo
d840: 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64  llNeeded16)(void
d850: 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
d860: 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f  TextRep,const vo
d870: 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  id*).){.  sqlite
d880: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
d890: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
d8a0: 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b  xCollNeeded = 0;
d8b0: 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
d8c0: 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  ed16 = xCollNeed
d8d0: 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c  ed16;.  db->pCol
d8e0: 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
d8f0: 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
d900: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
d910: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
d920: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d930: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
d940: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
d950: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
d960: 49 54 45 5f 4f 4d 49 54 5f 47 4c 4f 42 41 4c 52  ITE_OMIT_GLOBALR
d970: 45 43 4f 56 45 52 0a 23 69 66 6e 64 65 66 20 53  ECOVER.#ifndef S
d980: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
d990: 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CATED./*.** This
d9a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77   function is now
d9b0: 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e   an anachronism.
d9c0: 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 75   It used to be u
d9d0: 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66  sed to recover f
d9e0: 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28  rom a.** malloc(
d9f0: 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53  ) failure, but S
da00: 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74  QLite now does t
da10: 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  his automaticall
da20: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
da30: 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72  3_global_recover
da40: 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
da50: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
da60: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
da70: 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77  ** Test to see w
da80: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
da90: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
daa0: 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f  ction is in auto
dab0: 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20  commit.** mode. 
dac0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
dad0: 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20  it is and FALSE 
dae0: 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d  if not.  Autocom
daf0: 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a  mit mode is on.*
db00: 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41  * by default.  A
db10: 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73  utocommit is dis
db20: 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e  abled by a BEGIN
db30: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
db40: 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74  eenabled.** by t
db50: 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f  he next COMMIT o
db60: 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a  r ROLLBACK..**.*
db70: 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20 41  ****** THIS IS A
db80: 4e 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 41  N EXPERIMENTAL A
db90: 50 49 20 41 4e 44 20 49 53 20 53 55 42 4a 45 43  PI AND IS SUBJEC
dba0: 54 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a 2a  T TO CHANGE ****
dbb0: 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
dbc0: 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
dbd0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
dbe0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f   return db->auto
dbf0: 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 23 69 66 64 65  Commit;.}..#ifde
dc00: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
dc10: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
dc20: 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 73 75  ng routine is su
dc30: 62 74 69 74 75 74 65 64 20 66 6f 72 20 63 6f 6e  btituted for con
dc40: 73 74 61 6e 74 20 53 51 4c 49 54 45 5f 43 4f 52  stant SQLITE_COR
dc50: 52 55 50 54 20 69 6e 0a 2a 2a 20 64 65 62 75 67  RUPT in.** debug
dc60: 67 69 6e 67 20 62 75 69 6c 64 73 2e 20 20 54 68  ging builds.  Th
dc70: 69 73 20 70 72 6f 76 69 64 65 73 20 61 20 77 61  is provides a wa
dc80: 79 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  y to set a break
dc90: 70 6f 69 6e 74 20 66 6f 72 20 77 68 65 6e 0a 2a  point for when.*
dca0: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  * corruption is 
dcb0: 66 69 72 73 74 20 64 65 74 65 63 74 65 64 2e 0a  first detected..
dcc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  */.int sqlite3Co
dcd0: 72 72 75 70 74 28 76 6f 69 64 29 7b 0a 20 20 72  rrupt(void){.  r
dce0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
dcf0: 52 55 50 54 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  RUPT;.}.#endif..
dd00: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
dd10: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
dd20: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63  *.** This is a c
dd30: 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69  onvenience routi
dd40: 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ne that makes su
dd50: 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65  re that all thre
dd60: 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64  ad-specific.** d
dd70: 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72  ata for this thr
dd80: 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61  ead has been dea
dd90: 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
dda0: 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72  SQLite no longer
ddb0: 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65   uses thread-spe
ddc0: 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68  cific data so th
ddd0: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
dde0: 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49  w a.** no-op.  I
ddf0: 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f  t is retained fo
de00: 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d  r historical com
de10: 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76  patibility..*/.v
de20: 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65  oid sqlite3_thre
de30: 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29  ad_cleanup(void)
de40: 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  {.}.#endif../*.*
de50: 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e  * Return meta in
de60: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
de70: 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d  a specific colum
de80: 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  n of a database 
de90: 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  table..** See co
dea0: 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33  mment in sqlite3
deb0: 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29  .h (sqlite.h.in)
dec0: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
ded0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
dee0: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
def0: 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65  ADATA.int sqlite
df00: 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
df10: 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74  etadata(.  sqlit
df20: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
df30: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
df40: 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  tion handle */. 
df50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
df60: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
df70: 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72  Database name or
df80: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
df90: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d   char *zTableNam
dfa0: 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  e,     /* Table 
dfb0: 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  name */.  const 
dfc0: 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d  char *zColumnNam
dfd0: 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  e,    /* Column 
dfe0: 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  name */.  char c
dff0: 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70  onst **pzDataTyp
e000: 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  e,    /* OUTPUT:
e010: 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74   Declared data t
e020: 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ype */.  char co
e030: 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c  nst **pzCollSeq,
e040: 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
e050: 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
e060: 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  ce name */.  int
e070: 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20   *pNotNull,     
e080: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
e090: 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20  UT: True if NOT 
e0a0: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20  NULL constraint 
e0b0: 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20  exists */.  int 
e0c0: 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20  *pPrimaryKey,   
e0d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
e0e0: 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
e0f0: 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a  n part of PK */.
e100: 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20    int *pAutoinc 
e110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e120: 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
e130: 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d   column is auto-
e140: 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  increment */.){.
e150: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
e160: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
e170: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
e180: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
e190: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
e1a0: 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ;..  char const 
e1b0: 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a  *zDataType = 0;.
e1c0: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43    char const *zC
e1d0: 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e  ollSeq = 0;.  in
e1e0: 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20  t notnull = 0;. 
e1f0: 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20   int primarykey 
e200: 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69  = 0;.  int autoi
e210: 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e  nc = 0;..  /* En
e220: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
e230: 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65  e schema has bee
e240: 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71  n loaded */.  sq
e250: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
e260: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
e270: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
e280: 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c  etyOn(db);.  sql
e290: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
e2a0: 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71  l(db);.  rc = sq
e2b0: 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a  lite3Init(db, &z
e2c0: 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53  ErrMsg);.  if( S
e2d0: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
e2e0: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
e2f0: 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  ut;.  }..  /* Lo
e300: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  cate the table i
e310: 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20  n question */.  
e320: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
e330: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62  ndTable(db, zTab
e340: 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29  leName, zDbName)
e350: 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c  ;.  if( !pTab ||
e360: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
e370: 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a  {.    pTab = 0;.
e380: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
e390: 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  ut;.  }..  /* Fi
e3a0: 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f  nd the column fo
e3b0: 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20  r which info is 
e3c0: 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69  requested */.  i
e3d0: 66 28 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  f( sqlite3IsRowi
e3e0: 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29  d(zColumnName) )
e3f0: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
e400: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 69 66  b->iPKey;.    if
e410: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
e420: 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
e430: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
e440: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
e450: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
e460: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
e470: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  l++){.      pCol
e480: 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = &pTab->aCol[i
e490: 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Col];.      if( 
e4a0: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
e4b0: 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pCol->zName, z
e4c0: 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20  ColumnName) ){. 
e4d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e4e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e4f0: 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e  if( iCol==pTab->
e500: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70 54  nCol ){.      pT
e510: 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f  ab = 0;.      go
e520: 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
e530: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
e540: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
e550: 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65 74  k stores the met
e560: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  a information th
e570: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
e580: 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ned.  ** to the 
e590: 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20  caller in local 
e5a0: 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61 54  variables zDataT
e5b0: 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e  ype, zCollSeq, n
e5c0: 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b  otnull, primaryk
e5d0: 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f  ey.  ** and auto
e5e0: 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f 69  inc. At this poi
e5f0: 6e 74 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  nt there are two
e600: 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a 0a   possibilities:.
e610: 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31    ** .  **     1
e620: 2e 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20  . The specified 
e630: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20  column name was 
e640: 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f 72  rowid", "oid" or
e650: 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a   "_rowid_" .  **
e660: 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 72          and ther
e670: 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74  e is no explicit
e680: 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b 20  ly declared IPK 
e690: 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20  column. .  **.  
e6a0: 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74 61  **     2. The ta
e6b0: 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65  ble is not a vie
e6c0: 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e  w and the column
e6d0: 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64   name identified
e6e0: 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20   an .  **       
e6f0: 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c   explicitly decl
e700: 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70  ared column. Cop
e710: 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  y meta informati
e720: 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20  on from *pCol.. 
e730: 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c 20   */ .  if( pCol 
e740: 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65  ){.    zDataType
e750: 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a   = pCol->zType;.
e760: 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70      zCollSeq = p
e770: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  Col->zColl;.    
e780: 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e  notnull = pCol->
e790: 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20  notNull!=0;.    
e7a0: 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 70 43  primarykey  = pC
e7b0: 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65 79 21 3d 30  ol->isPrimKey!=0
e7c0: 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20  ;.    autoinc = 
e7d0: 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f  pTab->iPKey==iCo
e7e0: 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  l && (pTab->tabF
e7f0: 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
e800: 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d  crement)!=0;.  }
e810: 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54  else{.    zDataT
e820: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
e830: 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20  .    primarykey 
e840: 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  = 1;.  }.  if( !
e850: 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  zCollSeq ){.    
e860: 7a 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41  zCollSeq = "BINA
e870: 52 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f  RY";.  }..error_
e880: 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74  out:.  sqlite3Bt
e890: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
e8a0: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
e8b0: 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a  SafetyOff(db);..
e8c0: 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65    /* Whether the
e8d0: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73   function call s
e8e0: 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c  ucceeded or fail
e8f0: 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70  ed, set the outp
e900: 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20  ut parameters.  
e910: 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74  ** to whatever t
e920: 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74  heir local count
e930: 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e  erparts contain.
e940: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64   If an error did
e950: 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69   occur,.  ** thi
e960: 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  s has the effect
e970: 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20   of zeroing all 
e980: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
e990: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a  s..  */.  if( pz
e9a0: 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61  DataType ) *pzDa
e9b0: 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79  taType = zDataTy
e9c0: 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c  pe;.  if( pzColl
e9d0: 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71  Seq ) *pzCollSeq
e9e0: 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69   = zCollSeq;.  i
e9f0: 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70  f( pNotNull ) *p
ea00: 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c  NotNull = notnul
ea10: 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72  l;.  if( pPrimar
ea20: 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79  yKey ) *pPrimary
ea30: 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79  Key = primarykey
ea40: 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63  ;.  if( pAutoinc
ea50: 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61   ) *pAutoinc = a
ea60: 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53  utoinc;..  if( S
ea70: 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20  QLITE_OK==rc && 
ea80: 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  !pTab ){.    sql
ea90: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
eaa0: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72  ErrMsg);.    zEr
eab0: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  rMsg = sqlite3MP
eac0: 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75  rintf(db, "no su
ead0: 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a  ch table column:
eae0: 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e   %s.%s", zTableN
eaf0: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f  ame,.        zCo
eb00: 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72  lumnName);.    r
eb10: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
eb20: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
eb30: 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a 45  rror(db, rc, (zE
eb40: 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a  rrMsg?"%s":0), z
eb50: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
eb60: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
eb70: 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71  rMsg);.  rc = sq
eb80: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
eb90: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
eba0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
ebb0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
ebc0: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
ebd0: 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
ebe0: 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
ebf0: 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
ec00: 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
ec10: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
ec20: 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20  sleep(int ms){. 
ec30: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
ec40: 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
ec50: 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
ec60: 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
ec70: 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75  ( pVfs==0 ) retu
ec80: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rn 0;..  /* This
ec90: 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
eca0: 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  in milliseconds,
ecb0: 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79   but the underly
ecc0: 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20  ing OsSleep() . 
ecd0: 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63   ** API uses mic
ece0: 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65  roseconds. Hence
ecf0: 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a   the 1000's..  *
ed00: 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65  /.  rc = (sqlite
ed10: 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31  3OsSleep(pVfs, 1
ed20: 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20  000*ms)/1000);. 
ed30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ed40: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
ed50: 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e  isable the exten
ed60: 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73  ded result codes
ed70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ed80: 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
ed90: 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a  _codes(sqlite3 *
eda0: 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a  db, int onoff){.
edb0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
edc0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
edd0: 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
ede0: 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66  = onoff ? 0xffff
edf0: 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73  ffff : 0xff;.  s
ee00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ee10: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
ee20: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ee30: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  K;.}../*.** Invo
ee40: 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74  ke the xFileCont
ee50: 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20  rol method on a 
ee60: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
ee70: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
ee80: 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
ee90: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
eea0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
eeb0: 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
eec0: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
eed0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
eee0: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71  .  int iDb;.  sq
eef0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
ef00: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
ef10: 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29  if( zDbName==0 )
ef20: 7b 0a 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20  {.    iDb = 0;. 
ef30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
ef40: 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e  iDb=0; iDb<db->n
ef50: 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  Db; iDb++){.    
ef60: 20 20 69 66 28 20 73 74 72 63 6d 70 28 64 62 2d    if( strcmp(db-
ef70: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
ef80: 20 7a 44 62 4e 61 6d 65 29 3d 3d 30 20 29 20 62   zDbName)==0 ) b
ef90: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
efa0: 20 20 69 66 28 20 69 44 62 3c 64 62 2d 3e 6e 44    if( iDb<db->nD
efb0: 62 20 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  b ){.    Btree *
efc0: 70 42 74 72 65 65 20 3d 20 64 62 2d 3e 61 44 62  pBtree = db->aDb
efd0: 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69  [iDb].pBt;.    i
efe0: 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
eff0: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
f000: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
f010: 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 20 20  file *fd;.      
f020: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
f030: 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 20  r(pBtree);.     
f040: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
f050: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 72  3BtreePager(pBtr
f060: 65 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ee);.      asser
f070: 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
f080: 20 20 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74        fd = sqlit
f090: 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
f0a0: 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
f0b0: 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20  t( fd!=0 );.    
f0c0: 20 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f    if( fd->pMetho
f0d0: 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ds ){.        rc
f0e0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
f0f0: 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20  Control(fd, op, 
f100: 70 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pArg);.      }. 
f110: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
f120: 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
f130: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
f140: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f150: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f160: 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f  turn rc;   .}../
f170: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  *.** Interface t
f180: 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f  o the testing lo
f190: 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  gic..*/.int sqli
f1a0: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
f1b0: 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20  (int op, ...){. 
f1c0: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66   int rc = 0;.#if
f1d0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f1e0: 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20  _BUILTIN_TEST.  
f1f0: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
f200: 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a  _start(ap, op);.
f210: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
f220: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
f230: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
f240: 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
f250: 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  G..    */.    ca
f260: 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
f270: 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a  RL_PRNG_SAVE: {.
f280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
f290: 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20  gSaveState();.  
f2a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f2b0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
f2c0: 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74  Restore the stat
f2d0: 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f  e of the PRNG to
f2e0: 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20   the last state 
f2f0: 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20  saved using.    
f300: 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49  ** PRNG_SAVE.  I
f310: 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20  f PRNG_SAVE has 
f320: 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65  never before bee
f330: 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20  n called, then. 
f340: 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20     ** this verb 
f350: 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52  acts like PRNG_R
f360: 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ESET..    */.   
f370: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
f380: 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f  TCTRL_PRNG_RESTO
f390: 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  RE: {.      sqli
f3a0: 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74  te3PrngRestoreSt
f3b0: 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
f3c0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
f3d0: 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74  *.    ** Reset t
f3e0: 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20  he PRNG back to 
f3f0: 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  its uninitialize
f400: 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65  d state.  The ne
f410: 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  xt call.    ** t
f420: 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  o sqlite3_random
f430: 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65  ness() will rese
f440: 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e  ed the PRNG usin
f450: 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a  g a single call.
f460: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52      ** to the xR
f470: 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64  andomness method
f480: 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
f490: 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  VFS..    */.    
f4a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
f4b0: 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a  CTRL_PRNG_RESET:
f4c0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
f4d0: 50 72 6e 67 52 65 73 65 74 53 74 61 74 65 28 29  PrngResetState()
f4e0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f4f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
f500: 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
f510: 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43  t_control(BITVEC
f520: 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f  _TEST, size, pro
f530: 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20  gram).    **.   
f540: 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61   ** Run a test a
f550: 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20  gainst a Bitvec 
f560: 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20  object of size. 
f570: 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67   The program arg
f580: 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20  ument.    ** is 
f590: 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65  an array of inte
f5a0: 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65  gers that define
f5b0: 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74  s the test.  Ret
f5c0: 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20  urn -1 on a.    
f5d0: 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
f5e0: 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e  tion error, 0 on
f5f0: 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e   success, or non
f600: 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72  -zero for an err
f610: 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  or..    ** See t
f620: 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  he sqlite3Bitvec
f630: 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f  BuiltinTest() fo
f640: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
f650: 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
f660: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
f670: 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43  _TESTCTRL_BITVEC
f680: 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69  _TEST: {.      i
f690: 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
f6a0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
f6b0: 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61  nt *aProg = va_a
f6c0: 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20  rg(ap, int*);.  
f6d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f6e0: 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73  BitvecBuiltinTes
f6f0: 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20  t(sz, aProg);.  
f700: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f710: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
f720: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
f730: 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c  ntrol(BENIGN_MAL
f740: 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69  LOC_HOOKS, xBegi
f750: 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a  n, xEnd).    **.
f760: 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20      ** Register 
f770: 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f  hooks to call to
f780: 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20   indicate which 
f790: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
f7a0: 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65  s .    ** are be
f7b0: 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nign..    */.   
f7c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
f7d0: 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c  TCTRL_BENIGN_MAL
f7e0: 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20  LOC_HOOKS: {.   
f7f0: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20     typedef void 
f800: 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  (*void_function)
f810: 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f  (void);.      vo
f820: 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
f830: 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20  ignBegin;.      
f840: 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
f850: 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20  enignEnd;.      
f860: 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76  xBenignBegin = v
f870: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
f880: 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
f890: 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f  xBenignEnd = va_
f8a0: 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
f8b0: 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  ction);.      sq
f8c0: 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f  lite3BenignMallo
f8d0: 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65  cHooks(xBenignBe
f8e0: 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29  gin, xBenignEnd)
f8f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f900: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
f910: 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
f920: 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
f930: 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
f940: 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64  G_BYTE, unsigned
f950: 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
f960: 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45     ** Set the PE
f970: 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68  NDING byte to th
f980: 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61  e value in the a
f990: 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e  rgument, if X>0.
f9a0: 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20  .    ** Make no 
f9b0: 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e  changes if X==0.
f9c0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c    Return the val
f9d0: 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e  ue of the pendin
f9e0: 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73  g byte.    ** as
f9f0: 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65 66   it existing bef
fa00: 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
fa10: 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
fa20: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52   **.    ** IMPOR
fa30: 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20  TANT:  Changing 
fa40: 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
fa50: 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30   from 0x40000000
fa60: 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20   results in.    
fa70: 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ** an incompatib
fa80: 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  le database file
fa90: 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69   format.  Changi
faa0: 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
fab0: 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  yte.    ** while
fac0: 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f   any database co
fad0: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
fae0: 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65   results in unde
faf0: 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a  fined and.    **
fb00: 20 64 69 6c 65 74 65 72 69 6f 75 73 20 62 65 68   dileterious beh
fb10: 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  avior..    */.  
fb20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
fb30: 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
fb40: 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 73  YTE: {.      uns
fb50: 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c  igned int newVal
fb60: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e   = va_arg(ap, un
fb70: 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20  signed int);.   
fb80: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
fb90: 65 6e 64 69 6e 67 42 79 74 65 3b 0a 20 20 20 20  endingByte;.    
fba0: 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73    if( newVal ) s
fbb0: 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74  qlite3PendingByt
fbc0: 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20  e = newVal;.    
fbd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
fbe0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
fbf0: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
fc00: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
fc10: 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20  TRL_ASSERT, int 
fc20: 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
fc30: 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
fc40: 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
fc50: 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   test to see whe
fc60: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20  ther or not.    
fc70: 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20  ** assert() was 
fc80: 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
fc90: 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69  le-time.  If X i
fca0: 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72  s true and asser
fcb0: 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e  t().    ** is en
fcc0: 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
fcd0: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
fce0: 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74  true.  If X is t
fcf0: 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  rue and.    ** a
fd00: 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
fd10: 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
fd20: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
fd30: 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20  ro.  If X is.   
fd40: 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73   ** false and as
fd50: 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
fd60: 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65  d, then the asse
fd70: 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20  rtion fires and 
fd80: 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
fd90: 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58  ss aborts.  If X
fda0: 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73   is false and as
fdb0: 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
fdc0: 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ed, then the.   
fdd0: 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
fde0: 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   is zero..    */
fdf0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
fe00: 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
fe10: 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69  : {.      volati
fe20: 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20  le int x = 0;.  
fe30: 20 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d      assert( (x =
fe40: 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29   va_arg(ap,int))
fe50: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  !=0 );.      rc 
fe60: 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = x;.      break
fe70: 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
fe80: 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
fe90: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
fea0: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
feb0: 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20  WAYS, int X).   
fec0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
fed0: 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
fee0: 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
fef0: 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41  to see how the A
ff00: 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a  LWAYS and.    **
ff10: 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65   NEVER macros we
ff20: 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f  re defined at co
ff30: 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20  mpile-time..    
ff40: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
ff50: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c  turn value is AL
ff60: 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a  WAYS(X).  .    *
ff70: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  *.    ** The rec
ff80: 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73  ommended test is
ff90: 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72   X==2.  If the r
ffa0: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32  eturn value is 2
ffb0: 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20  , that means.   
ffc0: 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64   ** ALWAYS() and
ffd0: 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74   NEVER() are bot
ffe0: 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  h no-op pass-thr
fff0: 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69  ough macros, whi
10000 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ch is the.    **
10010 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
10020 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
10030 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65   value is 1, the
10040 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69  n ALWAYS() is ei
10050 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64  ther.    ** hard
10060 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f  -coded to true o
10070 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74  r else it assert
10080 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e  s if its argumen
10090 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  t is false..    
100a0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68  ** The first beh
100b0 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65  avior (hard-code
100c0 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68  d to true) is th
100d0 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
100e0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
100f0 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
10100 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64  at assert() is d
10110 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  isabled and the 
10120 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65  second.    ** be
10130 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69  havior (assert i
10140 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
10150 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61  o ALWAYS() is fa
10160 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65  lse) is the case
10170 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
10180 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
10190 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
101a0 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
101b0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
101c0 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  The run-time tes
101d0 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68  t procedure migh
101e0 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67  t look something
101f0 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
10200 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28  **.    **    if(
10210 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
10220 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
10230 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29  TCTRL_ALWAYS, 2)
10240 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20  ==2 ){.    **   
10250 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61     // ALWAYS() a
10260 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e  nd NEVER() are n
10270 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67  o-op pass-throug
10280 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20  h macros.    ** 
10290 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
102a0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
102b0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
102c0 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a  L_ASSERT, 1) ){.
102d0 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
102e0 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73  LWAYS(x) asserts
102f0 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e   that x is true.
10300 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74   NEVER(x) assert
10310 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  s x is false..  
10320 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    **    }else{. 
10330 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
10340 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e  WAYS(x) is a con
10350 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28  stant 1.  NEVER(
10360 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
10370 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a   0..    **    }.
10380 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
10390 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
103a0 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20  ALWAYS: {.      
103b0 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
103c0 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  p,int);.      rc
103d0 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20   = ALWAYS(x);.  
103e0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
103f0 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
10400 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
10410 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
10420 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75 72  _TEST */.  retur
10430 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.