/ Hex Artifact Content
Login

Artifact eabeb200c8b74e0d117d37474b642eb286ebfd93:


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 30 20 32 30 30 39 2f 30 35  ,v 1.550 2009/05
0280: 2f 30 39 20 31 38 3a 35 39 3a 34 32 20 64 72 68  /09 18:59:42 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 3b 0a 20 20  .  int nName;.  
9f40: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
9f50: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
9f60: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f  ->mutex) );..  /
9f70: 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31  * If SQLITE_UTF1
9f80: 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61  6 is specified a
9f90: 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74  s the encoding t
9fa0: 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74  ype, transform t
9fb0: 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20  his.  ** to one 
9fc0: 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  of SQLITE_UTF16L
9fd0: 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31  E or SQLITE_UTF1
9fe0: 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20  6BE using the.  
9ff0: 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  ** SQLITE_UTF16N
a000: 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c  ATIVE macro. SQL
a010: 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74  ITE_UTF16 is not
a020: 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79   used internally
a030: 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20  ..  */.  enc2 = 
a040: 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28  enc;.  testcase(
a050: 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
a060: 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73  F16 );.  testcas
a070: 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f  e( enc2==SQLITE_
a080: 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b  UTF16_ALIGNED );
a090: 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c  .  if( enc2==SQL
a0a0: 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63  ITE_UTF16 || enc
a0b0: 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f  2==SQLITE_UTF16_
a0c0: 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65  ALIGNED ){.    e
a0d0: 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  nc2 = SQLITE_UTF
a0e0: 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20  16NATIVE;.  }.  
a0f0: 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f  if( enc2<SQLITE_
a100: 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c  UTF8 || enc2>SQL
a110: 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20  ITE_UTF16BE ){. 
a120: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a130: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20  _MISUSE;.  }..  
a140: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
a150: 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e   call is removin
a160: 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61  g or replacing a
a170: 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61  n existing colla
a180: 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65  tion .  ** seque
a190: 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20  nce. If so, and 
a1a0: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
a1b0: 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73   VMs, return bus
a1c0: 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a  y. If there.  **
a1d0: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
a1e0: 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61  Ms, invalidate a
a1f0: 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ny pre-compiled 
a200: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
a210: 0a 20 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  .  nName = sqlit
a220: 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
a230: 29 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  );.  pColl = sql
a240: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
a250: 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e  db, (u8)enc2, zN
a260: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 30 29 3b 0a  ame, nName, 0);.
a270: 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70    if( pColl && p
a280: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20  Coll->xCmp ){.  
a290: 20 20 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65    if( db->active
a2a0: 56 64 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20  VdbeCnt ){.     
a2b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
a2c0: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
a2d0: 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
a2e0: 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79  to delete/modify
a2f0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
a300: 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76  nce due to activ
a310: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
a320: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
a330: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a  ITE_BUSY;.    }.
a340: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
a350: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
a360: 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a  nts(db);..    /*
a370: 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   If collation se
a380: 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73  quence pColl was
a390: 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c   created directl
a3a0: 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20  y by a call to. 
a3b0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72     ** sqlite3_cr
a3c0: 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20  eate_collation, 
a3d0: 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  and not generate
a3e0: 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  d by synthCollSe
a3f0: 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  q(),.    ** then
a400: 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65   any copies made
a410: 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
a420: 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e  () need to be in
a430: 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a  validated..    *
a440: 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f  * Also, collatio
a450: 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43  n destructor - C
a460: 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20  ollSeq.xDel() - 
a470: 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65  function may nee
a480: 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63  d.    ** to be c
a490: 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20  alled..    */ . 
a4a0: 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65     if( (pColl->e
a4b0: 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46  nc & ~SQLITE_UTF
a4c0: 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63  16_ALIGNED)==enc
a4d0: 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  2 ){.      CollS
a4e0: 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *aColl = sqli
a4f0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
a500: 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
a510: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , nName);.      
a520: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
a530: 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
a540: 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
a550: 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b   *p = &aColl[j];
a560: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
a570: 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
a580: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
a590: 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20   p->xDel ){.    
a5a0: 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28          p->xDel(
a5b0: 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  p->pUser);.     
a5c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a5d0: 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20   p->xCmp = 0;.  
a5e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a5f0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f      }.  }..  pCo
a600: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
a610: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
a620: 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  enc2, zName, nNa
a630: 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43  me, 1);.  if( pC
a640: 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43 6f 6c 6c  oll ){.    pColl
a650: 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72  ->xCmp = xCompar
a660: 65 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 70 55  e;.    pColl->pU
a670: 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 20 20  ser = pCtx;.    
a680: 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44  pColl->xDel = xD
a690: 65 6c 3b 0a 20 20 20 20 70 43 6f 6c 6c 2d 3e 65  el;.    pColl->e
a6a0: 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20 7c  nc = (u8)(enc2 |
a6b0: 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f 55   (enc & SQLITE_U
a6c0: 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a  TF16_ALIGNED));.
a6d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 72 72    }.  sqlite3Err
a6e0: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b  or(db, SQLITE_OK
a6f0: 2c 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  , 0);.  return S
a700: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
a710: 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20 64  .** This array d
a720: 65 66 69 6e 65 73 20 68 61 72 64 20 75 70 70 65  efines hard uppe
a730: 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69  r bounds on limi
a740: 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a  t values.  The.*
a750: 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75  * initializer mu
a760: 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79  st be kept in sy
a770: 6e 63 20 77 69 74 68 20 74 68 65 20 53 51 4c 49  nc with the SQLI
a780: 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64  TE_LIMIT_*.** #d
a790: 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65  efines in sqlite
a7a0: 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  3.h..*/.static c
a7b0: 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69  onst int aHardLi
a7c0: 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49  mit[] = {.  SQLI
a7d0: 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20  TE_MAX_LENGTH,. 
a7e0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
a7f0: 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
a800: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53  _MAX_COLUMN,.  S
a810: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
a820: 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  EPTH,.  SQLITE_M
a830: 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
a840: 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  CT,.  SQLITE_MAX
a850: 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49  _VDBE_OP,.  SQLI
a860: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
a870: 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  ARG,.  SQLITE_MA
a880: 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51  X_ATTACHED,.  SQ
a890: 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
a8a0: 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20  TTERN_LENGTH,.  
a8b0: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
a8c0: 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a 7d 3b 0a 0a  BLE_NUMBER,.};..
a8d0: 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
a8e0: 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20  the hard limits 
a8f0: 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f  are set to reaso
a900: 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a  nable values.*/.
a910: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
a920: 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f  ENGTH<100.# erro
a930: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  r SQLITE_MAX_LEN
a940: 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
a950: 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
a960: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
a970: 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  QL_LENGTH<100.# 
a980: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
a990: 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
a9a0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
a9b0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
a9c0: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
a9d0: 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  H>SQLITE_MAX_LEN
a9e0: 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  GTH.# error SQLI
a9f0: 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
aa00: 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72  H must not be gr
aa10: 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54  eater than SQLIT
aa20: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e  E_MAX_LENGTH.#en
aa30: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
aa40: 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
aa50: 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c  CT<2.# error SQL
aa60: 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
aa70: 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20  _SELECT must be 
aa80: 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69  at least 2.#endi
aa90: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
aaa0: 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72  _VDBE_OP<40.# er
aab0: 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ror SQLITE_MAX_V
aac0: 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61  DBE_OP must be a
aad0: 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69  t least 40.#endi
aae0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
aaf0: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20  _FUNCTION_ARG<0 
ab00: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  || SQLITE_MAX_FU
ab10: 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a  NCTION_ARG>1000.
ab20: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
ab30: 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
ab40: 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
ab50: 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69  0 and 1000.#endi
ab60: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
ab70: 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53  _ATTACHED<0 || S
ab80: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
ab90: 45 44 3e 33 30 0a 23 20 65 72 72 6f 72 20 53 51  ED>30.# error SQ
aba0: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
abb0: 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  D must be betwee
abc0: 6e 20 30 20 61 6e 64 20 33 30 0a 23 65 6e 64 69  n 0 and 30.#endi
abd0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
abe0: 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
abf0: 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53  NGTH<1.# error S
ac00: 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
ac10: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75  ATTERN_LENGTH mu
ac20: 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
ac30: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
ac40: 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
ac50: 4e 55 4d 42 45 52 3c 31 0a 23 20 65 72 72 6f 72  NUMBER<1.# error
ac60: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
ac70: 41 42 4c 45 5f 4e 55 4d 42 45 52 20 6d 75 73 74  ABLE_NUMBER must
ac80: 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
ac90: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
aca0: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36  _MAX_COLUMN>3276
acb0: 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  7.# error SQLITE
acc0: 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74  _MAX_COLUMN must
acd0: 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32 37 36   not exceed 3276
ace0: 37 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  7.#endif.../*.**
acf0: 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   Change the valu
ad00: 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20 52  e of a limit.  R
ad10: 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
ad20: 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e  lue..** If an in
ad30: 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64 65  valid limit inde
ad40: 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20 72  x is supplied, r
ad50: 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b  eport -1..** Mak
ad60: 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75 74  e no changes but
ad70: 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74 68   still report th
ad80: 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20 74  e old value if t
ad90: 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20  he.** new limit 
ada0: 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a  is negative..**.
adb0: 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c  ** A new lower l
adc0: 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73 68  imit does not sh
add0: 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63 6f  rink existing co
ade0: 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20  nstructs..** It 
adf0: 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73 20  merely prevents 
ae00: 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20 74  new constructs t
ae10: 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20 6c  hat exceed the l
ae20: 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72  imit.** from for
ae30: 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ming..*/.int sql
ae40: 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74  ite3_limit(sqlit
ae50: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69  e3 *db, int limi
ae60: 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69  tId, int newLimi
ae70: 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d  t){.  int oldLim
ae80: 69 74 3b 0a 20 20 69 66 28 20 6c 69 6d 69 74 49  it;.  if( limitI
ae90: 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d  d<0 || limitId>=
aea0: 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29  SQLITE_N_LIMIT )
aeb0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
aec0: 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20  .  }.  oldLimit 
aed0: 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d  = db->aLimit[lim
aee0: 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77  itId];.  if( new
aef0: 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a 20 20 20 20  Limit>=0 ){.    
af00: 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61  if( newLimit>aHa
af10: 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
af20: 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d   ){.      newLim
af30: 69 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b  it = aHardLimit[
af40: 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 20 20 7d 0a  limitId];.    }.
af50: 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c      db->aLimit[l
af60: 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d  imitId] = newLim
af70: 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
af80: 20 6f 6c 64 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a   oldLimit;.}../*
af90: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
afa0: 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f   does the work o
afb0: 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61  f opening a data
afc0: 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f  base on behalf o
afd0: 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65  f.** sqlite3_ope
afe0: 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  n() and sqlite3_
aff0: 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61  open16(). The da
b000: 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
b010: 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a  "zFilename"  .**
b020: 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65   is UTF-8 encode
b030: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
b040: 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20   openDatabase(. 
b050: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
b060: 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62  lename, /* Datab
b070: 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46  ase filename UTF
b080: 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20  -8 encoded */.  
b090: 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20  sqlite3 **ppDb, 
b0a0: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52         /* OUT: R
b0b0: 65 74 75 72 6e 65 64 20 64 61 74 61 62 61 73 65  eturned database
b0c0: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73   handle */.  uns
b0d0: 69 67 6e 65 64 20 66 6c 61 67 73 2c 20 20 20 20  igned flags,    
b0e0: 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e      /* Operation
b0f0: 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  al flags */.  co
b100: 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
b110: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
b120: 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a  the VFS to use *
b130: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
b140: 64 62 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  db;.  int rc;.  
b150: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
b160: 20 20 69 6e 74 20 69 73 54 68 72 65 61 64 73 61    int isThreadsa
b170: 66 65 3b 0a 0a 20 20 2a 70 70 44 62 20 3d 20 30  fe;..  *ppDb = 0
b180: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
b190: 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
b1a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
b1b0: 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
b1c0: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
b1d0: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
b1e0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
b1f0: 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d  fig.bCoreMutex==
b200: 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  0 ){.    isThrea
b210: 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
b220: 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
b230: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
b240: 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  EX ){.    isThre
b250: 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65  adsafe = 0;.  }e
b260: 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
b270: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
b280: 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54  MUTEX ){.    isT
b290: 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20  hreadsafe = 1;. 
b2a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68   }else{.    isTh
b2b0: 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74  readsafe = sqlit
b2c0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
b2d0: 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 0a  FullMutex;.  }..
b2e0: 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d    /* Remove harm
b2f0: 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68  ful bits from th
b300: 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
b310: 72 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20  r */.  flags &= 
b320: 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ~( SQLITE_OPEN_
b330: 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
b350: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
b360: 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  DB |.           
b370: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
b380: 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20  TEMP_DB | .     
b390: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
b3a0: 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f  _OPEN_TRANSIENT_
b3b0: 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
b3c0: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
b3d0: 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _MAIN_JOURNAL | 
b3e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b3f0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
b400: 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
b410: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
b420: 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41  E_OPEN_SUBJOURNA
b430: 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
b440: 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
b450: 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c  MASTER_JOURNAL |
b460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b470: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
b480: 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20  TEX |.          
b490: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
b4a0: 5f 46 55 4c 4c 4d 55 54 45 58 0a 20 20 20 20 20  _FULLMUTEX.     
b4b0: 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a          );..  /*
b4c0: 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
b4d0: 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74  lite data struct
b4e0: 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71  ure */.  db = sq
b4f0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
b500: 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29   sizeof(sqlite3)
b510: 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20   );.  if( db==0 
b520: 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75  ) goto opendb_ou
b530: 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61  t;.  if( isThrea
b540: 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d  dsafe ){.    db-
b550: 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
b560: 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
b570: 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
b580: 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  E);.    if( db->
b590: 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
b5a0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
b5b0: 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30  b);.      db = 0
b5c0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
b5d0: 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
b5e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
b5f0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
b600: 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
b610: 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d  sk = 0xff;.  db-
b620: 3e 70 72 69 6f 72 4e 65 77 52 6f 77 69 64 20 3d  >priorNewRowid =
b630: 20 30 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20   0;.  db->nDb = 
b640: 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  2;.  db->magic =
b650: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55   SQLITE_MAGIC_BU
b660: 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20  SY;.  db->aDb = 
b670: 64 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a  db->aDbStatic;..
b680: 20 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66    assert( sizeof
b690: 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69  (db->aLimit)==si
b6a0: 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29  zeof(aHardLimit)
b6b0: 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d   );.  memcpy(db-
b6c0: 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69  >aLimit, aHardLi
b6d0: 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e  mit, sizeof(db->
b6e0: 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e  aLimit));.  db->
b6f0: 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
b700: 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61    db->nextAutova
b710: 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 6e 65  c = -1;.  db->ne
b720: 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a  xtPagesize = 0;.
b730: 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53    db->flags |= S
b740: 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61  QLITE_ShortColNa
b750: 6d 65 73 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  mes.#if SQLITE_D
b760: 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d  EFAULT_FILE_FORM
b770: 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20  AT<4.           
b780: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c        | SQLITE_L
b790: 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e  egacyFileFmt.#en
b7a0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
b7b0: 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58  E_ENABLE_LOAD_EX
b7c0: 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20  TENSION.        
b7d0: 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
b7e0: 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a  E_LoadExtension.
b7f0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20  #endif.      ;. 
b800: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
b810: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
b820: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b830: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
b840: 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49  E.  sqlite3HashI
b850: 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65  nit(&db->aModule
b860: 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d  );.#endif..  db-
b870: 3e 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  >pVfs = sqlite3_
b880: 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a  vfs_find(zVfs);.
b890: 20 20 69 66 28 20 21 64 62 2d 3e 70 56 66 73 20    if( !db->pVfs 
b8a0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
b8b0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71  TE_ERROR;.    sq
b8c0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
b8d0: 63 2c 20 22 6e 6f 20 73 75 63 68 20 76 66 73 3a  c, "no such vfs:
b8e0: 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20   %s", zVfs);.   
b8f0: 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
b900: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20  ;.  }..  /* Add 
b910: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
b920: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42  ation sequence B
b930: 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f  INARY. BINARY wo
b940: 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46  rks for both UTF
b950: 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d  -8.  ** and UTF-
b960: 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72  16, so add a ver
b970: 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f  sion for each to
b980: 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63   avoid any unnec
b990: 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76  essary.  ** conv
b9a0: 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c  ersions. The onl
b9b0: 79 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e  y error that can
b9c0: 20 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61   occur here is a
b9d0: 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72   malloc() failur
b9e0: 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65  e..  */.  create
b9f0: 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
ba00: 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
ba10: 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  TF8, 0, binCollF
ba20: 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
ba30: 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
ba40: 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
ba50: 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43  UTF16BE, 0, binC
ba60: 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
ba70: 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
ba80: 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c  b, "BINARY", SQL
ba90: 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20  ITE_UTF16LE, 0, 
baa0: 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
bab0: 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
bac0: 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20  on(db, "RTRIM", 
bad0: 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f  SQLITE_UTF8, (vo
bae0: 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75  id*)1, binCollFu
baf0: 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62  nc, 0);.  if( db
bb00: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
bb10: 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  {.    goto opend
bb20: 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d  b_out;.  }.  db-
bb30: 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c  >pDfltColl = sql
bb40: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
bb50: 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  db, SQLITE_UTF8,
bb60: 20 22 42 49 4e 41 52 59 22 2c 20 36 2c 20 30 29   "BINARY", 6, 0)
bb70: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
bb80: 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a  pDfltColl!=0 );.
bb90: 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61  .  /* Also add a
bba0: 20 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65   UTF-8 case-inse
bbb0: 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f  nsitive collatio
bbc0: 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20  n sequence. */. 
bbd0: 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
bbe0: 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53  (db, "NOCASE", S
bbf0: 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e  QLITE_UTF8, 0, n
bc00: 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75  ocaseCollatingFu
bc10: 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 53 65  nc, 0);..  /* Se
bc20: 74 20 66 6c 61 67 73 20 6f 6e 20 74 68 65 20 62  t flags on the b
bc30: 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e  uilt-in collatin
bc40: 67 20 73 65 71 75 65 6e 63 65 73 20 2a 2f 0a 20  g sequences */. 
bc50: 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 2d 3e   db->pDfltColl->
bc60: 74 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 43 4f  type = SQLITE_CO
bc70: 4c 4c 5f 42 49 4e 41 52 59 3b 0a 20 20 70 43 6f  LL_BINARY;.  pCo
bc80: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
bc90: 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49  CollSeq(db, SQLI
bca0: 54 45 5f 55 54 46 38 2c 20 22 4e 4f 43 41 53 45  TE_UTF8, "NOCASE
bcb0: 22 2c 20 36 2c 20 30 29 3b 0a 20 20 69 66 28 20  ", 6, 0);.  if( 
bcc0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43 6f  pColl ){.    pCo
bcd0: 6c 6c 2d 3e 74 79 70 65 20 3d 20 53 51 4c 49 54  ll->type = SQLIT
bce0: 45 5f 43 4f 4c 4c 5f 4e 4f 43 41 53 45 3b 0a 20  E_COLL_NOCASE;. 
bcf0: 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
bd00: 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61  e backend databa
bd10: 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 64  se driver */.  d
bd20: 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66  b->openFlags = f
bd30: 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c  lags;.  rc = sql
bd40: 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79  ite3BtreeFactory
bd50: 28 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20  (db, zFilename, 
bd60: 30 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  0, SQLITE_DEFAUL
bd70: 54 5f 43 41 43 48 45 5f 53 49 5a 45 2c 20 0a 20  T_CACHE_SIZE, . 
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd90: 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20            flags 
bda0: 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  | SQLITE_OPEN_MA
bdb0: 49 4e 5f 44 42 2c 0a 20 20 20 20 20 20 20 20 20  IN_DB,.         
bdc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bdd0: 20 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42    &db->aDb[0].pB
bde0: 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  t);.  if( rc!=SQ
bdf0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
be00: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
be10: 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
be20: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
be30: 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
be40: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
be50: 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74   rc, 0);.    got
be60: 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
be70: 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  }.  db->aDb[0].p
be80: 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33  Schema = sqlite3
be90: 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62  SchemaGet(db, db
bea0: 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
beb0: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
bec0: 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68  ema = sqlite3Sch
bed0: 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a  emaGet(db, 0);..
bee0: 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c  .  /* The defaul
bef0: 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66  t safety_level f
bf00: 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  or the main data
bf10: 62 61 73 65 20 69 73 20 27 66 75 6c 6c 27 3b 20  base is 'full'; 
bf20: 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a  for the temp.  *
bf30: 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73  * database it is
bf40: 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61   'NONE'. This ma
bf50: 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20  tches the pager 
bf60: 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20  layer defaults. 
bf70: 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62   .  */.  db->aDb
bf80: 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69  [0].zName = "mai
bf90: 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d  n";.  db->aDb[0]
bfa0: 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20  .safety_level = 
bfb0: 33 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  3;.#ifndef SQLIT
bfc0: 45 5f 4f 4d 49 54 5f 54 45 4d 50 44 42 0a 20 20  E_OMIT_TEMPDB.  
bfd0: 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65  db->aDb[1].zName
bfe0: 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d   = "temp";.  db-
bff0: 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[1].safety_l
c000: 65 76 65 6c 20 3d 20 31 3b 0a 23 65 6e 64 69 66  evel = 1;.#endif
c010: 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ..  db->magic = 
c020: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
c030: 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  N;.  if( db->mal
c040: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
c050: 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
c060: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69  ;.  }..  /* Regi
c070: 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69  ster all built-i
c080: 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74  n functions, but
c090: 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
c0a0: 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a  to read the.  **
c0b0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
c0c0: 20 79 65 74 2e 20 54 68 69 73 20 69 73 20 64 65   yet. This is de
c0d0: 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20  layed until the 
c0e0: 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 64  first time the d
c0f0: 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20  atabase.  ** is 
c100: 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20  accessed..  */. 
c110: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
c120: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
c130: 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  .  sqlite3Regist
c140: 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f  erBuiltinFunctio
c150: 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  ns(db);..  /* Lo
c160: 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74  ad automatic ext
c170: 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73  ensions - extens
c180: 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 62  ions that have b
c190: 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20  een registered. 
c1a0: 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71   ** using the sq
c1b0: 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f  lite3_automatic_
c1c0: 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e  extension() API.
c1d0: 0a 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71  .  */.  (void)sq
c1e0: 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74  lite3AutoLoadExt
c1f0: 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 69  ensions(db);.  i
c200: 66 28 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  f( sqlite3_errco
c210: 64 65 28 64 62 29 21 3d 53 51 4c 49 54 45 5f 4f  de(db)!=SQLITE_O
c220: 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  K ){.    goto op
c230: 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 23  endb_out;.  }..#
c240: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
c250: 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21  BLE_FTS1.  if( !
c260: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c270: 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
c280: 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e  nt sqlite3Fts1In
c290: 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
c2a0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
c2b0: 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s1Init(db);.  }.
c2c0: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
c2d0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
c2e0: 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  2.  if( !db->mal
c2f0: 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
c300: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
c310: 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
c320: 69 74 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c  ite3Fts2Init(sql
c330: 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d  ite3*);.    rc =
c340: 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74   sqlite3Fts2Init
c350: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
c360: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
c370: 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 69 66  ENABLE_FTS3.  if
c380: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
c390: 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
c3a0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
c3b0: 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74   sqlite3Fts3Init
c3c0: 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
c3d0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
c3e0: 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28  ENABLE_ICU.  if(
c3f0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
c400: 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
c410: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
c420: 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64  sqlite3IcuInit(d
c430: 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
c440: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
c450: 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28  ABLE_RTREE.  if(
c460: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
c470: 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
c480: 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
c490: 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28  qlite3RtreeInit(
c4a0: 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
c4b0: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
c4c0: 64 62 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20 2f  db, rc, 0);..  /
c4d0: 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55  * -DSQLITE_DEFAU
c4e0: 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
c4f0: 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56  1 makes EXCLUSIV
c500: 45 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  E the default lo
c510: 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
c520: 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55    -DSQLITE_DEFAU
c530: 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
c540: 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68  0 make NORMAL th
c550: 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
c560: 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f  g.  ** mode.  Do
c570: 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61  ing nothing at a
c580: 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f  ll also makes NO
c590: 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
c5a0: 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
c5b0: 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
c5c0: 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e  KING_MODE.  db->
c5d0: 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53  dfltLockMode = S
c5e0: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
c5f0: 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71  CKING_MODE;.  sq
c600: 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
c610: 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72  gMode(sqlite3Btr
c620: 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b  eePager(db->aDb[
c630: 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20  0].pBt),.       
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c650: 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
c660: 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b  T_LOCKING_MODE);
c670: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 6e  .#endif..  /* En
c680: 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69  able the lookasi
c690: 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  de-malloc subsys
c6a0: 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f  tem */.  setupLo
c6b0: 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73  okaside(db, 0, s
c6c0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
c6d0: 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a  ig.szLookaside,.
c6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
c700: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f  lobalConfig.nLoo
c710: 6b 61 73 69 64 65 29 3b 0a 0a 6f 70 65 6e 64 62  kaside);..opendb
c720: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 64 62 20 29  _out:.  if( db )
c730: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
c740: 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73  ->mutex!=0 || is
c750: 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20 7c 7c  Threadsafe==0 ||
c760: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
c770: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d  nfig.bFullMutex=
c780: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
c790: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
c7a0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20  ->mutex);.  }.  
c7b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
c7c0: 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20  code(db);.  if( 
c7d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
c7e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
c7f0: 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 64  close(db);.    d
c800: 62 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  b = 0;.  }else i
c810: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c820: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69   ){.    db->magi
c830: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
c840: 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70  _SICK;.  }.  *pp
c850: 44 62 20 3d 20 64 62 3b 0a 20 20 72 65 74 75 72  Db = db;.  retur
c860: 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  n sqlite3ApiExit
c870: 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (0, rc);.}../*.*
c880: 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
c890: 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
c8a0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
c8b0: 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
c8c0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
c8d0: 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29  qlite3 **ppDb .)
c8e0: 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44  {.  return openD
c8f0: 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
c900: 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20  e, ppDb,.       
c910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
c920: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
c930: 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
c940: 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d  EN_CREATE, 0);.}
c950: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
c960: 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68  n_v2(.  const ch
c970: 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20  ar *filename,   
c980: 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
c990: 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  name (UTF-8) */.
c9a0: 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
c9b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
c9c0: 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64  : SQLite db hand
c9d0: 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
c9e0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
c9f0: 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  /* Flags */.  co
ca00: 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
ca10: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
ca20: 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75   VFS module to u
ca30: 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  se */.){.  retur
ca40: 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66  n openDatabase(f
ca50: 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 66  ilename, ppDb, f
ca60: 6c 61 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a  lags, zVfs);.}..
ca70: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
ca80: 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20  MIT_UTF16./*.** 
ca90: 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62  Open a new datab
caa0: 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69  ase handle..*/.i
cab0: 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31  nt sqlite3_open1
cac0: 36 28 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  6(.  const void 
cad0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
cae0: 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b  qlite3 **ppDb.){
caf0: 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
cb00: 46 69 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20  Filename8;   /* 
cb10: 7a 46 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65  zFilename encode
cb20: 64 20 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65  d in UTF-8 inste
cb30: 61 64 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a  ad of UTF-16 */.
cb40: 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
cb50: 2a 70 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b  *pVal;.  int rc;
cb60: 0a 0a 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c  ..  assert( zFil
cb70: 65 6e 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72  ename );.  asser
cb80: 74 28 20 70 70 44 62 20 29 3b 0a 20 20 2a 70 70  t( ppDb );.  *pp
cb90: 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  Db = 0;.#ifndef 
cba0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
cbb0: 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  INIT.  rc = sqli
cbc0: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
cbd0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
cbe0: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20  urn rc;.#endif. 
cbf0: 20 70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56   pVal = sqlite3V
cc00: 61 6c 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71  alueNew(0);.  sq
cc10: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
cc20: 28 70 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65  (pVal, -1, zFile
cc30: 6e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46  name, SQLITE_UTF
cc40: 31 36 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45  16NATIVE, SQLITE
cc50: 5f 53 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c  _STATIC);.  zFil
cc60: 65 6e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33  ename8 = sqlite3
cc70: 56 61 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20  ValueText(pVal, 
cc80: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
cc90: 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29  if( zFilename8 )
cca0: 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44  {.    rc = openD
ccb0: 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
ccc0: 65 38 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20  e8, ppDb,.      
ccd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cce0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
ccf0: 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
cd00: 50 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a  PEN_CREATE, 0);.
cd10: 20 20 20 20 61 73 73 65 72 74 28 20 2a 70 70 44      assert( *ppD
cd20: 62 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  b || rc==SQLITE_
cd30: 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28  NOMEM );.    if(
cd40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
cd50: 26 20 21 44 62 48 61 73 50 72 6f 70 65 72 74 79  & !DbHasProperty
cd60: 28 2a 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63  (*ppDb, 0, DB_Sc
cd70: 68 65 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20  hemaLoaded) ){. 
cd80: 20 20 20 20 20 45 4e 43 28 2a 70 70 44 62 29 20       ENC(*ppDb) 
cd90: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
cda0: 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  TIVE;.    }.  }e
cdb0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
cdc0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
cdd0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
cde0: 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74  ee(pVal);..  ret
cdf0: 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78  urn sqlite3ApiEx
ce00: 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e  it(0, rc);.}.#en
ce10: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
ce20: 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
ce30: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65  ** Register a ne
ce40: 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  w collation sequ
ce50: 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61  ence with the da
ce60: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
ce70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ce80: 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
ce90: 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
cea0: 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
ceb0: 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65  *zName, .  int e
cec0: 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74  nc, .  void* pCt
ced0: 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61  x,.  int(*xCompa
cee0: 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  re)(void*,int,co
cef0: 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  nst void*,int,co
cf00: 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  nst void*).){.  
cf10: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
cf20: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
cf30: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
cf40: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
cf50: 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ailed );.  rc = 
cf60: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
cf70: 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20  db, zName, enc, 
cf80: 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
cf90: 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  0);.  rc = sqlit
cfa0: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
cfb0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
cfc0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
cfd0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
cfe0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
cff0: 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
d000: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
d010: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
d020: 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
d030: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
d040: 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20  collation_v2(.  
d050: 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
d060: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
d070: 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
d080: 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
d090: 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
d0a0: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
d0b0: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
d0c0: 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
d0d0: 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
d0e0: 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
d0f0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
d100: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
d110: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
d120: 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d  Failed );.  rc =
d130: 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
d140: 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c  (db, zName, enc,
d150: 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
d160: 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73   xDel);.  rc = s
d170: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
d180: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
d190: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
d1a0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
d1b0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
d1c0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
d1d0: 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  16./*.** Registe
d1e0: 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
d1f0: 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
d200: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
d210: 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
d220: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
d230: 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  llation16(.  sql
d240: 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e  ite3* db, .  con
d250: 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a  st void *zName,.
d260: 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
d270: 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
d280: 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
d290: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
d2a0: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
d2b0: 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ).){.  int rc = 
d2c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61  SQLITE_OK;.  cha
d2d0: 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73 71 6c  r *zName8;.  sql
d2e0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d2f0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
d300: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
d310: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e  ocFailed );.  zN
d320: 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 55 74  ame8 = sqlite3Ut
d330: 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65  f16to8(db, zName
d340: 2c 20 2d 31 29 3b 0a 20 20 69 66 28 20 7a 4e 61  , -1);.  if( zNa
d350: 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
d360: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
d370: 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 65 6e 63 2c  db, zName8, enc,
d380: 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c   pCtx, xCompare,
d390: 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
d3a0: 44 62 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65  DbFree(db, zName
d3b0: 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  8);.  }.  rc = s
d3c0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
d3d0: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
d3e0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
d3f0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
d400: 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  n rc;.}.#endif /
d410: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
d420: 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
d430: 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69  gister a collati
d440: 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
d450: 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74  ory callback wit
d460: 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
d470: 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70  andle.** db. Rep
d480: 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75  lace any previou
d490: 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f  sly installed co
d4a0: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
d4b0: 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74   factory..*/.int
d4c0: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69   sqlite3_collati
d4d0: 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c  on_needed(.  sql
d4e0: 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
d4f0: 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
d500: 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
d510: 6c 4e 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73  lNeeded)(void*,s
d520: 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78  qlite3*,int eTex
d530: 74 52 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a  tRep,const char*
d540: 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ).){.  sqlite3_m
d550: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
d560: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f  utex);.  db->xCo
d570: 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c  llNeeded = xColl
d580: 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43  Needed;.  db->xC
d590: 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b  ollNeeded16 = 0;
d5a0: 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64  .  db->pCollNeed
d5b0: 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65  edArg = pCollNee
d5c0: 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  dedArg;.  sqlite
d5d0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d5e0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
d5f0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d600: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
d610: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
d620: 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
d630: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
d640: 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
d650: 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
d660: 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
d670: 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
d680: 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
d690: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
d6a0: 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
d6b0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
d6c0: 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a  ation_needed16(.
d6d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
d6e0: 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
d6f0: 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
d700: 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28  *xCollNeeded16)(
d710: 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69  void*,sqlite3*,i
d720: 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73  nt eTextRep,cons
d730: 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71  t void*).){.  sq
d740: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
d750: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
d760: 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20  db->xCollNeeded 
d770: 3d 20 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  = 0;.  db->xColl
d780: 4e 65 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c  Needed16 = xColl
d790: 4e 65 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e  Needed16;.  db->
d7a0: 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d  pCollNeededArg =
d7b0: 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b   pCollNeededArg;
d7c0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d7d0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
d7e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
d7f0: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20  TE_OK;.}.#endif 
d800: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
d810: 54 46 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66  TF16 */..#ifndef
d820: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 47 4c 4f   SQLITE_OMIT_GLO
d830: 42 41 4c 52 45 43 4f 56 45 52 0a 23 69 66 6e 64  BALRECOVER.#ifnd
d840: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
d850: 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20  EPRECATED./*.** 
d860: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
d870: 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72 6f 6e   now an anachron
d880: 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74 6f 20  ism. It used to 
d890: 62 65 20 75 73 65 64 20 74 6f 20 72 65 63 6f 76  be used to recov
d8a0: 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c  er from a.** mal
d8b0: 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c 20 62  loc() failure, b
d8c0: 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20 64 6f  ut SQLite now do
d8d0: 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61 74 69  es this automati
d8e0: 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cally..*/.int sq
d8f0: 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72 65 63  lite3_global_rec
d900: 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20 72 65  over(void){.  re
d910: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
d920: 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  }.#endif.#endif.
d930: 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73  ./*.** Test to s
d940: 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
d950: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  t the database c
d960: 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20  onnection is in 
d970: 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f  autocommit.** mo
d980: 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
d990: 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46 41   if it is and FA
d9a0: 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74  LSE if not.  Aut
d9b0: 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20  ocommit mode is 
d9c0: 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74  on.** by default
d9d0: 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73  .  Autocommit is
d9e0: 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20 42   disabled by a B
d9f0: 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61  EGIN statement a
da00: 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20  nd reenabled.** 
da10: 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d  by the next COMM
da20: 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a  IT or ROLLBACK..
da30: 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20  **.******* THIS 
da40: 49 53 20 41 4e 20 45 58 50 45 52 49 4d 45 4e 54  IS AN EXPERIMENT
da50: 41 4c 20 41 50 49 20 41 4e 44 20 49 53 20 53 55  AL API AND IS SU
da60: 42 4a 45 43 54 20 54 4f 20 43 48 41 4e 47 45 20  BJECT TO CHANGE 
da70: 2a 2a 2a 2a 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71  ******.*/.int sq
da80: 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f  lite3_get_autoco
da90: 6d 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  mmit(sqlite3 *db
daa0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
dab0: 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 23  autoCommit;.}..#
dac0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
dad0: 55 47 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  UG./*.** The fol
dae0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 20 69  lowing routine i
daf0: 73 20 73 75 62 74 69 74 75 74 65 64 20 66 6f 72  s subtituted for
db00: 20 63 6f 6e 73 74 61 6e 74 20 53 51 4c 49 54 45   constant SQLITE
db10: 5f 43 4f 52 52 55 50 54 20 69 6e 0a 2a 2a 20 64  _CORRUPT in.** d
db20: 65 62 75 67 67 69 6e 67 20 62 75 69 6c 64 73 2e  ebugging builds.
db30: 20 20 54 68 69 73 20 70 72 6f 76 69 64 65 73 20    This provides 
db40: 61 20 77 61 79 20 74 6f 20 73 65 74 20 61 20 62  a way to set a b
db50: 72 65 61 6b 70 6f 69 6e 74 20 66 6f 72 20 77 68  reakpoint for wh
db60: 65 6e 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e  en.** corruption
db70: 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74   is first detect
db80: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
db90: 65 33 43 6f 72 72 75 70 74 28 76 6f 69 64 29 7b  e3Corrupt(void){
dba0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
dbb0: 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 23 65 6e 64  _CORRUPT;.}.#end
dbc0: 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
dbd0: 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
dbe0: 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  ED./*.** This is
dbf0: 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72   a convenience r
dc00: 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65  outine that make
dc10: 73 20 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20  s sure that all 
dc20: 74 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a  thread-specific.
dc30: 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68 69 73  ** data for this
dc40: 20 74 68 72 65 61 64 20 68 61 73 20 62 65 65 6e   thread has been
dc50: 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a   deallocated..**
dc60: 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f  .** SQLite no lo
dc70: 6e 67 65 72 20 75 73 65 73 20 74 68 72 65 61 64  nger uses thread
dc80: 2d 73 70 65 63 69 66 69 63 20 64 61 74 61 20 73  -specific data s
dc90: 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  o this routine i
dca0: 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70  s now a.** no-op
dcb0: 2e 20 20 49 74 20 69 73 20 72 65 74 61 69 6e 65  .  It is retaine
dcc0: 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c  d for historical
dcd0: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a   compatibility..
dce0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
dcf0: 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76  thread_cleanup(v
dd00: 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  oid){.}.#endif..
dd10: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74  /*.** Return met
dd20: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  a information ab
dd30: 6f 75 74 20 61 20 73 70 65 63 69 66 69 63 20 63  out a specific c
dd40: 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62  olumn of a datab
dd50: 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65  ase table..** Se
dd60: 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c  e comment in sql
dd70: 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68  ite3.h (sqlite.h
dd80: 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73  .in) for details
dd90: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
dda0: 54 45 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e  TE_ENABLE_COLUMN
ddb0: 5f 4d 45 54 41 44 41 54 41 0a 69 6e 74 20 73 71  _METADATA.int sq
ddc0: 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75  lite3_table_colu
ddd0: 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73  mn_metadata(.  s
dde0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
ddf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f             /* Co
de00: 6e 6e 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20  nnection handle 
de10: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
de20: 2a 7a 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20  *zDbName,       
de30: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d   /* Database nam
de40: 65 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  e or NULL */.  c
de50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c  onst char *zTabl
de60: 65 4e 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61  eName,     /* Ta
de70: 62 6c 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f  ble name */.  co
de80: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d  nst char *zColum
de90: 6e 4e 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c  nName,    /* Col
dea0: 75 6d 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68  umn name */.  ch
deb0: 61 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74  ar const **pzDat
dec0: 61 54 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54  aType,    /* OUT
ded0: 50 55 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61  PUT: Declared da
dee0: 74 61 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61  ta type */.  cha
def0: 72 20 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c  r const **pzColl
df00: 53 65 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50  Seq,     /* OUTP
df10: 55 54 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65  UT: Collation se
df20: 71 75 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20  quence name */. 
df30: 20 69 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20   int *pNotNull, 
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df50: 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
df60: 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61  NOT NULL constra
df70: 69 6e 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  int exists */.  
df80: 69 6e 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79  int *pPrimaryKey
df90: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  ,           /* O
dfa0: 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
dfb0: 6f 6c 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b  olumn part of PK
dfc0: 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f   */.  int *pAuto
dfd0: 69 6e 63 20 20 20 20 20 20 20 20 20 20 20 20 20  inc             
dfe0: 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
dff0: 65 20 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61  e if column is a
e000: 75 74 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f  uto-increment */
e010: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
e020: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
e030: 30 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62  0;.  Table *pTab
e040: 20 3d 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a   = 0;.  Column *
e050: 70 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20  pCol = 0;.  int 
e060: 69 43 6f 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f  iCol;..  char co
e070: 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d  nst *zDataType =
e080: 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74   0;.  char const
e090: 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a   *zCollSeq = 0;.
e0a0: 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20    int notnull = 
e0b0: 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79  0;.  int primary
e0c0: 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61  key = 0;.  int a
e0d0: 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f  utoinc = 0;..  /
e0e0: 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64 61 74  * Ensure the dat
e0f0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
e100: 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a   been loaded */.
e110: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
e120: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
e130: 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65  ;.  (void)sqlite
e140: 33 53 61 66 65 74 79 4f 6e 28 64 62 29 3b 0a 20  3SafetyOn(db);. 
e150: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
e160: 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20  erAll(db);.  rc 
e170: 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62  = sqlite3Init(db
e180: 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
e190: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
e1a0: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   ){.    goto err
e1b0: 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
e1c0: 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  * Locate the tab
e1d0: 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a  le in question *
e1e0: 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  /.  pTab = sqlit
e1f0: 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
e200: 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e  zTableName, zDbN
e210: 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61  ame);.  if( !pTa
e220: 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  b || pTab->pSele
e230: 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d  ct ){.    pTab =
e240: 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   0;.    goto err
e250: 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
e260: 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d  * Find the colum
e270: 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f  n for which info
e280: 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f   is requested */
e290: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73  .  if( sqlite3Is
e2a0: 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d  Rowid(zColumnNam
e2b0: 65 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  e) ){.    iCol =
e2c0: 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
e2d0: 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
e2e0: 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
e2f0: 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
e300: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
e310: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
e320: 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
e330: 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
e340: 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
e350: 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
e360: 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
e370: 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
e380: 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  e, zColumnName) 
e390: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
e3a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
e3b0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54      if( iCol==pT
e3c0: 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
e3d0: 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
e3e0: 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
e3f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
e400: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
e410: 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65  block stores the
e420: 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
e430: 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  n that will be r
e440: 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20  eturned.  ** to 
e450: 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f  the caller in lo
e460: 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44  cal variables zD
e470: 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65  ataType, zCollSe
e480: 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d  q, notnull, prim
e490: 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20  arykey.  ** and 
e4a0: 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73  autoinc. At this
e4b0: 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65   point there are
e4c0: 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69   two possibiliti
e4d0: 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  es:.  ** .  **  
e4e0: 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66     1. The specif
e4f0: 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ied column name 
e500: 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64  was rowid", "oid
e510: 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a  " or "_rowid_" .
e520: 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20    **        and 
e530: 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c  there is no expl
e540: 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
e550: 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a  IPK column. .  *
e560: 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68  *.  **     2. Th
e570: 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  e table is not a
e580: 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f   view and the co
e590: 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69  lumn name identi
e5a0: 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20  fied an .  **   
e5b0: 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20       explicitly 
e5c0: 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e  declared column.
e5d0: 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72   Copy meta infor
e5e0: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f  mation from *pCo
e5f0: 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70  l..  */ .  if( p
e600: 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61  Col ){.    zData
e610: 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  Type = pCol->zTy
e620: 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71  pe;.    zCollSeq
e630: 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a   = pCol->zColl;.
e640: 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43      notnull = pC
e650: 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a  ol->notNull!=0;.
e660: 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20      primarykey  
e670: 3d 20 70 43 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65  = pCol->isPrimKe
e680: 79 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e  y!=0;.    autoin
e690: 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d  c = pTab->iPKey=
e6a0: 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e  =iCol && (pTab->
e6b0: 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
e6c0: 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b  toincrement)!=0;
e6d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44  .  }else{.    zD
e6e0: 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47  ataType = "INTEG
e6f0: 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  ER";.    primary
e700: 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  key = 1;.  }.  i
e710: 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a  f( !zCollSeq ){.
e720: 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22      zCollSeq = "
e730: 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72  BINARY";.  }..er
e740: 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ror_out:.  sqlit
e750: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
e760: 64 62 29 3b 0a 20 20 28 76 6f 69 64 29 73 71 6c  db);.  (void)sql
e770: 69 74 65 33 53 61 66 65 74 79 4f 66 66 28 64 62  ite3SafetyOff(db
e780: 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65 72  );..  /* Whether
e790: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63 61   the function ca
e7a0: 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72 20  ll succeeded or 
e7b0: 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65 20  failed, set the 
e7c0: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
e7d0: 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65 76  s.  ** to whatev
e7e0: 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20 63  er their local c
e7f0: 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e 74  ounterparts cont
e800: 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f 72  ain. If an error
e810: 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a   did occur,.  **
e820: 20 74 68 69 73 20 68 61 73 20 74 68 65 20 65 66   this has the ef
e830: 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20  fect of zeroing 
e840: 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61 6d  all output param
e850: 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  eters..  */.  if
e860: 28 20 70 7a 44 61 74 61 54 79 70 65 20 29 20 2a  ( pzDataType ) *
e870: 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44 61  pzDataType = zDa
e880: 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70 7a  taType;.  if( pz
e890: 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c  CollSeq ) *pzCol
e8a0: 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b  lSeq = zCollSeq;
e8b0: 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20  .  if( pNotNull 
e8c0: 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f  ) *pNotNull = no
e8d0: 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72  tnull;.  if( pPr
e8e0: 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72 69  imaryKey ) *pPri
e8f0: 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61 72  maryKey = primar
e900: 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75 74  ykey;.  if( pAut
e910: 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e 63  oinc ) *pAutoinc
e920: 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69   = autoinc;..  i
e930: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63  f( SQLITE_OK==rc
e940: 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20 20   && !pTab ){.   
e950: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
e960: 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  b, zErrMsg);.   
e970: 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74   zErrMsg = sqlit
e980: 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22 6e  e3MPrintf(db, "n
e990: 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f 6c  o such table col
e9a0: 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61  umn: %s.%s", zTa
e9b0: 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20  bleName,.       
e9c0: 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20   zColumnName);. 
e9d0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
e9e0: 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  RROR;.  }.  sqli
e9f0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
ea00: 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30   (zErrMsg?"%s":0
ea10: 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73  ), zErrMsg);.  s
ea20: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
ea30: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63 20   zErrMsg);.  rc 
ea40: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
ea50: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
ea60: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ea70: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
ea80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
ea90: 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20 66  f../*.** Sleep f
eaa0: 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69 6c  or a little whil
eab0: 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 61  e.  Return the a
eac0: 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73 6c  mount of time sl
ead0: 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ept..*/.int sqli
eae0: 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d 73  te3_sleep(int ms
eaf0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
eb00: 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72 63   *pVfs;.  int rc
eb10: 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69 74  ;.  pVfs = sqlit
eb20: 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b 0a  e3_vfs_find(0);.
eb30: 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29 20    if( pVfs==0 ) 
eb40: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
eb50: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 6f  This function wo
eb60: 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63 6f  rks in milliseco
eb70: 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e 64  nds, but the und
eb80: 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70 28  erlying OsSleep(
eb90: 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65 73  ) .  ** API uses
eba0: 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 48   microseconds. H
ebb0: 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73 2e  ence the 1000's.
ebc0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73 71  .  */.  rc = (sq
ebd0: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56 66  lite3OsSleep(pVf
ebe0: 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30 30  s, 1000*ms)/1000
ebf0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
ec00: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20  }../*.** Enable 
ec10: 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20 65  or disable the e
ec20: 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20 63  xtended result c
ec30: 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  odes..*/.int sql
ec40: 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72 65  ite3_extended_re
ec50: 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69 74  sult_codes(sqlit
ec60: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f 66  e3 *db, int onof
ec70: 66 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  f){.  sqlite3_mu
ec80: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
ec90: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d  tex);.  db->errM
eca0: 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78  ask = onoff ? 0x
ecb0: 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b  ffffffff : 0xff;
ecc0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
ecd0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
ece0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
ecf0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
ed00: 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65  Invoke the xFile
ed10: 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f  Control method o
ed20: 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64  n a particular d
ed30: 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20  atabase..*/.int 
ed40: 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
ed50: 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  trol(sqlite3 *db
ed60: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
ed70: 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76  bName, int op, v
ed80: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e  oid *pArg){.  in
ed90: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52  t rc = SQLITE_ER
eda0: 52 4f 52 3b 0a 20 20 69 6e 74 20 69 44 62 3b 0a  ROR;.  int iDb;.
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 69 66 28 20 7a 44 62 4e 61 6d 65 3d  ;.  if( zDbName=
ede0: 3d 30 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20  =0 ){.    iDb = 
edf0: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
ee00: 66 6f 72 28 69 44 62 3d 30 3b 20 69 44 62 3c 64  for(iDb=0; iDb<d
ee10: 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 29 7b 0a  b->nDb; iDb++){.
ee20: 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
ee30: 28 64 62 2d 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e  (db->aDb[iDb].zN
ee40: 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3d 3d 30  ame, zDbName)==0
ee50: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a   ) break;.    }.
ee60: 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 64 62    }.  if( iDb<db
ee70: 2d 3e 6e 44 62 20 29 7b 0a 20 20 20 20 42 74 72  ->nDb ){.    Btr
ee80: 65 65 20 2a 70 42 74 72 65 65 20 3d 20 64 62 2d  ee *pBtree = db-
ee90: 3e 61 44 62 5b 69 44 62 5d 2e 70 42 74 3b 0a 20  >aDb[iDb].pBt;. 
eea0: 20 20 20 69 66 28 20 70 42 74 72 65 65 20 29 7b     if( pBtree ){
eeb0: 0a 20 20 20 20 20 20 50 61 67 65 72 20 2a 70 50  .      Pager *pP
eec0: 61 67 65 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  ager;.      sqli
eed0: 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20  te3_file *fd;.  
eee0: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
eef0: 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a 20  Enter(pBtree);. 
ef00: 20 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71       pPager = sq
ef10: 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
ef20: 70 42 74 72 65 65 29 3b 0a 20 20 20 20 20 20 61  pBtree);.      a
ef30: 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
ef40: 20 29 3b 0a 20 20 20 20 20 20 66 64 20 3d 20 73   );.      fd = s
ef50: 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
ef60: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
ef70: 73 73 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a  ssert( fd!=0 );.
ef80: 20 20 20 20 20 20 69 66 28 20 66 64 2d 3e 70 4d        if( fd->pM
ef90: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
efa0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
efb0: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20  FileControl(fd, 
efc0: 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20  op, pArg);.     
efd0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
efe0: 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
eff0: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  e);.    }.  }.  
f000: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f010: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f020: 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20 20 0a    return rc;   .
f030: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61  }../*.** Interfa
f040: 63 65 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e  ce to the testin
f050: 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20  g logic..*/.int 
f060: 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
f070: 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e  trol(int op, ...
f080: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  ){.  int rc = 0;
f090: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f0a0: 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53  OMIT_BUILTIN_TES
f0b0: 54 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  T.  va_list ap;.
f0c0: 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f    va_start(ap, o
f0d0: 70 29 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  p);.  switch( op
f0e0: 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   ){..    /*.    
f0f0: 2a 2a 20 53 61 76 65 20 74 68 65 20 63 75 72 72  ** Save the curr
f100: 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
f110: 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20   PRNG..    */.  
f120: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
f130: 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45  STCTRL_PRNG_SAVE
f140: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
f150: 33 50 72 6e 67 53 61 76 65 53 74 61 74 65 28 29  3PrngSaveState()
f160: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f170: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
f180: 20 2a 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20   ** Restore the 
f190: 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
f1a0: 47 20 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74  G to the last st
f1b0: 61 74 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a  ate saved using.
f1c0: 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45      ** PRNG_SAVE
f1d0: 2e 20 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20  .  If PRNG_SAVE 
f1e0: 68 61 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65  has never before
f1f0: 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68   been called, th
f200: 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76  en.    ** this v
f210: 65 72 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52  erb acts like PR
f220: 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f  NG_RESET..    */
f230: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
f240: 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52  _TESTCTRL_PRNG_R
f250: 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20  ESTORE: {.      
f260: 73 71 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f  sqlite3PrngResto
f270: 72 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  reState();.     
f280: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
f290: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73     /*.    ** Res
f2a0: 65 74 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b  et the PRNG back
f2b0: 20 74 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61   to its uninitia
f2c0: 6c 69 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68  lized state.  Th
f2d0: 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20  e next call.    
f2e0: 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61  ** to sqlite3_ra
f2f0: 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20  ndomness() will 
f300: 72 65 73 65 65 64 20 74 68 65 20 50 52 4e 47 20  reseed the PRNG 
f310: 75 73 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63  using a single c
f320: 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68  all.    ** to th
f330: 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65  e xRandomness me
f340: 74 68 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61  thod of the defa
f350: 75 6c 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a  ult VFS..    */.
f360: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
f370: 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
f380: 53 45 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  SET: {.      sql
f390: 69 74 65 33 50 72 6e 67 52 65 73 65 74 53 74 61  ite3PrngResetSta
f3a0: 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
f3b0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
f3c0: 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
f3d0: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49  _test_control(BI
f3e0: 54 56 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c  TVEC_TEST, size,
f3f0: 20 70 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a   program).    **
f400: 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65  .    ** Run a te
f410: 73 74 20 61 67 61 69 6e 73 74 20 61 20 42 69 74  st against a Bit
f420: 76 65 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69  vec object of si
f430: 7a 65 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d  ze.  The program
f440: 20 61 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a   argument.    **
f450: 20 69 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20   is an array of 
f460: 69 6e 74 65 67 65 72 73 20 74 68 61 74 20 64 65  integers that de
f470: 66 69 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20  fines the test. 
f480: 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a   Return -1 on a.
f490: 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c      ** memory al
f4a0: 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20  location error, 
f4b0: 30 20 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72  0 on success, or
f4c0: 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e   non-zero for an
f4d0: 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53   error..    ** S
f4e0: 65 65 20 74 68 65 20 73 71 6c 69 74 65 33 42 69  ee the sqlite3Bi
f4f0: 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
f500: 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  ) for additional
f510: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20   information..  
f520: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
f530: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49  LITE_TESTCTRL_BI
f540: 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20  TVEC_TEST: {.   
f550: 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61     int sz = va_a
f560: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
f570: 20 20 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20     int *aProg = 
f580: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29  va_arg(ap, int*)
f590: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
f5a0: 69 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69  ite3BitvecBuilti
f5b0: 6e 54 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29  nTest(sz, aProg)
f5c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f5d0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
f5e0: 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
f5f0: 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e  t_control(BENIGN
f600: 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78  _MALLOC_HOOKS, x
f610: 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20  Begin, xEnd).   
f620: 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73   **.    ** Regis
f630: 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c  ter hooks to cal
f640: 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  l to indicate wh
f650: 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ich malloc() fai
f660: 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72  lures .    ** ar
f670: 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f  e benign..    */
f680: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
f690: 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e  _TESTCTRL_BENIGN
f6a0: 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b  _MALLOC_HOOKS: {
f6b0: 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
f6c0: 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74  oid (*void_funct
f6d0: 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20  ion)(void);.    
f6e0: 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
f6f0: 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20  xBenignBegin;.  
f700: 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f      void_functio
f710: 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20  n xBenignEnd;.  
f720: 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e      xBenignBegin
f730: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
f740: 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20  id_function);.  
f750: 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d      xBenignEnd =
f760: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
f770: 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
f780: 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d    sqlite3BenignM
f790: 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69  allocHooks(xBeni
f7a0: 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e  gnBegin, xBenign
f7b0: 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61  End);.      brea
f7c0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
f7d0: 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
f7e0: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
f7f0: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
f800: 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69  NDING_BYTE, unsi
f810: 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20  gned int X).    
f820: 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
f830: 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74  e PENDING byte t
f840: 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  o the value in t
f850: 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20  he argument, if 
f860: 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65  X>0..    ** Make
f870: 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58   no changes if X
f880: 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ==0.  Return the
f890: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65   value of the pe
f8a0: 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a  nding byte.    *
f8b0: 2a 20 61 73 20 69 74 20 65 78 69 73 74 69 6e 67  * as it existing
f8c0: 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
f8d0: 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e  tine was called.
f8e0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
f8f0: 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67  MPORTANT:  Chang
f900: 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ing the PENDING 
f910: 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30  byte from 0x4000
f920: 30 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a  0000 results in.
f930: 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70      ** an incomp
f940: 61 74 69 62 6c 65 20 64 61 74 61 62 61 73 65 20  atible database 
f950: 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68  file format.  Ch
f960: 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49  anging the PENDI
f970: 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77  NG byte.    ** w
f980: 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73  hile any databas
f990: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
f9a0: 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  open results in 
f9b0: 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20  undefined and.  
f9c0: 20 20 2a 2a 20 64 69 6c 65 74 65 72 69 6f 75 73    ** dileterious
f9d0: 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a   behavior..    *
f9e0: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
f9f0: 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49  E_TESTCTRL_PENDI
fa00: 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20  NG_BYTE: {.     
fa10: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6e 65   unsigned int ne
fa20: 77 56 61 6c 20 3d 20 76 61 5f 61 72 67 28 61 70  wVal = va_arg(ap
fa30: 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b  , unsigned int);
fa40: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
fa50: 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65 3b 0a  te3PendingByte;.
fa60: 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c        if( newVal
fa70: 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e   ) sqlite3Pendin
fa80: 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a  gByte = newVal;.
fa90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
faa0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
fab0: 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
fac0: 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
fad0: 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20  ESTCTRL_ASSERT, 
fae0: 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
faf0: 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
fb00: 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
fb10: 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
fb20: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a   whether or not.
fb30: 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20      ** assert() 
fb40: 77 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63  was enabled at c
fb50: 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66  ompile-time.  If
fb60: 20 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61   X is true and a
fb70: 73 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69  ssert().    ** i
fb80: 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20  s enabled, then 
fb90: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
fba0: 20 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20   is true.  If X 
fbb0: 69 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20  is true and.    
fbc0: 2a 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64  ** assert() is d
fbd0: 69 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68  isabled, then th
fbe0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
fbf0: 73 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73  s zero.  If X is
fc00: 0a 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e  .    ** false an
fc10: 64 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e  d assert() is en
fc20: 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
fc30: 61 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20  assertion fires 
fc40: 61 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  and the.    ** p
fc50: 72 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20  rocess aborts.  
fc60: 49 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e  If X is false an
fc70: 64 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  d assert() is di
fc80: 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
fc90: 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76  .    ** return v
fca0: 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20  alue is zero..  
fcb0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
fcc0: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
fcd0: 53 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f  SERT: {.      vo
fce0: 6c 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30  latile int x = 0
fcf0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
fd00: 28 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69  (x = va_arg(ap,i
fd10: 6e 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20  nt))!=0 );.     
fd20: 20 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62   rc = x;.      b
fd30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20  reak;.    }...  
fd40: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c    /*.    **  sql
fd50: 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
fd60: 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
fd70: 4c 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29  L_ALWAYS, int X)
fd80: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
fd90: 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69  his action provi
fda0: 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74  des a run-time t
fdb0: 65 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74  est to see how t
fdc0: 68 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20  he ALWAYS and.  
fdd0: 20 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f    ** NEVER macro
fde0: 73 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 61  s were defined a
fdf0: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a  t compile-time..
fe00: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
fe10: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
fe20: 73 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a 20  s ALWAYS(X).  . 
fe30: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
fe40: 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73   recommended tes
fe50: 74 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74  t is X==2.  If t
fe60: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
fe70: 69 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73  is 2, that means
fe80: 0a 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29  .    ** ALWAYS()
fe90: 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65   and NEVER() are
fea0: 20 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73   both no-op pass
feb0: 2d 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c  -through macros,
fec0: 20 77 68 69 63 68 20 69 73 20 74 68 65 0a 20 20   which is the.  
fed0: 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74    ** default set
fee0: 74 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65  ting.  If the re
fef0: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c  turn value is 1,
ff00: 20 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69   then ALWAYS() i
ff10: 73 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20  s either.    ** 
ff20: 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72  hard-coded to tr
ff30: 75 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73  ue or else it as
ff40: 73 65 72 74 73 20 69 66 20 69 74 73 20 61 72 67  serts if its arg
ff50: 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a  ument is false..
ff60: 20 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74      ** The first
ff70: 20 62 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d   behavior (hard-
ff80: 63 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20 69  coded to true) i
ff90: 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20  s the case if.  
ffa0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54    ** SQLITE_TEST
ffb0: 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77  CTRL_ASSERT show
ffc0: 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20  s that assert() 
ffd0: 69 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20  is disabled and 
ffe0: 74 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a  the second.    *
fff0: 2a 20 62 65 68 61 76 69 6f 72 20 28 61 73 73 65  * behavior (asse
10000 72 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65  rt if the argume
10010 6e 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69  nt to ALWAYS() i
10020 73 20 66 61 6c 73 65 29 20 69 73 20 74 68 65 20  s false) is the 
10030 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53  case if.    ** S
10040 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
10050 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74  SSERT shows that
10060 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61   assert() is ena
10070 62 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  bled..    **.   
10080 20 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65   ** The run-time
10090 20 74 65 73 74 20 70 72 6f 63 65 64 75 72 65 20   test procedure 
100a0 6d 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74  might look somet
100b0 68 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a  hing like this:.
100c0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
100d0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73   if( sqlite3_tes
100e0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
100f0 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
10100 2c 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a  , 2)==2 ){.    *
10110 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
10120 28 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61  () and NEVER() a
10130 72 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68  re no-op pass-th
10140 72 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20  rough macros.   
10150 20 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28   **    }else if(
10160 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
10170 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
10180 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29  TCTRL_ASSERT, 1)
10190 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20   ){.    **      
101a0 2f 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73 73  // ALWAYS(x) ass
101b0 65 72 74 73 20 74 68 61 74 20 78 20 69 73 20 74  erts that x is t
101c0 72 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73  rue. NEVER(x) as
101d0 73 65 72 74 73 20 78 20 69 73 20 66 61 6c 73 65  serts x is false
101e0 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73  ..    **    }els
101f0 65 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  e{.    **      /
10200 2f 20 41 4c 57 41 59 53 28 78 29 20 69 73 20 61  / ALWAYS(x) is a
10210 20 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45   constant 1.  NE
10220 56 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73  VER(x) is a cons
10230 74 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20  tant 0..    **  
10240 20 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63    }.    */.    c
10250 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
10260 54 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20  TRL_ALWAYS: {.  
10270 20 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61      int x = va_a
10280 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20  rg(ap,int);.    
10290 20 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78 29    rc = ALWAYS(x)
102a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
102b0 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
102c0 64 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  d(ap);.#endif /*
102d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49   SQLITE_OMIT_BUI
102e0 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72  LTIN_TEST */.  r
102f0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a              eturn rc;.}.