/ Hex Artifact Content
Login

Artifact 120d65f0c2d011b0d7f373680a913b84819b2f92:


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 38 20 32 30 30 39 2f 30 36  ,v 1.558 2009/06
0280: 2f 31 39 20 31 34 3a 30 36 3a 30 33 20 64 72 68  /19 14:06:03 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 70 61 67 65 20 63 61 63 68 65 20 6d 65 6d 6f   page cache memo
29a0: 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  ry space */.    
29b0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
29c0: 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76 61  onfig.pPage = va
29d0: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
29e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
29f0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67  obalConfig.szPag
2a00: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
2a10: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
2a20: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2a30: 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Page = va_arg(ap
2a40: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
2a50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
2a60: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2a70: 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20 20  IG_PCACHE: {.   
2a80: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
2a90: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67   alternative pag
2aa0: 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e  e cache implemen
2ab0: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
2ac0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2ad0: 66 69 67 2e 70 63 61 63 68 65 20 3d 20 2a 76 61  fig.pcache = *va
2ae0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
2af0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 2a  _pcache_methods*
2b00: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
2b10: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
2b20: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45  SQLITE_CONFIG_GE
2b30: 54 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20  TPCACHE: {.     
2b40: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
2b50: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 2e  alConfig.pcache.
2b60: 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20  xInit==0 ){.    
2b70: 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63 68      sqlite3PCach
2b80: 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20  eSetDefault();. 
2b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 76 61       }.      *va
2ba0: 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33  _arg(ap, sqlite3
2bb0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 2a  _pcache_methods*
2bc0: 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ) = sqlite3Globa
2bd0: 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 3b 0a  lConfig.pcache;.
2be0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2bf0: 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28   }..#if defined(
2c00: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
2c10: 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e 65  MSYS3) || define
2c20: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
2c30: 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63 61 73  MEMSYS5).    cas
2c40: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
2c50: 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  HEAP: {.      /*
2c60: 20 44 65 73 69 67 6e 61 74 65 20 61 20 62 75 66   Designate a buf
2c70: 66 65 72 20 66 6f 72 20 68 65 61 70 20 6d 65 6d  fer for heap mem
2c80: 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ory space */.   
2c90: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2ca0: 43 6f 6e 66 69 67 2e 70 48 65 61 70 20 3d 20 76  Config.pHeap = v
2cb0: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
2cc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
2cd0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61  lobalConfig.nHea
2ce0: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  p = va_arg(ap, i
2cf0: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
2d00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
2d10: 6e 52 65 71 20 3d 20 76 61 5f 61 72 67 28 61 70  nReq = va_arg(ap
2d20: 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20 20 20 69  , int);..      i
2d30: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
2d40: 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20  Config.pHeap==0 
2d50: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
2d60: 20 74 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65   the heap pointe
2d70: 72 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  r is NULL, then 
2d80: 72 65 73 74 6f 72 65 20 74 68 65 20 6d 61 6c 6c  restore the mall
2d90: 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  oc implementatio
2da0: 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63  n.        ** bac
2db0: 6b 20 74 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  k to NULL pointe
2dc0: 72 73 20 74 6f 6f 2e 20 20 54 68 69 73 20 77 69  rs too.  This wi
2dd0: 6c 6c 20 63 61 75 73 65 20 74 68 65 20 6d 61 6c  ll cause the mal
2de0: 6c 6f 63 20 74 6f 20 67 6f 0a 20 20 20 20 20 20  loc to go.      
2df0: 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73    ** back to its
2e00: 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65   default impleme
2e10: 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c  ntation when sql
2e20: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
2e30: 29 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ) is.        ** 
2e40: 72 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  run..        */.
2e50: 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26          memset(&
2e60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2e70: 66 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66  fig.m, 0, sizeof
2e80: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
2e90: 6e 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20  nfig.m));.      
2ea0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f  }else{.        /
2eb0: 2a 20 54 68 65 20 68 65 61 70 20 70 6f 69 6e 74  * The heap point
2ec0: 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  er is not NULL, 
2ed0: 74 68 65 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e 65  then install one
2ee0: 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20   of the.        
2ef0: 2a 2a 20 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63  ** mem5.c/mem3.c
2f00: 20 6d 65 74 68 6f 64 73 2e 20 49 66 20 6e 65 69   methods. If nei
2f10: 74 68 65 72 20 45 4e 41 42 4c 45 5f 4d 45 4d 53  ther ENABLE_MEMS
2f20: 59 53 33 20 6e 6f 72 0a 20 20 20 20 20 20 20 20  YS3 nor.        
2f30: 2a 2a 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  ** ENABLE_MEMSYS
2f40: 35 20 69 73 20 64 65 66 69 6e 65 64 2c 20 72 65  5 is defined, re
2f50: 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20  turn an error.. 
2f60: 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66         */.#ifdef
2f70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
2f80: 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20 73  EMSYS3.        s
2f90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2fa0: 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d  ig.m = *sqlite3M
2fb0: 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a  emGetMemsys3();.
2fc0: 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
2fd0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
2fe0: 59 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c 69  YS5.        sqli
2ff0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3000: 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  m = *sqlite3MemG
3010: 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e  etMemsys5();.#en
3020: 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  dif.      }.    
3030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
3040: 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20  endif..    case 
3050: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
3060: 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20  OKASIDE: {.     
3070: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3080: 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65  nfig.szLookaside
3090: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
30a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
30b0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c  3GlobalConfig.nL
30c0: 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72  ookaside = va_ar
30d0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
30e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
30f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
3100: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
3110: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72  _ERROR;.      br
3120: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
3130: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
3140: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
3150: 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f  ** Set up the lo
3160: 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72 73 20  okaside buffers 
3170: 66 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63  for a database c
3180: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65  onnection..** Re
3190: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
31a0: 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20  n success.  .** 
31b0: 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20  If lookaside is 
31c0: 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c 20  already active, 
31d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
31e0: 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a  SY..**.** The sz
31f0: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68   parameter is th
3200: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
3210: 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73  s in each lookas
3220: 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65  ide slot..** The
3230: 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69   cnt parameter i
3240: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
3250: 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72  slots.  If pStar
3260: 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a  t is NULL the.**
3270: 20 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c   space for the l
3280: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20  ookaside memory 
3290: 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  is obtained from
32a0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
32b0: 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20  )..** If pStart 
32c0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
32d0: 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79   it is sz*cnt by
32e0: 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f  tes of memory to
32f0: 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20   use for.** the 
3300: 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79  lookaside memory
3310: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3320: 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73  setupLookaside(s
3330: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
3340: 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20   *pBuf, int sz, 
3350: 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64  int cnt){.  void
3360: 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20   *pStart;.  if( 
3370: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f  db->lookaside.nO
3380: 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ut ){.    return
3390: 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
33a0: 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20  }.  /* Free any 
33b0: 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69  existing lookasi
33c0: 64 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68  de buffer for th
33d0: 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65  is handle before
33e0: 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67  .  ** allocating
33f0: 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65   a new one so we
3400: 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68   don't have to h
3410: 61 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20  ave space for . 
3420: 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20   ** both at the 
3430: 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a  same time..  */.
3440: 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73    if( db->lookas
3450: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b  ide.bMalloced ){
3460: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
3470: 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  e(db->lookaside.
3480: 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f  pStart);.  }.  /
3490: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20  * The size of a 
34a0: 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 6e  lookaside slot n
34b0: 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65  eeds to be large
34c0: 72 20 74 68 61 6e 20 61 20 70 6f 69 6e 74 65 72  r than a pointer
34d0: 0a 20 20 2a 2a 20 74 6f 20 62 65 20 75 73 65 66  .  ** to be usef
34e0: 75 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 73  ul..  */.  if( s
34f0: 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c  z<=(int)sizeof(L
3500: 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29  ookasideSlot*) )
3510: 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 63   sz = 0;.  if( c
3520: 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a  nt<0 ) cnt = 0;.
3530: 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63    if( sz==0 || c
3540: 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20  nt==0 ){.    sz 
3550: 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20  = 0;.    pStart 
3560: 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
3570: 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20   pBuf==0 ){.    
3580: 73 7a 20 3d 20 52 4f 55 4e 44 38 28 73 7a 29 3b  sz = ROUND8(sz);
3590: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
35a0: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
35b0: 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71  .    pStart = sq
35c0: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a  lite3Malloc( sz*
35d0: 63 6e 74 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  cnt );.    sqlit
35e0: 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f  e3EndBenignMallo
35f0: 63 28 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  c();.  }else{.  
3600: 20 20 73 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e    sz = ROUNDDOWN
3610: 38 28 73 7a 29 3b 0a 20 20 20 20 70 53 74 61 72  8(sz);.    pStar
3620: 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20 20  t = pBuf;.  }.  
3630: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
3640: 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20  tart = pStart;. 
3650: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
3660: 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Free = 0;.  db->
3670: 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28  lookaside.sz = (
3680: 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53  u16)sz;.  if( pS
3690: 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tart ){.    int 
36a0: 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  i;.    Lookaside
36b0: 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73  Slot *p;.    ass
36c0: 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73  ert( sz > (int)s
36d0: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
36e0: 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20 3d  lot*) );.    p =
36f0: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
3700: 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72  )pStart;.    for
3710: 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20  (i=cnt-1; i>=0; 
3720: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  i--){.      p->p
3730: 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  Next = db->looka
3740: 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20 20  side.pFree;.    
3750: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
3760: 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20  pFree = p;.     
3770: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
3780: 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73  lot*)&((u8*)p)[s
3790: 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  z];.    }.    db
37a0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
37b0: 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = p;.    db->lo
37c0: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
37d0: 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 1;.    db->lo
37e0: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
37f0: 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30  d = pBuf==0 ?1:0
3800: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
3810: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e  b->lookaside.pEn
3820: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
3830: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
3840: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
3850: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
3860: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ed = 0;.  }.  re
3870: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
3880: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
3890: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
38a0: 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
38b0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
38c0: 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65  .*/.sqlite3_mute
38d0: 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75  x *sqlite3_db_mu
38e0: 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29  tex(sqlite3 *db)
38f0: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d  {.  return db->m
3900: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  utex;.}../*.** C
3910: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74  onfiguration set
3920: 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e 64  tings for an ind
3930: 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73 65  ividual database
3940: 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69   connection.*/.i
3950: 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f  nt sqlite3_db_co
3960: 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62  nfig(sqlite3 *db
3970: 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a  , int op, ...){.
3980: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
3990: 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61  int rc;.  va_sta
39a0: 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
39b0: 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20  itch( op ){.    
39c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f  case SQLITE_DBCO
39d0: 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20  NFIG_LOOKASIDE: 
39e0: 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42  {.      void *pB
39f0: 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  uf = va_arg(ap, 
3a00: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 6e  void*);.      in
3a10: 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
3a20: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e  , int);.      in
3a30: 74 20 63 6e 74 20 3d 20 76 61 5f 61 72 67 28 61  t cnt = va_arg(a
3a40: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 72  p, int);.      r
3a50: 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69  c = setupLookasi
3a60: 64 65 28 64 62 2c 20 70 42 75 66 2c 20 73 7a 2c  de(db, pBuf, sz,
3a70: 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   cnt);.      bre
3a80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
3a90: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72  fault: {.      r
3aa0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
3ab0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3ac0: 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
3ad0: 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e 20  d(ap);.  return 
3ae0: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  rc;.}.../*.** Re
3af0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
3b00: 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d 31   buffer z[0..n-1
3b10: 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20 73  ] contains all s
3b20: 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  paces..*/.static
3b30: 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28 63   int allSpaces(c
3b40: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
3b50: 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20 6e  t n){.  while( n
3b60: 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 20  >0 && z[n-1]==' 
3b70: 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72 65  ' ){ n--; }.  re
3b80: 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  turn n==0;.}../*
3b90: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
3ba0: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6e  default collatin
3bb0: 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 64  g function named
3bc0: 20 22 42 49 4e 41 52 59 22 20 77 68 69 63 68 20   "BINARY" which 
3bd0: 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76 61  is always.** ava
3be0: 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  ilable..**.** If
3bf0: 20 74 68 65 20 70 61 64 46 6c 61 67 20 61 72 67   the padFlag arg
3c00: 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55 4c  ument is not NUL
3c10: 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70 61 64  L then space pad
3c20: 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64 0a  ding at the end.
3c30: 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69 73  ** of strings is
3c40: 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
3c50: 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 52  implements the R
3c60: 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e 0a  TRIM collation..
3c70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 69  */.static int bi
3c80: 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f 69  nCollFunc(.  voi
3c90: 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69 6e  d *padFlag,.  in
3ca0: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
3cb0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
3cc0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
3cd0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
3ce0: 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20 3d  int rc, n;.  n =
3cf0: 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20 6e   nKey1<nKey2 ? n
3d00: 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20 20  Key1 : nKey2;.  
3d10: 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65 79  rc = memcmp(pKey
3d20: 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20 20  1, pKey2, n);.  
3d30: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
3d40: 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20 20   if( padFlag.   
3d50: 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28    && allSpaces((
3d60: 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e 2c  (char*)pKey1)+n,
3d70: 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20 26   nKey1-n).     &
3d80: 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63 68  & allSpaces(((ch
3d90: 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e 4b  ar*)pKey2)+n, nK
3da0: 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20 20  ey2-n).    ){.  
3db0: 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63 20      /* Leave rc 
3dc0: 75 6e 63 68 61 6e 67 65 64 20 61 74 20 30 20 2a  unchanged at 0 *
3dd0: 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  /.    }else{.   
3de0: 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d 20     rc = nKey1 - 
3df0: 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20 7d  nKey2;.    }.  }
3e00: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
3e10: 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20 62  ./*.** Another b
3e20: 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69 6e  uilt-in collatin
3e30: 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43 41  g sequence: NOCA
3e40: 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  SE. .**.** This 
3e50: 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e  collating sequen
3e60: 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20 74  ce is intended t
3e70: 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 22 63  o be used for "c
3e80: 61 73 65 20 69 6e 64 65 70 65 6e 64 61 6e 74 0a  ase independant.
3e90: 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e 20  ** comparison". 
3ea0: 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65 64  SQLite's knowled
3eb0: 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64 20  ge of upper and 
3ec0: 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69 76  lower case equiv
3ed0: 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e 64  alents.** extend
3ee0: 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32 36  s only to the 26
3ef0: 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65 64   characters used
3f00: 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68 20   in the English 
3f10: 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  language..**.** 
3f20: 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74 68  At the moment th
3f30: 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55 54  ere is only a UT
3f40: 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  F-8 implementati
3f50: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
3f60: 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e  t nocaseCollatin
3f70: 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 4e  gFunc(.  void *N
3f80: 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e 4b  otUsed,.  int nK
3f90: 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey1, const void 
3fa0: 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b  *pKey1,.  int nK
3fb0: 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  ey2, const void 
3fc0: 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20  *pKey2.){.  int 
3fd0: 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e 49  r = sqlite3StrNI
3fe0: 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e 73  Cmp(.      (cons
3ff0: 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c 20  t char *)pKey1, 
4000: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b  (const char *)pK
4010: 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65 79  ey2, (nKey1<nKey
4020: 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29 3b  2)?nKey1:nKey2);
4030: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
4040: 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20  TER(NotUsed);.  
4050: 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20 20  if( 0==r ){.    
4060: 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32 3b  r = nKey1-nKey2;
4070: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 3b  .  }.  return r;
4080: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4090: 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74 68   the ROWID of th
40a0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69 6e  e most recent in
40b0: 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f 69  sert.*/.sqlite_i
40c0: 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61 73  nt64 sqlite3_las
40d0: 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28 73  t_insert_rowid(s
40e0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
40f0: 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73 74 52 6f  eturn db->lastRo
4100: 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  wid;.}../*.** Re
4110: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
4120: 6f 66 20 63 68 61 6e 67 65 73 20 69 6e 20 74 68  of changes in th
4130: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 61  e most recent ca
4140: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 65 78  ll to sqlite3_ex
4150: 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ec()..*/.int sql
4160: 69 74 65 33 5f 63 68 61 6e 67 65 73 28 73 71 6c  ite3_changes(sql
4170: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65 74  ite3 *db){.  ret
4180: 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e 67 65 3b  urn db->nChange;
4190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
41a0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
41b0: 68 61 6e 67 65 73 20 73 69 6e 63 65 20 74 68 65  hanges since the
41c0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
41d0: 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a   was opened..*/.
41e0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 6f 74 61  int sqlite3_tota
41f0: 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c 69 74 65  l_changes(sqlite
4200: 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
4210: 20 64 62 2d 3e 6e 54 6f 74 61 6c 43 68 61 6e 67   db->nTotalChang
4220: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  e;.}../*.** Clos
4230: 65 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76 65 70  e all open savep
4240: 6f 69 6e 74 73 2e 20 54 68 69 73 20 66 75 6e 63  oints. This func
4250: 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61 6e 69 70 75  tion only manipu
4260: 6c 61 74 65 73 20 66 69 65 6c 64 73 20 6f 66 20  lates fields of 
4270: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
4280: 68 61 6e 64 6c 65 20 6f 62 6a 65 63 74 2c 20 69  handle object, i
4290: 74 20 64 6f 65 73 20 6e 6f 74 20 63 6c 6f 73 65  t does not close
42a0: 20 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20   any savepoints 
42b0: 74 68 61 74 20 6d 61 79 20 62 65 20 6f 70 65 6e  that may be open
42c0: 0a 2a 2a 20 61 74 20 74 68 65 20 62 2d 74 72 65  .** at the b-tre
42d0: 65 2f 70 61 67 65 72 20 6c 65 76 65 6c 2e 0a 2a  e/pager level..*
42e0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 43 6c  /.void sqlite3Cl
42f0: 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 73 71  oseSavepoints(sq
4300: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 77 68  lite3 *db){.  wh
4310: 69 6c 65 28 20 64 62 2d 3e 70 53 61 76 65 70 6f  ile( db->pSavepo
4320: 69 6e 74 20 29 7b 0a 20 20 20 20 53 61 76 65 70  int ){.    Savep
4330: 6f 69 6e 74 20 2a 70 54 6d 70 20 3d 20 64 62 2d  oint *pTmp = db-
4340: 3e 70 53 61 76 65 70 6f 69 6e 74 3b 0a 20 20 20  >pSavepoint;.   
4350: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
4360: 3d 20 70 54 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20  = pTmp->pNext;. 
4370: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
4380: 28 64 62 2c 20 70 54 6d 70 29 3b 0a 20 20 7d 0a  (db, pTmp);.  }.
4390: 20 20 64 62 2d 3e 6e 53 61 76 65 70 6f 69 6e 74    db->nSavepoint
43a0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 6e 53 74 61   = 0;.  db->nSta
43b0: 74 65 6d 65 6e 74 20 3d 20 30 3b 0a 20 20 64 62  tement = 0;.  db
43c0: 2d 3e 69 73 54 72 61 6e 73 61 63 74 69 6f 6e 53  ->isTransactionS
43d0: 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a  avepoint = 0;.}.
43e0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
43f0: 65 78 69 73 74 69 6e 67 20 53 51 4c 69 74 65 20  existing SQLite 
4400: 64 61 74 61 62 61 73 65 0a 2a 2f 0a 69 6e 74 20  database.*/.int 
4410: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71  sqlite3_close(sq
4420: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 48 61  lite3 *db){.  Ha
4430: 73 68 45 6c 65 6d 20 2a 69 3b 0a 20 20 69 6e 74  shElem *i;.  int
4440: 20 6a 3b 0a 0a 20 20 69 66 28 20 21 64 62 20 29   j;..  if( !db )
4450: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
4460: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
4470: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
4480: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
4490: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
44a0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
44b0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
44c0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
44d0: 65 78 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 52  ex);..  sqlite3R
44e0: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
44f0: 6d 61 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a  ma(db, 0);..  /*
4500: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
4510: 6e 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 20 52  n is open, the R
4520: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
4530: 6d 61 28 29 20 63 61 6c 6c 20 61 62 6f 76 65 0a  ma() call above.
4540: 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 68 61    ** will not ha
4550: 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20 78 44  ve called the xD
4560: 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65 74 68  isconnect() meth
4570: 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74 75 61  od on any virtua
4580: 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20 69 6e  l.  ** tables in
4590: 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61 6e 73   the db->aVTrans
45a0: 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20 66 6f  [] array. The fo
45b0: 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65 33 56  llowing sqlite3V
45c0: 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a 20 20  tabRollback().  
45d0: 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64 6f 20  ** call will do 
45e0: 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f 20 64  so. We need to d
45f0: 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20 74 68  o this before th
4600: 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63 74 69  e check for acti
4610: 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74 61 74  ve.  ** SQL stat
4620: 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20 61 73  ements below, as
4630: 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69 6d 70   the v-table imp
4640: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61 79 20  lementation may 
4650: 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a 2a 20  be storing.  ** 
4660: 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20 73 74  some prepared st
4670: 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72 6e 61  atements interna
4680: 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  lly..  */.  sqli
4690: 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28  te3VtabRollback(
46a0: 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  db);..  /* If th
46b0: 65 72 65 20 61 72 65 20 61 6e 79 20 6f 75 74 73  ere are any outs
46c0: 74 61 6e 64 69 6e 67 20 56 4d 73 2c 20 72 65 74  tanding VMs, ret
46d0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
46e0: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 56   */.  if( db->pV
46f0: 64 62 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  dbe ){.    sqlit
4700: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
4710: 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20  TE_BUSY, .      
4720: 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f    "unable to clo
4730: 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61  se due to unfina
4740: 6c 69 73 65 64 20 73 74 61 74 65 6d 65 6e 74 73  lised statements
4750: 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ");.    sqlite3_
4760: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
4770: 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75  mutex);.    retu
4780: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
4790: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 73 71    }.  assert( sq
47a0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
47b0: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 3b 0a  SickOrOk(db) );.
47c0: 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62  .  for(j=0; j<db
47d0: 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ->nDb; j++){.   
47e0: 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62   Btree *pBt = db
47f0: 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20  ->aDb[j].pBt;.  
4800: 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71 6c    if( pBt && sql
4810: 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61 63  ite3BtreeIsInBac
4820: 6b 75 70 28 70 42 74 29 20 29 7b 0a 20 20 20 20  kup(pBt) ){.    
4830: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
4840: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
4850: 0a 20 20 20 20 20 20 20 20 20 20 22 75 6e 61 62  .          "unab
4860: 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20  le to close due 
4870: 74 6f 20 75 6e 66 69 6e 69 73 68 65 64 20 62 61  to unfinished ba
4880: 63 6b 75 70 20 6f 70 65 72 61 74 69 6f 6e 22 29  ckup operation")
4890: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
48a0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
48b0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 72 65  mutex);.      re
48c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
48d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
48e0: 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74  * Free any outst
48f0: 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74  anding Savepoint
4900: 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a   structures. */.
4910: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
4920: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20  vepoints(db);.. 
4930: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e   for(j=0; j<db->
4940: 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73  nDb; j++){.    s
4950: 74 72 75 63 74 20 44 62 20 2a 70 44 62 20 3d 20  truct Db *pDb = 
4960: 26 64 62 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20  &db->aDb[j];.   
4970: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 20 29 7b   if( pDb->pBt ){
4980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
4990: 72 65 65 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42  reeClose(pDb->pB
49a0: 74 29 3b 0a 20 20 20 20 20 20 70 44 62 2d 3e 70  t);.      pDb->p
49b0: 42 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  Bt = 0;.      if
49c0: 28 20 6a 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ( j!=1 ){.      
49d0: 20 20 70 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d    pDb->pSchema =
49e0: 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
49f0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
4a00: 65 73 65 74 49 6e 74 65 72 6e 61 6c 53 63 68 65  esetInternalSche
4a10: 6d 61 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f 2a  ma(db, 0);..  /*
4a20: 20 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69   Tell the code i
4a30: 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20  n notify.c that 
4a40: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e  the connection n
4a50: 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61  o longer holds a
4a60: 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e  ny.  ** locks an
4a70: 64 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  d does not requi
4a80: 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 20 75  re any further u
4a90: 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c  nlock-notify cal
4aa0: 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73  lbacks..  */.  s
4ab0: 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e  qlite3Connection
4ac0: 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 61  Closed(db);..  a
4ad0: 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d  ssert( db->nDb<=
4ae0: 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  2 );.  assert( d
4af0: 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53  b->aDb==db->aDbS
4b00: 74 61 74 69 63 20 29 3b 0a 20 20 66 6f 72 28 6a  tatic );.  for(j
4b10: 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  =0; j<ArraySize(
4b20: 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a 2b  db->aFunc.a); j+
4b30: 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66 20  +){.    FuncDef 
4b40: 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c 20  *pNext, *pHash, 
4b50: 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64 62  *p;.    for(p=db
4b60: 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70 3b  ->aFunc.a[j]; p;
4b70: 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20 20 20   p=pHash){.     
4b80: 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61 73   pHash = p->pHas
4b90: 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  h;.      while( 
4ba0: 70 20 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65  p ){.        pNe
4bb0: 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20  xt = p->pNext;. 
4bc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 62         sqlite3Db
4bd0: 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20 20  Free(db, p);.   
4be0: 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b 0a       p = pNext;.
4bf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4c00: 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  }.  for(i=sqlite
4c10: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
4c20: 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d 73  CollSeq); i; i=s
4c30: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
4c40: 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  ){.    CollSeq *
4c50: 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65 71  pColl = (CollSeq
4c60: 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74   *)sqliteHashDat
4c70: 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e 76  a(i);.    /* Inv
4c80: 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63 74  oke any destruct
4c90: 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20 66  ors registered f
4ca0: 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  or collation seq
4cb0: 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61 2e  uence user data.
4cc0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b   */.    for(j=0;
4cd0: 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<3; j++){.    
4ce0: 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e 78    if( pColl[j].x
4cf0: 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 70  Del ){.        p
4d00: 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43 6f  Coll[j].xDel(pCo
4d10: 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20 20  ll[j].pUser);.  
4d20: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
4d30: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
4d40: 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20 20  , pColl);.  }.  
4d50: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
4d60: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
4d70: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
4d80: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
4d90: 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74 65  E.  for(i=sqlite
4da0: 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e 61  HashFirst(&db->a
4db0: 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73 71  Module); i; i=sq
4dc0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29 29  liteHashNext(i))
4dd0: 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70 4d  {.    Module *pM
4de0: 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29 73  od = (Module *)s
4df0: 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69 29  qliteHashData(i)
4e00: 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d 3e  ;.    if( pMod->
4e10: 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20 20  xDestroy ){.    
4e20: 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79    pMod->xDestroy
4e30: 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20 20  (pMod->pAux);.  
4e40: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44    }.    sqlite3D
4e50: 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29 3b  bFree(db, pMod);
4e60: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
4e70: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d 6f  shClear(&db->aMo
4e80: 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  dule);.#endif.. 
4e90: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
4ea0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
4eb0: 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20   /* Deallocates 
4ec0: 61 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f 72  any cached error
4ed0: 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 69   strings. */.  i
4ee0: 66 28 20 64 62 2d 3e 70 45 72 72 20 29 7b 0a 20  f( db->pErr ){. 
4ef0: 20 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46     sqlite3ValueF
4f00: 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  ree(db->pErr);. 
4f10: 20 7d 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73   }.  sqlite3Clos
4f20: 65 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b  eExtensions(db);
4f30: 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ..  db->magic = 
4f40: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45 52 52  SQLITE_MAGIC_ERR
4f50: 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 74 65  OR;..  /* The te
4f60: 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63 68 65  mp-database sche
4f70: 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20  ma is allocated 
4f80: 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72 6f 6d  differently from
4f90: 20 74 68 65 20 6f 74 68 65 72 20 73 63 68 65 6d   the other schem
4fa0: 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20 28  a.  ** objects (
4fb0: 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61 6c 6c  using sqliteMall
4fc0: 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c 20 69  oc() directly, i
4fd0: 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69 74 65  nstead of sqlite
4fe0: 33 42 74 72 65 65 53 63 68 65 6d 61 28 29 29 2e  3BtreeSchema()).
4ff0: 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65 65 64  .  ** So it need
5000: 73 20 74 6f 20 62 65 20 66 72 65 65 64 20 68 65  s to be freed he
5010: 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20 6e 6f  re. Todo: Why no
5020: 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d 70 20  t roll the temp 
5030: 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20 2a 2a  schema into.  **
5040: 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69 74 65   the same sqlite
5050: 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68 65 20  Malloc() as the 
5060: 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63 61 74  one that allocat
5070: 65 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  es the database 
5080: 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72 65 3f  .  ** structure?
5090: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 44  .  */.  sqlite3D
50a0: 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e 61 44  bFree(db, db->aD
50b0: 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20  b[1].pSchema);. 
50c0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
50d0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
50e0: 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
50f0: 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c 4f 53  QLITE_MAGIC_CLOS
5100: 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ED;.  sqlite3_mu
5110: 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d 75 74  tex_free(db->mut
5120: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  ex);.  assert( d
5130: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
5140: 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61 69 6c  t==0 );  /* Fail
5150: 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69 64 65  s on a lookaside
5160: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a 2f 0a   memory leak */.
5170: 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73    if( db->lookas
5180: 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b  ide.bMalloced ){
5190: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
51a0: 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  e(db->lookaside.
51b0: 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 73  pStart);.  }.  s
51c0: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b  qlite3_free(db);
51d0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
51e0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f  _OK;.}../*.** Ro
51f0: 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62  llback all datab
5200: 61 73 65 20 66 69 6c 65 73 2e 0a 2a 2f 0a 76 6f  ase files..*/.vo
5210: 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
5220: 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  ckAll(sqlite3 *d
5230: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  b){.  int i;.  i
5240: 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a  nt inTrans = 0;.
5250: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
5260: 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d  3_mutex_held(db-
5270: 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c  >mutex) );.  sql
5280: 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
5290: 61 6c 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69  alloc();.  for(i
52a0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
52b0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  ++){.    if( db-
52c0: 3e 61 44 62 5b 69 5d 2e 70 42 74 20 29 7b 0a 20  >aDb[i].pBt ){. 
52d0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
52e0: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 64  BtreeIsInTrans(d
52f0: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 29 20 29  b->aDb[i].pBt) )
5300: 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e  {.        inTran
5310: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 1;.      }. 
5320: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
5330: 65 52 6f 6c 6c 62 61 63 6b 28 64 62 2d 3e 61 44  eRollback(db->aD
5340: 62 5b 69 5d 2e 70 42 74 29 3b 0a 20 20 20 20 20  b[i].pBt);.     
5350: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72   db->aDb[i].inTr
5360: 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ans = 0;.    }. 
5370: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
5380: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20  Rollback(db);.  
5390: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
53a0: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28  Malloc();..  if(
53b0: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
53c0: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
53d0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
53e0: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
53f0: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
5400: 73 71 6c 69 74 65 33 52 65 73 65 74 49 6e 74 65  sqlite3ResetInte
5410: 72 6e 61 6c 53 63 68 65 6d 61 28 64 62 2c 20 30  rnalSchema(db, 0
5420: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
5430: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  one has been con
5440: 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20  figured, invoke 
5450: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f  the rollback-hoo
5460: 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  k callback */.  
5470: 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  if( db->xRollbac
5480: 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e  kCallback && (in
5490: 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75  Trans || !db->au
54a0: 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20  toCommit) ){.   
54b0: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
54c0: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c  llback(db->pRoll
54d0: 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a  backArg);.  }.}.
54e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
54f0: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68  static string th
5500: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
5510: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
5520: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
5530: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
5540: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
5550: 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63  te3ErrStr(int rc
5560: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
5570: 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d  t char* const aM
5580: 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  sg[] = {.    /* 
5590: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
55a0: 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72     */ "not an er
55b0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
55c0: 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20  ITE_ERROR       
55d0: 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72  */ "SQL logic er
55e0: 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64  ror or missing d
55f0: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
5600: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
5610: 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a      */ 0,.    /*
5620: 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20   SQLITE_PERM    
5630: 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70      */ "access p
5640: 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64  ermission denied
5650: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
5660: 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20  _ABORT       */ 
5670: 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73  "callback reques
5680: 74 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22  ted query abort"
5690: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
56a0: 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22  BUSY        */ "
56b0: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
56c0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
56d0: 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a  TE_LOCKED      *
56e0: 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62 6c  / "database tabl
56f0: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
5700: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45    /* SQLITE_NOME
5710: 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20  M       */ "out 
5720: 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20  of memory",.    
5730: 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  /* SQLITE_READON
5740: 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70  LY    */ "attemp
5750: 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61  t to write a rea
5760: 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c  donly database",
5770: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
5780: 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69  NTERRUPT   */ "i
5790: 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20  nterrupted",.   
57a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   /* SQLITE_IOERR
57b0: 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20         */ "disk 
57c0: 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  I/O error",.    
57d0: 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  /* SQLITE_CORRUP
57e0: 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61  T     */ "databa
57f0: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
5800: 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20   malformed",.   
5810: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   /* SQLITE_NOTFO
5820: 55 4e 44 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20  UND    */ 0,.   
5830: 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20   /* SQLITE_FULL 
5840: 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62         */ "datab
5850: 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73 20 66  ase or disk is f
5860: 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ull",.    /* SQL
5870: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20 20 20  ITE_CANTOPEN    
5880: 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20 6f 70  */ "unable to op
5890: 65 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  en database file
58a0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
58b0: 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a 2f 20  _PROTOCOL    */ 
58c0: 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  0,.    /* SQLITE
58d0: 5f 45 4d 50 54 59 20 20 20 20 20 20 20 2a 2f 20  _EMPTY       */ 
58e0: 22 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20  "table contains 
58f0: 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a  no data",.    /*
5900: 20 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 20 20   SQLITE_SCHEMA  
5910: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
5920: 20 73 63 68 65 6d 61 20 68 61 73 20 63 68 61 6e   schema has chan
5930: 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ged",.    /* SQL
5940: 49 54 45 5f 54 4f 4f 42 49 47 20 20 20 20 20 20  ITE_TOOBIG      
5950: 2a 2f 20 22 53 74 72 69 6e 67 20 6f 72 20 42 4c  */ "String or BL
5960: 4f 42 20 65 78 63 65 65 64 65 64 20 73 69 7a 65  OB exceeded size
5970: 20 6c 69 6d 69 74 22 2c 0a 20 20 20 20 2f 2a 20   limit",.    /* 
5980: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
5990: 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e  T  */ "constrain
59a0: 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f  t failed",.    /
59b0: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  * SQLITE_MISMATC
59c0: 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70  H    */ "datatyp
59d0: 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20  e mismatch",.   
59e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53   /* SQLITE_MISUS
59f0: 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61  E      */ "libra
5a00: 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65  ry routine calle
5a10: 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63  d out of sequenc
5a20: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
5a30: 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f  E_NOLFS       */
5a40: 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70   "large file sup
5a50: 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64  port is disabled
5a60: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
5a70: 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20  _AUTH        */ 
5a80: 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64  "authorization d
5a90: 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  enied",.    /* S
5aa0: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20  QLITE_FORMAT    
5ab0: 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20    */ "auxiliary 
5ac0: 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20  database format 
5ad0: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
5ae0: 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20  QLITE_RANGE     
5af0: 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f    */ "bind or co
5b00: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f  lumn index out o
5b10: 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a  f range",.    /*
5b20: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20   SQLITE_NOTADB  
5b30: 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20      */ "file is 
5b40: 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73 20  encrypted or is 
5b50: 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 2c  not a database",
5b60: 0a 20 20 7d 3b 0a 20 20 72 63 20 26 3d 20 30 78  .  };.  rc &= 0x
5b70: 66 66 3b 0a 20 20 69 66 28 20 41 4c 57 41 59 53  ff;.  if( ALWAYS
5b80: 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 28 69  (rc>=0) && rc<(i
5b90: 6e 74 29 28 73 69 7a 65 6f 66 28 61 4d 73 67 29  nt)(sizeof(aMsg)
5ba0: 2f 73 69 7a 65 6f 66 28 61 4d 73 67 5b 30 5d 29  /sizeof(aMsg[0])
5bb0: 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30  ) && aMsg[rc]!=0
5bc0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   ){.    return a
5bd0: 4d 73 67 5b 72 63 5d 3b 0a 20 20 7d 65 6c 73 65  Msg[rc];.  }else
5be0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 22 75 6e  {.    return "un
5bf0: 6b 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20  known error";.  
5c00: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
5c10: 72 6f 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e  routine implemen
5c20: 74 73 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61  ts a busy callba
5c30: 63 6b 20 74 68 61 74 20 73 6c 65 65 70 73 20 61  ck that sleeps a
5c40: 6e 64 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69  nd tries.** agai
5c50: 6e 20 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75  n until a timeou
5c60: 74 20 76 61 6c 75 65 20 69 73 20 72 65 61 63 68  t value is reach
5c70: 65 64 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74  ed.  The timeout
5c80: 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20   value is.** an 
5c90: 69 6e 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f  integer number o
5ca0: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70  f milliseconds p
5cb0: 61 73 73 65 64 20 69 6e 20 61 73 20 74 68 65 20  assed in as the 
5cc0: 66 69 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e  first.** argumen
5cd0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
5ce0: 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75   sqliteDefaultBu
5cf0: 73 79 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69  syCallback(. voi
5d00: 64 20 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20  d *ptr,         
5d10: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
5d20: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
5d30: 20 69 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20   int count      
5d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
5d50: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62  ber of times tab
5d60: 6c 65 20 68 61 73 20 62 65 65 6e 20 62 75 73 79  le has been busy
5d70: 20 2a 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54   */.){.#if SQLIT
5d80: 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20 28 64 65 66  E_OS_WIN || (def
5d90: 69 6e 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50  ined(HAVE_USLEEP
5da0: 29 20 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50  ) && HAVE_USLEEP
5db0: 29 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ).  static const
5dc0: 20 75 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20   u8 delays[] =. 
5dd0: 20 20 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31      { 1, 2, 5, 1
5de0: 30 2c 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32  0, 15, 20, 25, 2
5df0: 35 2c 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30  5,  25,  50,  50
5e00: 2c 20 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69  , 100 };.  stati
5e10: 63 20 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c  c const u8 total
5e20: 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20  s[] =.     { 0, 
5e30: 31 2c 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33  1, 3,  8, 18, 33
5e40: 2c 20 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31  , 53, 78, 103, 1
5e50: 32 38 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a  28, 178, 228 };.
5e60: 23 20 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20  # define NDELAY 
5e70: 28 73 69 7a 65 6f 66 28 64 65 6c 61 79 73 29 2f  (sizeof(delays)/
5e80: 73 69 7a 65 6f 66 28 64 65 6c 61 79 73 5b 30 5d  sizeof(delays[0]
5e90: 29 29 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  )).  sqlite3 *db
5ea0: 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74   = (sqlite3 *)pt
5eb0: 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74  r;.  int timeout
5ec0: 20 3d 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f   = db->busyTimeo
5ed0: 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c  ut;.  int delay,
5ee0: 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72   prior;..  asser
5ef0: 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20  t( count>=0 );. 
5f00: 20 69 66 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45   if( count < NDE
5f10: 4c 41 59 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  LAY ){.    delay
5f20: 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d   = delays[count]
5f30: 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f  ;.    prior = to
5f40: 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d  tals[count];.  }
5f50: 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c 61 79 20  else{.    delay 
5f60: 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d  = delays[NDELAY-
5f70: 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d 20  1];.    prior = 
5f80: 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d  totals[NDELAY-1]
5f90: 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d   + delay*(count-
5fa0: 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d  (NDELAY-1));.  }
5fb0: 0a 20 20 69 66 28 20 70 72 69 6f 72 20 2b 20 64  .  if( prior + d
5fc0: 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75 74 20 29  elay > timeout )
5fd0: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 74 69  {.    delay = ti
5fe0: 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20  meout - prior;. 
5ff0: 20 20 20 69 66 28 20 64 65 6c 61 79 3c 3d 30 20     if( delay<=0 
6000: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
6010: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
6020: 28 64 62 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79  (db->pVfs, delay
6030: 2a 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e  *1000);.  return
6040: 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69   1;.#else.  sqli
6050: 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74  te3 *db = (sqlit
6060: 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20  e3 *)ptr;.  int 
6070: 74 69 6d 65 6f 75 74 20 3d 20 28 28 73 71 6c 69  timeout = ((sqli
6080: 74 65 33 20 2a 29 70 74 72 29 2d 3e 62 75 73 79  te3 *)ptr)->busy
6090: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66 28 20 28  Timeout;.  if( (
60a0: 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20  count+1)*1000 > 
60b0: 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 72  timeout ){.    r
60c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
60d0: 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62  qlite3OsSleep(db
60e0: 2d 3e 70 56 66 73 2c 20 31 30 30 30 30 30 30 29  ->pVfs, 1000000)
60f0: 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65  ;.  return 1;.#e
6100: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ndif.}../*.** In
6110: 76 6f 6b 65 20 74 68 65 20 67 69 76 65 6e 20 62  voke the given b
6120: 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a  usy handler..**.
6130: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6140: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
6150: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c  n operation fail
6160: 65 64 20 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a  ed with a lock..
6170: 2a 2a 20 49 66 20 74 68 69 73 20 72 6f 75 74 69  ** If this routi
6180: 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  ne returns non-z
6190: 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73  ero, the lock is
61a0: 20 72 65 74 72 69 65 64 2e 20 20 49 66 20 69 74   retried.  If it
61b0: 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30 2c 20 74  .** returns 0, t
61c0: 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f  he operation abo
61d0: 72 74 73 20 77 69 74 68 20 61 6e 20 53 51 4c 49  rts with an SQLI
61e0: 54 45 5f 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a  TE_BUSY error..*
61f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 76  /.int sqlite3Inv
6200: 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 42  okeBusyHandler(B
6210: 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a  usyHandler *p){.
6220: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20    int rc;.  if( 
6230: 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70  NEVER(p==0) || p
6240: 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d  ->xFunc==0 || p-
6250: 3e 6e 42 75 73 79 3c 30 20 29 20 72 65 74 75 72  >nBusy<0 ) retur
6260: 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78  n 0;.  rc = p->x
6270: 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d  Func(p->pArg, p-
6280: 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66 28 20 72  >nBusy);.  if( r
6290: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  c==0 ){.    p->n
62a0: 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c  Busy = -1;.  }el
62b0: 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79  se{.    p->nBusy
62c0: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
62d0: 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54   rc; .}../*.** T
62e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
62f0: 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
6300: 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65  ck for an Sqlite
6310: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
6320: 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  .** given callba
6330: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ck function with
6340: 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d   the given argum
6350: 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
6360: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
6370: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
6380: 0a 20 20 69 6e 74 20 28 2a 78 42 75 73 79 29 28  .  int (*xBusy)(
6390: 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f  void*,int),.  vo
63a0: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71  id *pArg.){.  sq
63b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
63c0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
63d0: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
63e0: 78 46 75 6e 63 20 3d 20 78 42 75 73 79 3b 0a 20  xFunc = xBusy;. 
63f0: 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72   db->busyHandler
6400: 2e 70 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  .pArg = pArg;.  
6410: 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e  db->busyHandler.
6420: 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20 73 71 6c  nBusy = 0;.  sql
6430: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6440: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
6450: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
6460: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
6470: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
6480: 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20  _CALLBACK./*.** 
6490: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
64a0: 73 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63  s the progress c
64b0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
64c0: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
64d0: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
64e0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
64f0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
6500: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72  argument. The pr
6510: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
6520: 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  will.** be invok
6530: 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70  ed every nOps op
6540: 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  codes..*/.void s
6550: 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
6560: 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74  handler(.  sqlit
6570: 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e  e3 *db, .  int n
6580: 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72  Ops,.  int (*xPr
6590: 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20  ogress)(void*), 
65a0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
65b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
65c0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
65d0: 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20  );.  if( nOps>0 
65e0: 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67  ){.    db->xProg
65f0: 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73  ress = xProgress
6600: 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72  ;.    db->nProgr
6610: 65 73 73 4f 70 73 20 3d 20 6e 4f 70 73 3b 0a 20  essOps = nOps;. 
6620: 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73     db->pProgress
6630: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65  Arg = pArg;.  }e
6640: 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72  lse{.    db->xPr
6650: 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20  ogress = 0;.    
6660: 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73  db->nProgressOps
6670: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50   = 0;.    db->pP
6680: 72 6f 67 72 65 73 73 41 72 67 20 3d 20 30 3b 0a  rogressArg = 0;.
6690: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
66a0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
66b0: 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  tex);.}.#endif..
66c0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
66d0: 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20 61 20 64  ine installs a d
66e0: 65 66 61 75 6c 74 20 62 75 73 79 20 68 61 6e 64  efault busy hand
66f0: 6c 65 72 20 74 68 61 74 20 77 61 69 74 73 20 66  ler that waits f
6700: 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65 63 69 66  or the.** specif
6710: 69 65 64 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69  ied number of mi
6720: 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65 66 6f 72  lliseconds befor
6730: 65 20 72 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a  e returning 0..*
6740: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75  /.int sqlite3_bu
6750: 73 79 5f 74 69 6d 65 6f 75 74 28 73 71 6c 69 74  sy_timeout(sqlit
6760: 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b  e3 *db, int ms){
6770: 0a 20 20 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20  .  if( ms>0 ){. 
6780: 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f     db->busyTimeo
6790: 75 74 20 3d 20 6d 73 3b 0a 20 20 20 20 73 71 6c  ut = ms;.    sql
67a0: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
67b0: 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65 66 61  r(db, sqliteDefa
67c0: 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c  ultBusyCallback,
67d0: 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 7d   (void*)db);.  }
67e0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
67f0: 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64  3_busy_handler(d
6800: 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  b, 0, 0);.  }.  
6810: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6820: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65  ;.}../*.** Cause
6830: 20 61 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65   any pending ope
6840: 72 61 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61  ration to stop a
6850: 74 20 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f  t its earliest o
6860: 70 70 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76  pportunity..*/.v
6870: 6f 69 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65  oid sqlite3_inte
6880: 72 72 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64  rrupt(sqlite3 *d
6890: 62 29 7b 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49  b){.  db->u1.isI
68a0: 6e 74 65 72 72 75 70 74 65 64 20 3d 20 31 3b 0a  nterrupted = 1;.
68b0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
68c0: 75 6e 63 74 69 6f 6e 20 69 73 20 65 78 61 63 74  unction is exact
68d0: 6c 79 20 74 68 65 20 73 61 6d 65 20 61 73 20 73  ly the same as s
68e0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
68f0: 6e 63 74 69 6f 6e 28 29 2c 20 65 78 63 65 70 74  nction(), except
6900: 0a 2a 2a 20 74 68 61 74 20 69 74 20 69 73 20 64  .** that it is d
6910: 65 73 69 67 6e 65 64 20 74 6f 20 62 65 20 63 61  esigned to be ca
6920: 6c 6c 65 64 20 62 79 20 69 6e 74 65 72 6e 61 6c  lled by internal
6930: 20 63 6f 64 65 2e 20 54 68 65 20 64 69 66 66 65   code. The diffe
6940: 72 65 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61 74  rence is.** that
6950: 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66   if a malloc() f
6960: 61 69 6c 73 20 69 6e 20 73 71 6c 69 74 65 33 5f  ails in sqlite3_
6970: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
6980: 29 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  ), an error code
6990: 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20  .** is returned 
69a0: 61 6e 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61  and the mallocFa
69b0: 69 6c 65 64 20 66 6c 61 67 20 63 6c 65 61 72 65  iled flag cleare
69c0: 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  d. .*/.int sqlit
69d0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 0a 20 20  e3CreateFunc(.  
69e0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
69f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
6a00: 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20  tionName,.  int 
6a10: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
6a20: 0a 20 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61  .  void *pUserDa
6a30: 74 61 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  ta,.  void (*xFu
6a40: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
6a50: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
6a60: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
6a70: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
6a80: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
6a90: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
6aa0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
6ab0: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
6ac0: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 46 75 6e 63  text*).){.  Func
6ad0: 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e  Def *p;.  int nN
6ae0: 61 6d 65 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ame;..  assert( 
6af0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6b00: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
6b10: 0a 20 20 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e  .  if( zFunction
6b20: 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20  Name==0 ||.     
6b30: 20 28 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e   (xFunc && (xFin
6b40: 61 6c 20 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c  al || xStep)) ||
6b50: 20 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20   .      (!xFunc 
6b60: 26 26 20 28 78 46 69 6e 61 6c 20 26 26 20 21 78  && (xFinal && !x
6b70: 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20  Step)) ||.      
6b80: 28 21 78 46 75 6e 63 20 26 26 20 28 21 78 46 69  (!xFunc && (!xFi
6b90: 6e 61 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c  nal && xStep)) |
6ba0: 7c 0a 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31  |.      (nArg<-1
6bb0: 20 7c 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f   || nArg>SQLITE_
6bc0: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
6bd0: 29 20 7c 7c 0a 20 20 20 20 20 20 28 32 35 35 3c  ) ||.      (255<
6be0: 28 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  (nName = sqlite3
6bf0: 53 74 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74  Strlen30( zFunct
6c00: 69 6f 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20  ionName))) ){.  
6c10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6c20: 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20 20 0a 23  MISUSE;.  }.  .#
6c30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6c40: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66  IT_UTF16.  /* If
6c50: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
6c60: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
6c70: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
6c80: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
6c90: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
6ca0: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
6cb0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
6cc0: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
6cd0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
6ce0: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
6cf0: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
6d00: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
6d10: 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54  **.  ** If SQLIT
6d20: 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69  E_ANY is specifi
6d30: 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65  ed, add three ve
6d40: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75  rsions of the fu
6d50: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74  nction.  ** to t
6d60: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  he hash table.. 
6d70: 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53   */.  if( enc==S
6d80: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20  QLITE_UTF16 ){. 
6d90: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
6da0: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
6db0: 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51  else if( enc==SQ
6dc0: 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20  LITE_ANY ){.    
6dd0: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
6de0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
6df0: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
6e00: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
6e10: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
6e20: 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46 75    pUserData, xFu
6e30: 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61  nc, xStep, xFina
6e40: 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  l);.    if( rc==
6e50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6e60: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43     rc = sqlite3C
6e70: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
6e80: 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72  unctionName, nAr
6e90: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  g, SQLITE_UTF16L
6ea0: 45 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55 73  E,.          pUs
6eb0: 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78  erData, xFunc, x
6ec0: 53 74 65 70 2c 20 78 46 69 6e 61 6c 29 3b 0a 20  Step, xFinal);. 
6ed0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
6ee0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6ef0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
6f00: 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53     }.    enc = S
6f10: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20  QLITE_UTF16BE;. 
6f20: 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d   }.#else.  enc =
6f30: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
6f40: 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65  ndif.  .  /* Che
6f50: 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ck if an existin
6f60: 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  g function is be
6f70: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f  ing overridden o
6f80: 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f  r deleted. If so
6f90: 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65  ,.  ** and there
6fa0: 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c   are active VMs,
6fb0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   then return SQL
6fc0: 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66  ITE_BUSY. If a f
6fd0: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
6fe0: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
6ff0: 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68 65  /deleted but the
7000: 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  re are no active
7010: 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a   VMs, allow the.
7020: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74    ** operation t
7030: 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69  o continue but i
7040: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
7050: 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  ecompiled statem
7060: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  ents..  */.  p =
7070: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
7080: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
7090: 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e  onName, nName, n
70a0: 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29  Arg, (u8)enc, 0)
70b0: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 70 2d 3e  ;.  if( p && p->
70c0: 69 50 72 65 66 45 6e 63 3d 3d 65 6e 63 20 26 26  iPrefEnc==enc &&
70d0: 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29   p->nArg==nArg )
70e0: 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 63  {.    if( db->ac
70f0: 74 69 76 65 56 64 62 65 43 6e 74 20 29 7b 0a 20  tiveVdbeCnt ){. 
7100: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7110: 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  r(db, SQLITE_BUS
7120: 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61  Y, .        "una
7130: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f  ble to delete/mo
7140: 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69  dify user-functi
7150: 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76 65  on due to active
7160: 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
7170: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62       assert( !db
7180: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
7190: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
71a0: 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
71b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
71c0: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
71d0: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
71e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  ;.    }.  }..  p
71f0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
7200: 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63  nction(db, zFunc
7210: 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  tionName, nName,
7220: 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20   nArg, (u8)enc, 
7230: 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c  1);.  assert(p |
7240: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
7250: 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b  ed);.  if( !p ){
7260: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7270: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
7280: 70 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20  p->flags = 0;.  
7290: 70 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e 63  p->xFunc = xFunc
72a0: 3b 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d 20 78  ;.  p->xStep = x
72b0: 53 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61  Step;.  p->xFina
72c0: 6c 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20  lize = xFinal;. 
72d0: 20 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20   p->pUserData = 
72e0: 70 55 73 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e  pUserData;.  p->
72f0: 6e 41 72 67 20 3d 20 28 75 31 36 29 6e 41 72 67  nArg = (u16)nArg
7300: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
7310: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
7320: 72 65 61 74 65 20 6e 65 77 20 75 73 65 72 20 66  reate new user f
7330: 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74  unctions..*/.int
7340: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
7350: 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69  function(.  sqli
7360: 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74  te3 *db,.  const
7370: 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e   char *zFunction
7380: 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Name,.  int nArg
7390: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
73a0: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
73b0: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
73c0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
73d0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
73e0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
73f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
7400: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
7410: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
7420: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
7430: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
7440: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
7450: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
7460: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 63 20 3d  ->mutex);.  rc =
7470: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
7480: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
7490: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 65 6e 63 2c  Name, nArg, enc,
74a0: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
74b0: 2c 20 78 46 69 6e 61 6c 29 3b 0a 20 20 72 63 20  , xFinal);.  rc 
74c0: 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
74d0: 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
74e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
74f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
7500: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
7510: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7520: 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65  UTF16.int sqlite
7530: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
7540: 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  n16(.  sqlite3 *
7550: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  db,.  const void
7560: 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c   *zFunctionName,
7570: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69  .  int nArg,.  i
7580: 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76  nt eTextRep,.  v
7590: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
75a0: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
75b0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
75c0: 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20  ite3_value**),. 
75d0: 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73   void (*xStep)(s
75e0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
75f0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
7600: 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  e**),.  void (*x
7610: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
7620: 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e  ontext*).){.  in
7630: 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46  t rc;.  char *zF
7640: 75 6e 63 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f  unc8;.  sqlite3_
7650: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
7660: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
7670: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
7680: 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20  led );.  zFunc8 
7690: 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
76a0: 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  8(db, zFunctionN
76b0: 61 6d 65 2c 20 2d 31 29 3b 0a 20 20 72 63 20 3d  ame, -1);.  rc =
76c0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
76d0: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e  nc(db, zFunc8, n
76e0: 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70  Arg, eTextRep, p
76f0: 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20  , xFunc, xStep, 
7700: 78 46 69 6e 61 6c 29 3b 0a 20 20 73 71 6c 69 74  xFinal);.  sqlit
7710: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75  e3DbFree(db, zFu
7720: 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  nc8);.  rc = sql
7730: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
7740: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
7750: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
7760: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
7770: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  rc;.}.#endif.../
7780: 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61  *.** Declare tha
7790: 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  t a function has
77a0: 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64   been overloaded
77b0: 20 62 79 20 61 20 76 69 72 74 75 61 6c 20 74 61   by a virtual ta
77c0: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
77d0: 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61  e function alrea
77e0: 64 79 20 65 78 69 73 74 73 20 61 73 20 61 20 72  dy exists as a r
77f0: 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75  egular global fu
7800: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20  nction, then.** 
7810: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
7820: 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65  a no-op.  If the
7830: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
7840: 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63  ot exist, then c
7850: 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f  reate.** a new o
7860: 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73 20 74  ne that always t
7870: 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65  hrows a run-time
7880: 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20   error.  .**.** 
7890: 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62  When virtual tab
78a0: 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72  les intend to pr
78b0: 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61  ovide an overloa
78c0: 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  ded function, th
78d0: 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c  ey.** should cal
78e0: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  l this routine t
78f0: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
7900: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
7910: 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f  exists..** A glo
7920: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  bal function mus
7930: 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72  t exist in order
7940: 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75   for name resolu
7950: 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20  tion to work.** 
7960: 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74  properly..*/.int
7970: 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
7980: 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  d_function(.  sq
7990: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
79a0: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
79b0: 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20    int nArg.){.  
79c0: 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  int nName = sqli
79d0: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
79e0: 65 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e);.  int rc;.  
79f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
7a00: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
7a10: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
7a20: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e  dFunction(db, zN
7a30: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67  ame, nName, nArg
7a40: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
7a50: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
7a60: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
7a70: 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  , zName, nArg, S
7a80: 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20  QLITE_UTF8,.    
7a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7aa0: 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e 76 61    0, sqlite3Inva
7ab0: 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20  lidFunction, 0, 
7ac0: 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  0);.  }.  rc = s
7ad0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
7ae0: 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20  , SQLITE_OK);.  
7af0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
7b00: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
7b10: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7b20: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7b30: 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20  MIT_TRACE./*.** 
7b40: 52 65 67 69 73 74 65 72 20 61 20 74 72 61 63 65  Register a trace
7b50: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
7b60: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
7b70: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
7b80: 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20  red trace.** is 
7b90: 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a  returned.  .**.*
7ba0: 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66  * A NULL trace f
7bb0: 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68  unction means th
7bc0: 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73  at no tracing is
7bd0: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
7be0: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20  n-NULL.** trace 
7bf0: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
7c00: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
7c10: 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
7c20: 65 20 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a  e start of each.
7c30: 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
7c40: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
7c50: 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33  e3_trace(sqlite3
7c60: 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72   *db, void (*xTr
7c70: 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74  ace)(void*,const
7c80: 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70   char*), void *p
7c90: 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  Arg){.  void *pO
7ca0: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
7cb0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
7cc0: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
7cd0: 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20  b->pTraceArg;.  
7ce0: 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72  db->xTrace = xTr
7cf0: 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63  ace;.  db->pTrac
7d00: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
7d10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
7d20: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
7d30: 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a   return pOld;.}.
7d40: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
7d50: 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f   profile functio
7d60: 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72 6f  n.  The pArg fro
7d70: 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  m the previously
7d80: 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20   registered .** 
7d90: 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e  profile function
7da0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a   is returned.  .
7db0: 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f  **.** A NULL pro
7dc0: 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  file function me
7dd0: 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66  ans that no prof
7de0: 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75 74 65  iling is execute
7df0: 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a  s.  A non-NULL.*
7e00: 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70  * profile is a p
7e10: 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63  ointer to a func
7e20: 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76  tion that is inv
7e30: 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63  oked at the conc
7e40: 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63  lusion of.** eac
7e50: 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  h SQL statement 
7e60: 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a  that is run..*/.
7e70: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72  void *sqlite3_pr
7e80: 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33  ofile(.  sqlite3
7e90: 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78   *db,.  void (*x
7ea0: 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63  Profile)(void*,c
7eb0: 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74  onst char*,sqlit
7ec0: 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  e_uint64),.  voi
7ed0: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69  d *pArg.){.  voi
7ee0: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
7ef0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
7f00: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
7f10: 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  d = db->pProfile
7f20: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66  Arg;.  db->xProf
7f30: 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a  ile = xProfile;.
7f40: 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72    db->pProfileAr
7f50: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
7f60: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7f70: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
7f80: 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e  turn pOld;.}.#en
7f90: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
7fa0: 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 2a  IT_TRACE */../**
7fb0: 2a 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 2a  * EXPERIMENTAL *
7fc0: 2a 2a 0a 2a 2a 0a 2a 2a 20 52 65 67 69 73 74 65  **.**.** Registe
7fd0: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r a function to 
7fe0: 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20  be invoked when 
7ff0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  a transaction co
8000: 6d 6d 65 6e 74 73 2e 0a 2a 2a 20 49 66 20 74 68  mments..** If th
8010: 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69  e invoked functi
8020: 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a  on returns non-z
8030: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f  ero, then the co
8040: 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a  mmit becomes a.*
8050: 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76  * rollback..*/.v
8060: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d  oid *sqlite3_com
8070: 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  mit_hook(.  sqli
8080: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
8090: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
80a0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
80b0: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69   database */.  i
80c0: 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  nt (*xCallback)(
80d0: 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63  void*),  /* Func
80e0: 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f  tion to invoke o
80f0: 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f  n each commit */
8100: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20  .  void *pArg   
8110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8120: 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20  Argument to the 
8130: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
8140: 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73   void *pOld;.  s
8150: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
8160: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
8170: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d   pOld = db->pCom
8180: 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43  mitArg;.  db->xC
8190: 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20  ommitCallback = 
81a0: 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d  xCallback;.  db-
81b0: 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41  >pCommitArg = pA
81c0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
81d0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
81e0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  tex);.  return p
81f0: 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Old;.}../*.** Re
8200: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
8210: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
8220: 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20  each time a row 
8230: 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69  is updated,.** i
8240: 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74  nserted or delet
8250: 65 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61  ed using this da
8260: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
8270: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
8280: 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28  te3_update_hook(
8290: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
82a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
82b0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
82c0: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
82d0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
82e0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e  llback)(void*,in
82f0: 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63  t,char const *,c
8300: 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69  har const *,sqli
8310: 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69  te_int64),.  voi
8320: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
8330: 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65         /* Argume
8340: 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69  nt to the functi
8350: 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20  on */.){.  void 
8360: 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33  *pRet;.  sqlite3
8370: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
8380: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
8390: 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67  = db->pUpdateArg
83a0: 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43  ;.  db->xUpdateC
83b0: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
83c0: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61  ack;.  db->pUpda
83d0: 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  teArg = pArg;.  
83e0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
83f0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
8400: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d    return pRet;.}
8410: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
8420: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
8430: 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
8440: 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ime a transactio
8450: 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62  n is rolled.** b
8460: 61 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61  ack by this data
8470: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
8480: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
8490: 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28  3_rollback_hook(
84a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
84c0: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
84d0: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
84e0: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61   */.  void (*xCa
84f0: 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20  llback)(void*), 
8500: 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63  /* Callback func
8510: 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  tion */.  void *
8520: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
8530: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
8540: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
8550: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52  */.){.  void *pR
8560: 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  et;.  sqlite3_mu
8570: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
8580: 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
8590: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b  b->pRollbackArg;
85a0: 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b  .  db->xRollback
85b0: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
85c0: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c  back;.  db->pRol
85d0: 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b  lbackArg = pArg;
85e0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
85f0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
8600: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74  );.  return pRet
8610: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8620: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
8630: 20 74 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65   true if main-me
8640: 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75  mory should be u
8650: 73 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  sed instead of.*
8660: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  * a temporary fi
8670: 6c 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74  le for transient
8680: 20 70 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64   pager files and
8690: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
86a0: 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75  als..** The valu
86b0: 65 20 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e  e returned depen
86c0: 64 73 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20  ds on the value 
86d0: 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72  of db->temp_stor
86e0: 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61  e (runtime.** pa
86f0: 72 61 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65  rameter) and the
8700: 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61   compile time va
8710: 6c 75 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45  lue of SQLITE_TE
8720: 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a  MP_STORE. The.**
8730: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65   following table
8740: 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 72   describes the r
8750: 65 6c 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77  elationship betw
8760: 65 65 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61  een these two va
8770: 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73  lues.** and this
8780: 20 66 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72   functions retur
8790: 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20  n value..**.**  
87a0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
87b0: 52 45 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f  RE     db->temp_
87c0: 73 74 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69  store     Locati
87d0: 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20  on of temporary 
87e0: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d  database.**   --
87f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20  --------------- 
8800: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
8810: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
8820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8830: 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20  -----.**   0    
8840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8850: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
8860: 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
8870: 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
8880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8890: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
88a0: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
88b0: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
88c0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
88d0: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
88e0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
88f0: 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
8900: 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
8910: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
8920: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
8930: 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
8940: 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
8950: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
8960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8970: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
8980: 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
8990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89a0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
89b0: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
89c0: 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20  turn 1).**   2  
89d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
89e0: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
89f0: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
8a00: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
8a10: 33 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  3               
8a20: 20 20 20 20 20 20 61 6e 79 20 20 20 20 20 20 20        any       
8a30: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
8a40: 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f     (return 1).*/
8a50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70  .int sqlite3Temp
8a60: 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73  InMemory(const s
8a70: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
8a80: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
8a90: 52 45 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28  RE==1.  return (
8aa0: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d   db->temp_store=
8ab0: 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =2 );.#endif.#if
8ac0: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
8ad0: 52 45 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28  RE==2.  return (
8ae0: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21   db->temp_store!
8af0: 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66  =1 );.#endif.#if
8b00: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
8b10: 52 45 3d 3d 33 0a 20 20 72 65 74 75 72 6e 20 31  RE==3.  return 1
8b20: 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  ;.#endif.#if SQL
8b30: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31  ITE_TEMP_STORE<1
8b40: 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   || SQLITE_TEMP_
8b50: 53 54 4f 52 45 3e 33 0a 20 20 72 65 74 75 72 6e  STORE>3.  return
8b60: 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a   0;.#endif.}../*
8b70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8b80: 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 72   is called to cr
8b90: 65 61 74 65 20 61 20 63 6f 6e 6e 65 63 74 69 6f  eate a connectio
8ba0: 6e 20 74 6f 20 61 20 64 61 74 61 62 61 73 65 20  n to a database 
8bb0: 42 54 72 65 65 0a 2a 2a 20 64 72 69 76 65 72 2e  BTree.** driver.
8bc0: 20 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69    If zFilename i
8bd0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
8be0: 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 61 74 20  file, then that 
8bf0: 66 69 6c 65 20 69 73 0a 2a 2a 20 6f 70 65 6e 65  file is.** opene
8c00: 64 20 61 6e 64 20 75 73 65 64 2e 20 20 49 66 20  d and used.  If 
8c10: 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 74 68 65  zFilename is the
8c20: 20 6d 61 67 69 63 20 6e 61 6d 65 20 22 3a 6d 65   magic name ":me
8c30: 6d 6f 72 79 3a 22 20 74 68 65 6e 0a 2a 2a 20 74  mory:" then.** t
8c40: 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 73  he database is s
8c50: 74 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20  tored in memory 
8c60: 28 61 6e 64 20 69 73 20 74 68 75 73 20 66 6f 72  (and is thus for
8c70: 67 6f 74 74 65 6e 20 61 73 20 73 6f 6f 6e 20 61  gotten as soon a
8c80: 73 0a 2a 2a 20 74 68 65 20 63 6f 6e 6e 65 63 74  s.** the connect
8c90: 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e 29 20  ion is closed.) 
8ca0: 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73   If zFilename is
8cb0: 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 20 64   NULL then the d
8cc0: 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 61 20  atabase.** is a 
8cd0: 22 76 69 72 74 75 61 6c 22 20 64 61 74 61 62 61  "virtual" databa
8ce0: 73 65 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74  se for transient
8cf0: 20 75 73 65 20 6f 6e 6c 79 20 61 6e 64 20 69 73   use only and is
8d00: 20 64 65 6c 65 74 65 64 20 61 73 0a 2a 2a 20 73   deleted as.** s
8d10: 6f 6f 6e 20 61 73 20 74 68 65 20 63 6f 6e 6e 65  oon as the conne
8d20: 63 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2e  ction is closed.
8d30: 0a 2a 2a 0a 2a 2a 20 41 20 76 69 72 74 75 61 6c  .**.** A virtual
8d40: 20 64 61 74 61 62 61 73 65 20 63 61 6e 20 62 65   database can be
8d50: 20 65 69 74 68 65 72 20 61 20 64 69 73 6b 20 66   either a disk f
8d60: 69 6c 65 20 28 74 68 61 74 20 69 73 20 61 75 74  ile (that is aut
8d70: 6f 6d 61 74 69 63 61 6c 6c 79 0a 2a 2a 20 64 65  omatically.** de
8d80: 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65 20 66  leted when the f
8d90: 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 29 20 6f  ile is closed) o
8da0: 72 20 69 74 20 61 6e 20 62 65 20 68 65 6c 64 20  r it an be held 
8db0: 65 6e 74 69 72 65 6c 79 20 69 6e 20 6d 65 6d 6f  entirely in memo
8dc0: 72 79 2e 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74  ry..** The sqlit
8dd0: 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 29  e3TempInMemory()
8de0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
8df0: 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77  d to determine w
8e00: 68 69 63 68 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  hich..*/.int sql
8e10: 69 74 65 33 42 74 72 65 65 46 61 63 74 6f 72 79  ite3BtreeFactory
8e20: 28 0a 20 20 63 6f 6e 73 74 20 73 71 6c 69 74 65  (.  const sqlite
8e30: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a  3 *db,        /*
8e40: 20 4d 61 69 6e 20 64 61 74 61 62 61 73 65 20 77   Main database w
8e50: 68 65 6e 20 6f 70 65 6e 69 6e 67 20 61 75 78 20  hen opening aux 
8e60: 6f 74 68 65 72 77 69 73 65 20 30 20 2a 2f 0a 20  otherwise 0 */. 
8e70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
8e80: 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 4e 61  lename,    /* Na
8e90: 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 63  me of the file c
8ea0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 42 54  ontaining the BT
8eb0: 72 65 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  ree database */.
8ec0: 20 20 69 6e 74 20 6f 6d 69 74 4a 6f 75 72 6e 61    int omitJourna
8ed0: 6c 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69  l,          /* i
8ee0: 66 20 54 52 55 45 20 74 68 65 6e 20 64 6f 20 6e  f TRUE then do n
8ef0: 6f 74 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20  ot journal this 
8f00: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  file */.  int nC
8f10: 61 63 68 65 2c 20 20 20 20 20 20 20 20 20 20 20  ache,           
8f20: 20 20 20 20 2f 2a 20 48 6f 77 20 6d 61 6e 79 20      /* How many 
8f30: 70 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67  pages in the pag
8f40: 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 69 6e 74  e cache */.  int
8f50: 20 76 66 73 46 6c 61 67 73 2c 20 20 20 20 20 20   vfsFlags,      
8f60: 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
8f70: 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
8f80: 6f 20 76 66 73 4f 70 65 6e 20 2a 2f 0a 20 20 42  o vfsOpen */.  B
8f90: 74 72 65 65 20 2a 2a 70 70 42 74 72 65 65 20 20  tree **ppBtree  
8fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
8fb0: 74 65 72 20 74 6f 20 6e 65 77 20 42 74 72 65 65  ter to new Btree
8fc0: 20 6f 62 6a 65 63 74 20 77 72 69 74 74 65 6e 20   object written 
8fd0: 68 65 72 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  here */.){.  int
8fe0: 20 62 74 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20   btFlags = 0;.  
8ff0: 69 6e 74 20 72 63 3b 0a 20 20 0a 20 20 61 73 73  int rc;.  .  ass
9000: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
9010: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
9020: 78 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  x) );.  assert( 
9030: 70 70 42 74 72 65 65 20 21 3d 20 30 29 3b 0a 20  ppBtree != 0);. 
9040: 20 69 66 28 20 6f 6d 69 74 4a 6f 75 72 6e 61 6c   if( omitJournal
9050: 20 29 7b 0a 20 20 20 20 62 74 46 6c 61 67 73 20   ){.    btFlags 
9060: 7c 3d 20 42 54 52 45 45 5f 4f 4d 49 54 5f 4a 4f  |= BTREE_OMIT_JO
9070: 55 52 4e 41 4c 3b 0a 20 20 7d 0a 20 20 69 66 28  URNAL;.  }.  if(
9080: 20 64 62 2d 3e 66 6c 61 67 73 20 26 20 53 51 4c   db->flags & SQL
9090: 49 54 45 5f 4e 6f 52 65 61 64 6c 6f 63 6b 20 29  ITE_NoReadlock )
90a0: 7b 0a 20 20 20 20 62 74 46 6c 61 67 73 20 7c 3d  {.    btFlags |=
90b0: 20 42 54 52 45 45 5f 4e 4f 5f 52 45 41 44 4c 4f   BTREE_NO_READLO
90c0: 43 4b 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  CK;.  }.#ifndef 
90d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
90e0: 52 59 44 42 0a 20 20 69 66 28 20 7a 46 69 6c 65  RYDB.  if( zFile
90f0: 6e 61 6d 65 3d 3d 30 20 26 26 20 73 71 6c 69 74  name==0 && sqlit
9100: 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 64  e3TempInMemory(d
9110: 62 29 20 29 7b 0a 20 20 20 20 7a 46 69 6c 65 6e  b) ){.    zFilen
9120: 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22  ame = ":memory:"
9130: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
9140: 69 66 28 20 28 76 66 73 46 6c 61 67 73 20 26 20  if( (vfsFlags & 
9150: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
9160: 5f 44 42 29 21 3d 30 20 26 26 20 28 7a 46 69 6c  _DB)!=0 && (zFil
9170: 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 2a 7a 46 69  ename==0 || *zFi
9180: 6c 65 6e 61 6d 65 3d 3d 30 29 20 29 7b 0a 20 20  lename==0) ){.  
9190: 20 20 76 66 73 46 6c 61 67 73 20 3d 20 28 76 66    vfsFlags = (vf
91a0: 73 46 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  sFlags & ~SQLITE
91b0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 20 7c  _OPEN_MAIN_DB) |
91c0: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
91d0: 50 5f 44 42 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  P_DB;.  }.  rc =
91e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65   sqlite3BtreeOpe
91f0: 6e 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 28 73 71  n(zFilename, (sq
9200: 6c 69 74 65 33 20 2a 29 64 62 2c 20 70 70 42 74  lite3 *)db, ppBt
9210: 72 65 65 2c 20 62 74 46 6c 61 67 73 2c 20 76 66  ree, btFlags, vf
9220: 73 46 6c 61 67 73 29 3b 0a 0a 20 20 2f 2a 20 49  sFlags);..  /* I
9230: 66 20 74 68 65 20 42 2d 54 72 65 65 20 77 61 73  f the B-Tree was
9240: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
9250: 65 6e 65 64 2c 20 73 65 74 20 74 68 65 20 70 61  ened, set the pa
9260: 67 65 72 2d 63 61 63 68 65 20 73 69 7a 65 20 74  ger-cache size t
9270: 6f 20 74 68 65 0a 20 20 2a 2a 20 64 65 66 61 75  o the.  ** defau
9280: 6c 74 20 76 61 6c 75 65 2e 20 45 78 63 65 70 74  lt value. Except
9290: 2c 20 69 66 20 74 68 65 20 63 61 6c 6c 20 74 6f  , if the call to
92a0: 20 42 74 72 65 65 4f 70 65 6e 28 29 20 72 65 74   BtreeOpen() ret
92b0: 75 72 6e 65 64 20 61 20 68 61 6e 64 6c 65 0a 20  urned a handle. 
92c0: 20 2a 2a 20 6f 70 65 6e 20 6f 6e 20 61 6e 20 65   ** open on an e
92d0: 78 69 73 74 69 6e 67 20 73 68 61 72 65 64 20 70  xisting shared p
92e0: 61 67 65 72 2d 63 61 63 68 65 2c 20 64 6f 20 6e  ager-cache, do n
92f0: 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 70 61  ot change the pa
9300: 67 65 72 2d 63 61 63 68 65 20 0a 20 20 2a 2a 20  ger-cache .  ** 
9310: 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  size..  */.  if(
9320: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
9330: 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 74 72 65  & 0==sqlite3Btre
9340: 65 53 63 68 65 6d 61 28 2a 70 70 42 74 72 65 65  eSchema(*ppBtree
9350: 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 73  , 0, 0) ){.    s
9360: 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 43 61  qlite3BtreeSetCa
9370: 63 68 65 53 69 7a 65 28 2a 70 70 42 74 72 65 65  cheSize(*ppBtree
9380: 2c 20 6e 43 61 63 68 65 29 3b 0a 20 20 7d 0a 20  , nCache);.  }. 
9390: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
93a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d  *.** Return UTF-
93b0: 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  8 encoded Englis
93c0: 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
93d0: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
93e0: 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
93f0: 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  or..*/.const cha
9400: 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  r *sqlite3_errms
9410: 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  g(sqlite3 *db){.
9420: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b    const char *z;
9430: 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20  .  if( !db ){.  
9440: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
9450: 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f  ErrStr(SQLITE_NO
9460: 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  MEM);.  }.  if( 
9470: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
9480: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
9490: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  ){.    return sq
94a0: 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c 49  lite3ErrStr(SQLI
94b0: 54 45 5f 4d 49 53 55 53 45 29 3b 0a 20 20 7d 0a  TE_MISUSE);.  }.
94c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
94d0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
94e0: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
94f0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
9500: 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74  z = sqlite3ErrSt
9510: 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b  r(SQLITE_NOMEM);
9520: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
9530: 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33  = (char*)sqlite3
9540: 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e  _value_text(db->
9550: 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72  pErr);.    asser
9560: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
9570: 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20  iled );.    if( 
9580: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20  z==0 ){.      z 
9590: 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
95a0: 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20  db->errCode);.  
95b0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
95c0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
95d0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
95e0: 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn z;.}..#ifndef
95f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
9600: 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  16./*.** Return 
9610: 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45  UTF-16 encoded E
9620: 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
9630: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74  explanation of t
9640: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a  he most recent.*
9650: 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73  * error..*/.cons
9660: 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  t void *sqlite3_
9670: 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33  errmsg16(sqlite3
9680: 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20   *db){.  static 
9690: 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d  const u16 outOfM
96a0: 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27  em[] = {.    'o'
96b0: 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c  , 'u', 't', ' ',
96c0: 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20   'o', 'f', ' ', 
96d0: 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27  'm', 'e', 'm', '
96e0: 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a  o', 'r', 'y', 0.
96f0: 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f    };.  static co
9700: 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d  nst u16 misuse[]
9710: 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69   = {.    'l', 'i
9720: 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27  ', 'b', 'r', 'a'
9730: 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c  , 'r', 'y', ' ',
9740: 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20   .    'r', 'o', 
9750: 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27  'u', 't', 'i', '
9760: 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20  n', 'e', ' ', . 
9770: 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27     'c', 'a', 'l'
9780: 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c  , 'l', 'e', 'd',
9790: 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20   ' ', .    'o', 
97a0: 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a  'u', 't', ' ', .
97b0: 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20      'o', 'f', ' 
97c0: 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27  ', .    's', 'e'
97d0: 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c  , 'q', 'u', 'e',
97e0: 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20   'n', 'c', 'e', 
97f0: 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20  0.  };..  const 
9800: 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21  void *z;.  if( !
9810: 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
9820: 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65   (void *)outOfMe
9830: 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  m;.  }.  if( !sq
9840: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
9850: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
9860: 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64      return (void
9870: 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20   *)misuse;.  }. 
9880: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
9890: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
98a0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
98b0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a  cFailed ){.    z
98c0: 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66   = (void *)outOf
98d0: 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Mem;.  }else{.  
98e0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
98f0: 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70  lue_text16(db->p
9900: 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  Err);.    if( z=
9910: 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  =0 ){.      sqli
9920: 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64  te3ValueSetStr(d
9930: 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71 6c  b->pErr, -1, sql
9940: 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
9950: 72 72 43 6f 64 65 29 2c 0a 20 20 20 20 20 20 20  rrCode),.       
9960: 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c      SQLITE_UTF8,
9970: 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
9980: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
9990: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
99a0: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d  db->pErr);.    }
99b0: 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63  .    /* A malloc
99c0: 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c  () may have fail
99d0: 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61  ed within the ca
99e0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61  ll to sqlite3_va
99f0: 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20  lue_text16().   
9a00: 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68   ** above. If th
9a10: 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20  is is the case, 
9a20: 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c  then the db->mal
9a30: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e  locFailed flag n
9a40: 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62  eeds to.    ** b
9a50: 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65  e cleared before
9a60: 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74   returning. Do t
9a70: 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e  his directly, in
9a80: 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20  stead of via.   
9a90: 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78   ** sqlite3ApiEx
9aa0: 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73  it(), to avoid s
9ab0: 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  etting the datab
9ac0: 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72  ase handle error
9ad0: 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f   message..    */
9ae0: 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  .    db->mallocF
9af0: 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20  ailed = 0;.  }. 
9b00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
9b10: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
9b20: 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23  .  return z;.}.#
9b30: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
9b40: 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
9b50: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
9b60: 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f  most recent erro
9b70: 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64  r code generated
9b80: 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f   by an SQLite ro
9b90: 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69  utine. If NULL i
9ba0: 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74  s.** passed to t
9bb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65  his function, we
9bc0: 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63   assume a malloc
9bd0: 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67  () failed during
9be0: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e   sqlite3_open().
9bf0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
9c00: 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20  errcode(sqlite3 
9c10: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26  *db){.  if( db &
9c20: 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  & !sqlite3Safety
9c30: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
9c40: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
9c50: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20  SQLITE_MISUSE;. 
9c60: 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20   }.  if( !db || 
9c70: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
9c80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
9c90: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
9ca0: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72  .  return db->er
9cb0: 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d  rCode & db->errM
9cc0: 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  ask;.}.int sqlit
9cd0: 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
9ce0: 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ode(sqlite3 *db)
9cf0: 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73  {.  if( db && !s
9d00: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
9d10: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
9d20: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
9d30: 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 20  TE_MISUSE;.  }. 
9d40: 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
9d50: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
9d60: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
9d70: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
9d80: 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
9d90: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  e;.}../*.** Crea
9da0: 74 65 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  te a new collati
9db0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ng function for 
9dc0: 64 61 74 61 62 61 73 65 20 22 64 62 22 2e 20 20  database "db".  
9dd0: 54 68 65 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d  The name is zNam
9de0: 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 65 6e 63  e.** and the enc
9df0: 6f 64 69 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f  oding is enc..*/
9e00: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 72 65 61  .static int crea
9e10: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73  teCollation(.  s
9e20: 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
9e30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
9e40: 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
9e50: 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
9e60: 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
9e70: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
9e80: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
9e90: 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
9ea0: 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
9eb0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a  CollSeq *pColl;.
9ec0: 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69 6e    int enc2;.  in
9ed0: 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  t nName = sqlite
9ee0: 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29  3Strlen30(zName)
9ef0: 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73  ;.  .  assert( s
9f00: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
9f10: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
9f20: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f  .  /* If SQLITE_
9f30: 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69  UTF16 is specifi
9f40: 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69  ed as the encodi
9f50: 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f  ng type, transfo
9f60: 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20  rm this.  ** to 
9f70: 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54  one of SQLITE_UT
9f80: 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f  F16LE or SQLITE_
9f90: 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68  UTF16BE using th
9fa0: 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54  e.  ** SQLITE_UT
9fb0: 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e  F16NATIVE macro.
9fc0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
9fd0: 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e   not used intern
9fe0: 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63  ally..  */.  enc
9ff0: 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63  2 = enc;.  testc
a000: 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54  ase( enc2==SQLIT
a010: 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73  E_UTF16 );.  tes
a020: 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c  tcase( enc2==SQL
a030: 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
a040: 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d  D );.  if( enc2=
a050: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c  =SQLITE_UTF16 ||
a060: 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
a070: 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20  F16_ALIGNED ){. 
a080: 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45     enc2 = SQLITE
a090: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
a0a0: 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c  }.  if( enc2<SQL
a0b0: 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32  ITE_UTF8 || enc2
a0c0: 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  >SQLITE_UTF16BE 
a0d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
a0e0: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
a0f0: 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20  ..  /* Check if 
a100: 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d  this call is rem
a110: 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69  oving or replaci
a120: 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63  ng an existing c
a130: 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73  ollation .  ** s
a140: 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20  equence. If so, 
a150: 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63  and there are ac
a160: 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e  tive VMs, return
a170: 20 62 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a   busy. If there.
a180: 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69    ** are no acti
a190: 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61  ve VMs, invalida
a1a0: 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69  te any pre-compi
a1b0: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
a1c0: 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73    */.  pColl = s
a1d0: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
a1e0: 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20  q(db, (u8)enc2, 
a1f0: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28  zName, 0);.  if(
a200: 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d   pColl && pColl-
a210: 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28  >xCmp ){.    if(
a220: 20 64 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43   db->activeVdbeC
a230: 6e 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  nt ){.      sqli
a240: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
a250: 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20  ITE_BUSY, .     
a260: 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65     "unable to de
a270: 6c 65 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c  lete/modify coll
a280: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64  ation sequence d
a290: 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61  ue to active sta
a2a0: 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20  tements");.     
a2b0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
a2c0: 55 53 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  USY;.    }.    s
a2d0: 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70  qlite3ExpirePrep
a2e0: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64  aredStatements(d
a2f0: 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63  b);..    /* If c
a300: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
a310: 65 20 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61  e pColl was crea
a320: 74 65 64 20 64 69 72 65 63 74 6c 79 20 62 79 20  ted directly by 
a330: 61 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  a call to.    **
a340: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
a350: 63 6f 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e  collation, and n
a360: 6f 74 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  ot generated by 
a370: 73 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a  synthCollSeq(),.
a380: 20 20 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20      ** then any 
a390: 63 6f 70 69 65 73 20 6d 61 64 65 20 62 79 20 73  copies made by s
a3a0: 79 6e 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65  ynthCollSeq() ne
a3b0: 65 64 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64  ed to be invalid
a3c0: 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73  ated..    ** Als
a3d0: 6f 2c 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73  o, collation des
a3e0: 74 72 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65  tructor - CollSe
a3f0: 71 2e 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74  q.xDel() - funct
a400: 69 6f 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20  ion may need.   
a410: 20 2a 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64   ** to be called
a420: 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66  ..    */ .    if
a430: 28 20 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20  ( (pColl->enc & 
a440: 7e 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  ~SQLITE_UTF16_AL
a450: 49 47 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a  IGNED)==enc2 ){.
a460: 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61        CollSeq *a
a470: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61  Coll = sqlite3Ha
a480: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c  shFind(&db->aCol
a490: 6c 53 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  lSeq, zName, nNa
a4a0: 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  me);.      int j
a4b0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
a4c0: 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<3; j++){.    
a4d0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d      CollSeq *p =
a4e0: 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   &aColl[j];.    
a4f0: 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d      if( p->enc==
a500: 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
a510: 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78          if( p->x
a520: 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Del ){.         
a530: 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55     p->xDel(p->pU
a540: 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ser);.          
a550: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78  }.          p->x
a560: 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Cmp = 0;.       
a570: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
a580: 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  .  }..  pColl = 
a590: 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
a5a0: 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c  eq(db, (u8)enc2,
a5b0: 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66   zName, 1);.  if
a5c0: 28 20 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70  ( pColl ){.    p
a5d0: 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f  Coll->xCmp = xCo
a5e0: 6d 70 61 72 65 3b 0a 20 20 20 20 70 43 6f 6c 6c  mpare;.    pColl
a5f0: 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b 0a  ->pUser = pCtx;.
a600: 20 20 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20      pColl->xDel 
a610: 3d 20 78 44 65 6c 3b 0a 20 20 20 20 70 43 6f 6c  = xDel;.    pCol
a620: 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e  l->enc = (u8)(en
a630: 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49  c2 | (enc & SQLI
a640: 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
a650: 29 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  ));.  }.  sqlite
a660: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
a670: 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75  E_OK, 0);.  retu
a680: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
a690: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72  ../*.** This arr
a6a0: 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64 20  ay defines hard 
a6b0: 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20  upper bounds on 
a6c0: 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54  limit values.  T
a6d0: 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  he.** initialize
a6e0: 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69  r must be kept i
a6f0: 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20  n sync with the 
a700: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a  SQLITE_LIMIT_*.*
a710: 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71  * #defines in sq
a720: 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74  lite3.h..*/.stat
a730: 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61  ic const int aHa
a740: 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20  rdLimit[] = {.  
a750: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
a760: 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
a770: 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  SQL_LENGTH,.  SQ
a780: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c  LITE_MAX_COLUMN,
a790: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  .  SQLITE_MAX_EX
a7a0: 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49  PR_DEPTH,.  SQLI
a7b0: 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
a7c0: 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45  SELECT,.  SQLITE
a7d0: 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20  _MAX_VDBE_OP,.  
a7e0: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
a7f0: 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54  ION_ARG,.  SQLIT
a800: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a  E_MAX_ATTACHED,.
a810: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b    SQLITE_MAX_LIK
a820: 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
a830: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
a840: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a  ARIABLE_NUMBER,.
a850: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  };../*.** Make s
a860: 75 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d  ure the hard lim
a870: 69 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72  its are set to r
a880: 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73  easonable values
a890: 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  .*/.#if SQLITE_M
a8a0: 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  AX_LENGTH<100.# 
a8b0: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
a8c0: 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
a8d0: 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e  at least 100.#en
a8e0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
a8f0: 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30  AX_SQL_LENGTH<10
a900: 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
a910: 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
a920: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
a930: 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20   100.#endif.#if 
a940: 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
a950: 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58  ENGTH>SQLITE_MAX
a960: 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20  _LENGTH.# error 
a970: 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
a980: 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62  ENGTH must not b
a990: 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53  e greater than S
a9a0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
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 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
a9d0: 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72  SELECT<2.# error
a9e0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
a9f0: 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74  OUND_SELECT must
aa00: 20 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23   be at least 2.#
aa10: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
aa20: 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a  _MAX_VDBE_OP<40.
aa30: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
aa40: 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20  AX_VDBE_OP must 
aa50: 62 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23  be at least 40.#
aa60: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
aa70: 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
aa80: 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  G<0 || SQLITE_MA
aa90: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31  X_FUNCTION_ARG>1
aaa0: 30 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  000.# error SQLI
aab0: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
aac0: 41 52 47 20 6d 75 73 74 20 62 65 20 62 65 74 77  ARG must be betw
aad0: 65 65 6e 20 30 20 61 6e 64 20 31 30 30 30 0a 23  een 0 and 1000.#
aae0: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
aaf0: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20  _MAX_ATTACHED<0 
ab00: 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  || SQLITE_MAX_AT
ab10: 54 41 43 48 45 44 3e 33 30 0a 23 20 65 72 72 6f  TACHED>30.# erro
ab20: 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  r SQLITE_MAX_ATT
ab30: 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62 65  ACHED must be be
ab40: 74 77 65 65 6e 20 30 20 61 6e 64 20 33 30 0a 23  tween 0 and 30.#
ab50: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
ab60: 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
ab70: 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72 72  N_LENGTH<1.# err
ab80: 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  or SQLITE_MAX_LI
ab90: 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
aba0: 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
abb0: 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 1.#endif.#if 
abc0: 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
abd0: 42 4c 45 5f 4e 55 4d 42 45 52 3c 31 0a 23 20 65  BLE_NUMBER<1.# e
abe0: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
abf0: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20  VARIABLE_NUMBER 
ac00: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
ac10: 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   1.#endif.#if SQ
ac20: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e  LITE_MAX_COLUMN>
ac30: 33 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51  32767.# error SQ
ac40: 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
ac50: 6d 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20  must not exceed 
ac60: 33 32 37 36 37 0a 23 65 6e 64 69 66 0a 0a 0a 2f  32767.#endif.../
ac70: 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
ac80: 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74  value of a limit
ac90: 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c  .  Report the ol
aca0: 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61  d value..** If a
acb0: 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20  n invalid limit 
acc0: 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69 65  index is supplie
acd0: 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a  d, report -1..**
ace0: 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73   Make no changes
acf0: 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72   but still repor
ad00: 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20  t the old value 
ad10: 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69  if the.** new li
ad20: 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e  mit is negative.
ad30: 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77  .**.** A new low
ad40: 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f  er limit does no
ad50: 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e  t shrink existin
ad60: 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a  g constructs..**
ad70: 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65   It merely preve
ad80: 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63  nts new construc
ad90: 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20 74  ts that exceed t
ada0: 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d  he limit.** from
adb0: 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74   forming..*/.int
adc0: 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73   sqlite3_limit(s
add0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
ade0: 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77  limitId, int new
adf0: 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c  Limit){.  int ol
ae00: 64 4c 69 6d 69 74 3b 0a 20 20 69 66 28 20 6c 69  dLimit;.  if( li
ae10: 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74  mitId<0 || limit
ae20: 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d  Id>=SQLITE_N_LIM
ae30: 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  IT ){.    return
ae40: 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69   -1;.  }.  oldLi
ae50: 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  mit = db->aLimit
ae60: 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28  [limitId];.  if(
ae70: 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 0a   newLimit>=0 ){.
ae80: 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74      if( newLimit
ae90: 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69  >aHardLimit[limi
aea0: 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65  tId] ){.      ne
aeb0: 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c 69  wLimit = aHardLi
aec0: 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20  mit[limitId];.  
aed0: 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d    }.    db->aLim
aee0: 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65  it[limitId] = ne
aef0: 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65  wLimit;.  }.  re
af00: 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 0a 7d  turn oldLimit;.}
af10: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
af20: 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f  tine does the wo
af30: 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20  rk of opening a 
af40: 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61  database on beha
af50: 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lf of.** sqlite3
af60: 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69  _open() and sqli
af70: 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68  te3_open16(). Th
af80: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e  e database filen
af90: 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20  ame "zFilename" 
afa0: 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e   .** is UTF-8 en
afb0: 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  coded..*/.static
afc0: 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73   int openDatabas
afd0: 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
afe0: 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44  *zFilename, /* D
aff0: 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
b000: 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a   UTF-8 encoded *
b010: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  /.  sqlite3 **pp
b020: 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  Db,        /* OU
b030: 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74 61  T: Returned data
b040: 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
b050: 20 75 6e 73 69 67 6e 65 64 20 66 6c 61 67 73 2c   unsigned flags,
b060: 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61          /* Opera
b070: 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a  tional flags */.
b080: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
b090: 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  fs       /* Name
b0a0: 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75   of the VFS to u
b0b0: 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  se */.){.  sqlit
b0c0: 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20 72 63  e3 *db;.  int rc
b0d0: 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f  ;.  CollSeq *pCo
b0e0: 6c 6c 3b 0a 20 20 69 6e 74 20 69 73 54 68 72 65  ll;.  int isThre
b0f0: 61 64 73 61 66 65 3b 0a 0a 20 20 2a 70 70 44 62  adsafe;..  *ppDb
b100: 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
b110: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
b120: 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
b130: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
b140: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
b150: 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  n rc;.#endif..  
b160: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
b170: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
b180: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73 54  ex==0 ){.    isT
b190: 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20  hreadsafe = 0;. 
b1a0: 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73   }else if( flags
b1b0: 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e   & SQLITE_OPEN_N
b1c0: 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73  OMUTEX ){.    is
b1d0: 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a  Threadsafe = 0;.
b1e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
b1f0: 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
b200: 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20  FULLMUTEX ){.   
b210: 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
b220: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
b230: 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 73  isThreadsafe = s
b240: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
b250: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20  ig.bFullMutex;. 
b260: 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20   }..  /* Remove 
b270: 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f  harmful bits fro
b280: 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61 72 61  m the flags para
b290: 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20  meter.  **.  ** 
b2a0: 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  The SQLITE_OPEN_
b2b0: 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49  NOMUTEX and SQLI
b2c0: 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
b2d0: 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a  X flags were.  *
b2e0: 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20  * dealt with in 
b2f0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64  the previous cod
b300: 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65  e block.  Beside
b310: 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c  s these, the onl
b320: 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70  y.  ** valid inp
b330: 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c  ut flags for sql
b340: 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61  ite3_open_v2() a
b350: 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  re SQLITE_OPEN_R
b360: 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51  EADONLY,.  ** SQ
b370: 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
b380: 49 54 45 2c 20 61 6e 64 20 53 51 4c 49 54 45 5f  ITE, and SQLITE_
b390: 4f 50 45 4e 5f 43 52 45 41 54 45 2e 20 20 53 69  OPEN_CREATE.  Si
b3a0: 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a  lently mask.  **
b3b0: 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66   off all other f
b3c0: 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61  lags..  */.  fla
b3d0: 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45  gs &=  ~( SQLITE
b3e0: 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
b3f0: 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  OSE |.          
b400: 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
b410: 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
b420: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
b430: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
b440: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
b450: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
b460: 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  P_DB | .        
b470: 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
b480: 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
b490: 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
b4a0: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
b4b0: 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  IN_JOURNAL | .  
b4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
b4d0: 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
b4e0: 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
b4f0: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
b500: 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c  PEN_SUBJOURNAL |
b510: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
b520: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53   SQLITE_OPEN_MAS
b530: 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20  TER_JOURNAL |.  
b540: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
b550: 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
b560: 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
b570: 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55    SQLITE_OPEN_FU
b580: 4c 4c 4d 55 54 45 58 0a 20 20 20 20 20 20 20 20  LLMUTEX.        
b590: 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c       );..  /* Al
b5a0: 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
b5b0: 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
b5c0: 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74   */.  db = sqlit
b5d0: 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
b5e0: 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b  zeof(sqlite3) );
b5f0: 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67  .  if( db==0 ) g
b600: 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
b610: 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61    if( isThreadsa
b620: 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75  fe ){.    db->mu
b630: 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
b640: 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
b650: 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
b660: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74  .    if( db->mut
b670: 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex==0 ){.      s
b680: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b  qlite3_free(db);
b690: 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  .      db = 0;. 
b6a0: 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
b6b0: 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
b6c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
b6d0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
b6e0: 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
b6f0: 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 70 72  = 0xff;.  db->pr
b700: 69 6f 72 4e 65 77 52 6f 77 69 64 20 3d 20 30 3b  iorNewRowid = 0;
b710: 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a  .  db->nDb = 2;.
b720: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
b730: 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b  LITE_MAGIC_BUSY;
b740: 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d  .  db->aDb = db-
b750: 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61  >aDbStatic;..  a
b760: 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62  ssert( sizeof(db
b770: 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f  ->aLimit)==sizeo
b780: 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b  f(aHardLimit) );
b790: 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c  .  memcpy(db->aL
b7a0: 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74  imit, aHardLimit
b7b0: 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  , sizeof(db->aLi
b7c0: 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 75 74  mit));.  db->aut
b7d0: 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20 20 64  oCommit = 1;.  d
b7e0: 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63 20 3d  b->nextAutovac =
b7f0: 20 2d 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50   -1;.  db->nextP
b800: 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64  agesize = 0;.  d
b810: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49  b->flags |= SQLI
b820: 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73  TE_ShortColNames
b830: 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  .#if SQLITE_DEFA
b840: 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c  ULT_FILE_FORMAT<
b850: 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4.              
b860: 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61     | SQLITE_Lega
b870: 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66  cyFileFmt.#endif
b880: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
b890: 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
b8a0: 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20  SION.           
b8b0: 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c        | SQLITE_L
b8c0: 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e  oadExtension.#en
b8d0: 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71  dif.      ;.  sq
b8e0: 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26 64  lite3HashInit(&d
b8f0: 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69  b->aCollSeq);.#i
b900: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b910: 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20  T_VIRTUALTABLE. 
b920: 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74   sqlite3HashInit
b930: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
b940: 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 70 56  #endif..  db->pV
b950: 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
b960: 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69  _find(zVfs);.  i
b970: 66 28 20 21 64 62 2d 3e 70 56 66 73 20 29 7b 0a  f( !db->pVfs ){.
b980: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
b990: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
b9a0: 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
b9b0: 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25 73  "no such vfs: %s
b9c0: 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 67 6f  ", zVfs);.    go
b9d0: 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
b9e0: 20 7d 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65   }..  /* Add the
b9f0: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
ba00: 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41  on sequence BINA
ba10: 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73  RY. BINARY works
ba20: 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a   for both UTF-8.
ba30: 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c    ** and UTF-16,
ba40: 20 73 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f   so add a versio
ba50: 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76  n for each to av
ba60: 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73  oid any unnecess
ba70: 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73  ary.  ** convers
ba80: 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65  ions. The only e
ba90: 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63  rror that can oc
baa0: 63 75 72 20 68 65 72 65 20 69 73 20 61 20 6d 61  cur here is a ma
bab0: 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a  lloc() failure..
bac0: 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c    */.  createCol
bad0: 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
bae0: 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  RY", SQLITE_UTF8
baf0: 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
bb00: 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
bb10: 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
bb20: 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
bb30: 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  16BE, 0, binColl
bb40: 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
bb50: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
bb60: 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
bb70: 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e  _UTF16LE, 0, bin
bb80: 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
bb90: 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
bba0: 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c  db, "RTRIM", SQL
bbb0: 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a  ITE_UTF8, (void*
bbc0: 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c  )1, binCollFunc,
bbd0: 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d   0);.  if( db->m
bbe0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
bbf0: 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
bc00: 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 70 44  ut;.  }.  db->pD
bc10: 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65  fltColl = sqlite
bc20: 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
bc30: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 42   SQLITE_UTF8, "B
bc40: 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20 61 73  INARY", 0);.  as
bc50: 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43  sert( db->pDfltC
bc60: 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  oll!=0 );..  /* 
bc70: 41 6c 73 6f 20 61 64 64 20 61 20 55 54 46 2d 38  Also add a UTF-8
bc80: 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76   case-insensitiv
bc90: 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  e collation sequ
bca0: 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61 74  ence. */.  creat
bcb0: 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
bcc0: 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f  NOCASE", SQLITE_
bcd0: 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43  UTF8, 0, nocaseC
bce0: 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29  ollatingFunc, 0)
bcf0: 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 66 6c 61 67  ;..  /* Set flag
bd00: 73 20 6f 6e 20 74 68 65 20 62 75 69 6c 74 2d 69  s on the built-i
bd10: 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  n collating sequ
bd20: 65 6e 63 65 73 20 2a 2f 0a 20 20 64 62 2d 3e 70  ences */.  db->p
bd30: 44 66 6c 74 43 6f 6c 6c 2d 3e 74 79 70 65 20 3d  DfltColl->type =
bd40: 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 42 49 4e   SQLITE_COLL_BIN
bd50: 41 52 59 3b 0a 20 20 70 43 6f 6c 6c 20 3d 20 73  ARY;.  pColl = s
bd60: 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
bd70: 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
bd80: 38 2c 20 22 4e 4f 43 41 53 45 22 2c 20 30 29 3b  8, "NOCASE", 0);
bd90: 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 29 7b 0a  .  if( pColl ){.
bda0: 20 20 20 20 70 43 6f 6c 6c 2d 3e 74 79 70 65 20      pColl->type 
bdb0: 3d 20 53 51 4c 49 54 45 5f 43 4f 4c 4c 5f 4e 4f  = SQLITE_COLL_NO
bdc0: 43 41 53 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  CASE;.  }..  /* 
bdd0: 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64  Open the backend
bde0: 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65 72   database driver
bdf0: 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c   */.  db->openFl
be00: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72  ags = flags;.  r
be10: 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
be20: 46 61 63 74 6f 72 79 28 64 62 2c 20 7a 46 69 6c  Factory(db, zFil
be30: 65 6e 61 6d 65 2c 20 30 2c 20 53 51 4c 49 54 45  ename, 0, SQLITE
be40: 5f 44 45 46 41 55 4c 54 5f 43 41 43 48 45 5f 53  _DEFAULT_CACHE_S
be50: 49 5a 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  IZE, .          
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be70: 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45 5f   flags | SQLITE_
be80: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 2c 0a 20 20  OPEN_MAIN_DB,.  
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bea0: 20 20 20 20 20 20 20 20 20 26 64 62 2d 3e 61 44           &db->aD
beb0: 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 69 66 28  b[0].pBt);.  if(
bec0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
bed0: 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  {.    if( rc==SQ
bee0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
bef0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
bf00: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
bf10: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
bf20: 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a  ror(db, rc, 0);.
bf30: 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
bf40: 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61  out;.  }.  db->a
bf50: 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20  Db[0].pSchema = 
bf60: 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74  sqlite3SchemaGet
bf70: 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  (db, db->aDb[0].
bf80: 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  pBt);.  db->aDb[
bf90: 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c  1].pSchema = sql
bfa0: 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64 62  ite3SchemaGet(db
bfb0: 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65  , 0);...  /* The
bfc0: 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f   default safety_
bfd0: 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61  level for the ma
bfe0: 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20 27  in database is '
bff0: 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74  full'; for the t
c000: 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  emp.  ** databas
c010: 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20  e it is 'NONE'. 
c020: 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68 65  This matches the
c030: 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65 66   pager layer def
c040: 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20  aults.  .  */.  
c050: 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65  db->aDb[0].zName
c060: 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d   = "main";.  db-
c070: 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c  >aDb[0].safety_l
c080: 65 76 65 6c 20 3d 20 33 3b 0a 23 69 66 6e 64 65  evel = 3;.#ifnde
c090: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45  f SQLITE_OMIT_TE
c0a0: 4d 50 44 42 0a 20 20 64 62 2d 3e 61 44 62 5b 31  MPDB.  db->aDb[1
c0b0: 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22  ].zName = "temp"
c0c0: 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73  ;.  db->aDb[1].s
c0d0: 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b  afety_level = 1;
c0e0: 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62 2d 3e 6d  .#endif..  db->m
c0f0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
c100: 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20  GIC_OPEN;.  if( 
c110: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c120: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
c130: 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ndb_out;.  }..  
c140: 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20  /* Register all 
c150: 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f  built-in functio
c160: 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61  ns, but do not a
c170: 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74  ttempt to read t
c180: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
c190: 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69   schema yet. Thi
c1a0: 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74  s is delayed unt
c1b0: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  il the first tim
c1c0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  e the database. 
c1d0: 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e   ** is accessed.
c1e0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
c1f0: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
c200: 4f 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  OK, 0);.  sqlite
c210: 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e  3RegisterBuiltin
c220: 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a  Functions(db);..
c230: 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61    /* Load automa
c240: 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d  tic extensions -
c250: 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74   extensions that
c260: 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73   have been regis
c270: 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67  tered.  ** using
c280: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74   the sqlite3_aut
c290: 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e  omatic_extension
c2a0: 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 73  () API..  */.  s
c2b0: 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78  qlite3AutoLoadEx
c2c0: 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20  tensions(db);.  
c2d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
c2e0: 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20  code(db);.  if( 
c2f0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c300: 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
c310: 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 23 69 66 64 65  _out;.  }..#ifde
c320: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
c330: 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS1.  if( !db->
c340: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
c350: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
c360: 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73  qlite3Fts1Init(s
c370: 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
c380: 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e   = sqlite3Fts1In
c390: 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
c3a0: 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
c3b0: 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20  E_ENABLE_FTS2.  
c3c0: 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
c3d0: 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
c3e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78  ITE_OK ){.    ex
c3f0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
c400: 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts2Init(sqlite3
c410: 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
c420: 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29  ite3Fts2Init(db)
c430: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
c440: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c450: 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64  LE_FTS3.  if( !d
c460: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c470: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
c480: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
c490: 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29  ite3Fts3Init(db)
c4a0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
c4b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
c4c0: 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62  LE_ICU.  if( !db
c4d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
c4e0: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
c4f0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
c500: 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a  te3IcuInit(db);.
c510: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
c520: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
c530: 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62  _RTREE.  if( !db
c540: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
c550: 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
c560: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
c570: 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b  e3RtreeInit(db);
c580: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73  .  }.#endif..  s
c590: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
c5a0: 72 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 2d 44  rc, 0);..  /* -D
c5b0: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
c5c0: 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61  OCKING_MODE=1 ma
c5d0: 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20 74 68  kes EXCLUSIVE th
c5e0: 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
c5f0: 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44  g.  ** mode.  -D
c600: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
c610: 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61  OCKING_MODE=0 ma
c620: 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65  ke NORMAL the de
c630: 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20  fault locking.  
c640: 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20  ** mode.  Doing 
c650: 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c 20 61  nothing at all a
c660: 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c  lso makes NORMAL
c670: 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a 20 20   the default..  
c680: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
c690: 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
c6a0: 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74  _MODE.  db->dflt
c6b0: 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54  LockMode = SQLIT
c6c0: 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e  E_DEFAULT_LOCKIN
c6d0: 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65  G_MODE;.  sqlite
c6e0: 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64  3PagerLockingMod
c6f0: 65 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  e(sqlite3BtreePa
c700: 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ger(db->aDb[0].p
c710: 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Bt),.           
c720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
c730: 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
c740: 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e  CKING_MODE);.#en
c750: 64 69 66 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65  dif..  /* Enable
c760: 20 74 68 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d   the lookaside-m
c770: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 20  alloc subsystem 
c780: 2a 2f 0a 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73  */.  setupLookas
c790: 69 64 65 28 64 62 2c 20 30 2c 20 73 71 6c 69 74  ide(db, 0, sqlit
c7a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
c7b0: 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20  zLookaside,.    
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
c7e0: 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69  lConfig.nLookasi
c7f0: 64 65 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74  de);..opendb_out
c800: 3a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20  :.  if( db ){.  
c810: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 75    assert( db->mu
c820: 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72 65  tex!=0 || isThre
c830: 61 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71 6c  adsafe==0 || sql
c840: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
c850: 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20 29  .bFullMutex==0 )
c860: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
c870: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
c880: 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  tex);.  }.  rc =
c890: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
c8a0: 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  (db);.  if( rc==
c8b0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a  SQLITE_NOMEM ){.
c8c0: 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
c8d0: 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20  e(db);.    db = 
c8e0: 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72  0;.  }else if( r
c8f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
c900: 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20      db->magic = 
c910: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43  SQLITE_MAGIC_SIC
c920: 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d  K;.  }.  *ppDb =
c930: 20 64 62 3b 0a 20 20 72 65 74 75 72 6e 20 73 71   db;.  return sq
c940: 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20  lite3ApiExit(0, 
c950: 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  rc);.}../*.** Op
c960: 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
c970: 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
c980: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20   sqlite3_open(. 
c990: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
c9a0: 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
c9b0: 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20  e3 **ppDb .){.  
c9c0: 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62  return openDatab
c9d0: 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ase(zFilename, p
c9e0: 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pDb,.           
c9f0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
ca00: 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
ca10: 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
ca20: 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74  REATE, 0);.}.int
ca30: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
ca40: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
ca50: 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44  filename,   /* D
ca60: 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
ca70: 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
ca80: 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
ca90: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51        /* OUT: SQ
caa0: 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a  Lite db handle *
cab0: 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
cac0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
cad0: 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
cae0: 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20  char *zVfs      
caf0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53    /* Name of VFS
cb00: 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a   module to use *
cb10: 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70  /.){.  return op
cb20: 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e  enDatabase(filen
cb30: 61 6d 65 2c 20 70 70 44 62 2c 20 66 6c 61 67 73  ame, ppDb, flags
cb40: 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e  , zVfs);.}..#ifn
cb50: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
cb60: 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  UTF16./*.** Open
cb70: 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
cb80: 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
cb90: 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20  qlite3_open16(. 
cba0: 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69   const void *zFi
cbb0: 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
cbc0: 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63  e3 **ppDb.){.  c
cbd0: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65  har const *zFile
cbe0: 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c  name8;   /* zFil
cbf0: 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e  ename encoded in
cc00: 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f   UTF-8 instead o
cc10: 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71  f UTF-16 */.  sq
cc20: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61  lite3_value *pVa
cc30: 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  l;.  int rc;..  
cc40: 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
cc50: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
cc60: 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d  pDb );.  *ppDb =
cc70: 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
cc80: 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
cc90: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
cca0: 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
ccb0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
ccc0: 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56 61  rc;.#endif.  pVa
ccd0: 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  l = sqlite3Value
cce0: 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65  New(0);.  sqlite
ccf0: 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61  3ValueSetStr(pVa
cd00: 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65  l, -1, zFilename
cd10: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  , SQLITE_UTF16NA
cd20: 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41  TIVE, SQLITE_STA
cd30: 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  TIC);.  zFilenam
cd40: 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  e8 = sqlite3Valu
cd50: 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49  eText(pVal, SQLI
cd60: 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20  TE_UTF8);.  if( 
cd70: 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20  zFilename8 ){.  
cd80: 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62    rc = openDatab
cd90: 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20  ase(zFilename8, 
cda0: 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ppDb,.          
cdb0: 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
cdc0: 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
cdd0: 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
cde0: 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20  CREATE, 0);.    
cdf0: 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c  assert( *ppDb ||
ce00: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
ce10: 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  M );.    if( rc=
ce20: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44  =SQLITE_OK && !D
ce30: 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70  bHasProperty(*pp
ce40: 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61  Db, 0, DB_Schema
ce50: 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20  Loaded) ){.     
ce60: 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51   ENC(*ppDb) = SQ
ce70: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
ce80: 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
ce90: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
cea0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71  _NOMEM;.  }.  sq
ceb0: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70  lite3ValueFree(p
cec0: 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20  Val);..  return 
ced0: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30  sqlite3ApiExit(0
cee0: 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20  , rc);.}.#endif 
cef0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
cf00: 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
cf10: 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
cf20: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
cf30: 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
cf40: 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
cf50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
cf60: 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20  ate_collation(. 
cf70: 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
cf80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
cf90: 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20  me, .  int enc, 
cfa0: 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20  .  void* pCtx,. 
cfb0: 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28   int(*xCompare)(
cfc0: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
cfd0: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
cfe0: 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  void*).){.  int 
cff0: 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rc;.  sqlite3_mu
d000: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
d010: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
d020: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
d030: 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61  d );.  rc = crea
d040: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
d050: 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74 78  zName, enc, pCtx
d060: 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a  , xCompare, 0);.
d070: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70    rc = sqlite3Ap
d080: 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20  iExit(db, rc);. 
d090: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d0a0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d0b0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
d0c0: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
d0d0: 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20  a new collation 
d0e0: 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68  sequence with th
d0f0: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
d100: 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  e db..*/.int sql
d110: 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
d120: 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69  ation_v2(.  sqli
d130: 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73  te3* db, .  cons
d140: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a  t char *zName, .
d150: 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f    int enc, .  vo
d160: 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28  id* pCtx,.  int(
d170: 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a  *xCompare)(void*
d180: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
d190: 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ,int,const void*
d1a0: 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65 6c 29  ),.  void(*xDel)
d1b0: 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74  (void*).){.  int
d1c0: 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d   rc;.  sqlite3_m
d1d0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
d1e0: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
d1f0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
d200: 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65  ed );.  rc = cre
d210: 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
d220: 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43 74   zName, enc, pCt
d230: 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65  x, xCompare, xDe
d240: 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  l);.  rc = sqlit
d250: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
d260: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
d270: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
d280: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
d290: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
d2a0: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
d2b0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
d2c0: 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
d2d0: 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
d2e0: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
d2f0: 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
d300: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
d310: 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33  ion16(.  sqlite3
d320: 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76  * db, .  const v
d330: 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  oid *zName,.  in
d340: 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20  t enc, .  void* 
d350: 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
d360: 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
d370: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
d380: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
d390: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
d3a0: 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
d3b0: 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65 33  Name8;.  sqlite3
d3c0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
d3d0: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
d3e0: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
d3f0: 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38  iled );.  zName8
d400: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74   = sqlite3Utf16t
d410: 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31  o8(db, zName, -1
d420: 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20  );.  if( zName8 
d430: 29 7b 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61  ){.    rc = crea
d440: 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
d450: 7a 4e 61 6d 65 38 2c 20 65 6e 63 2c 20 70 43 74  zName8, enc, pCt
d460: 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
d470: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
d480: 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a  ee(db, zName8);.
d490: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
d4a0: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
d4b0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
d4c0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
d4d0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
d4e0: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
d4f0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
d500: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
d510: 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  er a collation s
d520: 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20  equence factory 
d530: 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
d540: 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
d550: 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65  e.** db. Replace
d560: 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20   any previously 
d570: 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74  installed collat
d580: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
d590: 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tory..*/.int sql
d5a0: 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
d5b0: 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33  eeded(.  sqlite3
d5c0: 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *db, .  void *p
d5d0: 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a  CollNeededArg, .
d5e0: 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65    void(*xCollNee
d5f0: 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  ded)(void*,sqlit
d600: 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
d610: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
d620: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d630: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
d640: 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
d650: 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  eded = xCollNeed
d660: 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  ed;.  db->xCollN
d670: 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64  eeded16 = 0;.  d
d680: 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
d690: 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
d6a0: 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
d6b0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
d6c0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
d6d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
d6e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
d6f0: 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
d700: 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
d710: 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
d720: 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
d730: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
d740: 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
d750: 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
d760: 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
d770: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
d780: 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
d790: 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
d7a0: 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71  n_needed16(.  sq
d7b0: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f  lite3 *db, .  vo
d7c0: 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41  id *pCollNeededA
d7d0: 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f  rg, .  void(*xCo
d7e0: 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64  llNeeded16)(void
d7f0: 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
d800: 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f  TextRep,const vo
d810: 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  id*).){.  sqlite
d820: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
d830: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
d840: 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b  xCollNeeded = 0;
d850: 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
d860: 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  ed16 = xCollNeed
d870: 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c  ed16;.  db->pCol
d880: 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
d890: 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
d8a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
d8b0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
d8c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
d8d0: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  K;.}.#endif /* S
d8e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
d8f0: 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
d900: 49 54 45 5f 4f 4d 49 54 5f 47 4c 4f 42 41 4c 52  ITE_OMIT_GLOBALR
d910: 45 43 4f 56 45 52 0a 23 69 66 6e 64 65 66 20 53  ECOVER.#ifndef S
d920: 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
d930: 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CATED./*.** This
d940: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77   function is now
d950: 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e   an anachronism.
d960: 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 75   It used to be u
d970: 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66  sed to recover f
d980: 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28  rom a.** malloc(
d990: 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53  ) failure, but S
d9a0: 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74  QLite now does t
d9b0: 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  his automaticall
d9c0: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
d9d0: 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72  3_global_recover
d9e0: 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
d9f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
da00: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ndif.#endif../*.
da10: 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77  ** Test to see w
da20: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
da30: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
da40: 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f  ction is in auto
da50: 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20  commit.** mode. 
da60: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
da70: 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20  it is and FALSE 
da80: 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d  if not.  Autocom
da90: 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a  mit mode is on.*
daa0: 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41  * by default.  A
dab0: 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73  utocommit is dis
dac0: 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e  abled by a BEGIN
dad0: 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
dae0: 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74  eenabled.** by t
daf0: 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f  he next COMMIT o
db00: 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a  r ROLLBACK..**.*
db10: 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20 41  ****** THIS IS A
db20: 4e 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 41  N EXPERIMENTAL A
db30: 50 49 20 41 4e 44 20 49 53 20 53 55 42 4a 45 43  PI AND IS SUBJEC
db40: 54 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a 2a  T TO CHANGE ****
db50: 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
db60: 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
db70: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
db80: 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f   return db->auto
db90: 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 23 69 66 64 65  Commit;.}..#ifde
dba0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
dbb0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
dbc0: 6e 67 20 72 6f 75 74 69 6e 65 20 69 73 20 73 75  ng routine is su
dbd0: 62 74 69 74 75 74 65 64 20 66 6f 72 20 63 6f 6e  btituted for con
dbe0: 73 74 61 6e 74 20 53 51 4c 49 54 45 5f 43 4f 52  stant SQLITE_COR
dbf0: 52 55 50 54 20 69 6e 0a 2a 2a 20 64 65 62 75 67  RUPT in.** debug
dc00: 67 69 6e 67 20 62 75 69 6c 64 73 2e 20 20 54 68  ging builds.  Th
dc10: 69 73 20 70 72 6f 76 69 64 65 73 20 61 20 77 61  is provides a wa
dc20: 79 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b  y to set a break
dc30: 70 6f 69 6e 74 20 66 6f 72 20 77 68 65 6e 0a 2a  point for when.*
dc40: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 69 73 20  * corruption is 
dc50: 66 69 72 73 74 20 64 65 74 65 63 74 65 64 2e 0a  first detected..
dc60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 6f  */.int sqlite3Co
dc70: 72 72 75 70 74 28 76 6f 69 64 29 7b 0a 20 20 72  rrupt(void){.  r
dc80: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
dc90: 52 55 50 54 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  RUPT;.}.#endif..
dca0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
dcb0: 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
dcc0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63  *.** This is a c
dcd0: 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69  onvenience routi
dce0: 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ne that makes su
dcf0: 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65  re that all thre
dd00: 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64  ad-specific.** d
dd10: 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72  ata for this thr
dd20: 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61  ead has been dea
dd30: 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
dd40: 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72  SQLite no longer
dd50: 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65   uses thread-spe
dd60: 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68  cific data so th
dd70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
dd80: 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49  w a.** no-op.  I
dd90: 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f  t is retained fo
dda0: 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d  r historical com
ddb0: 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76  patibility..*/.v
ddc0: 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65  oid sqlite3_thre
ddd0: 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29  ad_cleanup(void)
dde0: 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  {.}.#endif../*.*
ddf0: 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e  * Return meta in
de00: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
de10: 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d  a specific colum
de20: 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  n of a database 
de30: 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  table..** See co
de40: 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33  mment in sqlite3
de50: 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29  .h (sqlite.h.in)
de60: 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
de70: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
de80: 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
de90: 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65  ADATA.int sqlite
dea0: 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
deb0: 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74  etadata(.  sqlit
dec0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
ded0: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
dee0: 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  tion handle */. 
def0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
df00: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
df10: 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72  Database name or
df20: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
df30: 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d   char *zTableNam
df40: 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  e,     /* Table 
df50: 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  name */.  const 
df60: 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d  char *zColumnNam
df70: 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  e,    /* Column 
df80: 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  name */.  char c
df90: 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70  onst **pzDataTyp
dfa0: 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  e,    /* OUTPUT:
dfb0: 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74   Declared data t
dfc0: 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ype */.  char co
dfd0: 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c  nst **pzCollSeq,
dfe0: 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
dff0: 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
e000: 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  ce name */.  int
e010: 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20   *pNotNull,     
e020: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
e030: 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20  UT: True if NOT 
e040: 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20  NULL constraint 
e050: 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20  exists */.  int 
e060: 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20  *pPrimaryKey,   
e070: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
e080: 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
e090: 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a  n part of PK */.
e0a0: 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20    int *pAutoinc 
e0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e0c0: 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
e0d0: 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d   column is auto-
e0e0: 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  increment */.){.
e0f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
e100: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
e110: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
e120: 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
e130: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
e140: 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ;..  char const 
e150: 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a  *zDataType = 0;.
e160: 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43    char const *zC
e170: 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e  ollSeq = 0;.  in
e180: 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20  t notnull = 0;. 
e190: 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20   int primarykey 
e1a0: 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69  = 0;.  int autoi
e1b0: 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e  nc = 0;..  /* En
e1c0: 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
e1d0: 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65  e schema has bee
e1e0: 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71  n loaded */.  sq
e1f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
e200: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
e210: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 53 61 66  (void)sqlite3Saf
e220: 65 74 79 4f 6e 28 64 62 29 3b 0a 20 20 73 71 6c  etyOn(db);.  sql
e230: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
e240: 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73 71  l(db);.  rc = sq
e250: 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26 7a  lite3Init(db, &z
e260: 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 53  ErrMsg);.  if( S
e270: 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a  QLITE_OK!=rc ){.
e280: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
e290: 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f  ut;.  }..  /* Lo
e2a0: 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20 69  cate the table i
e2b0: 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20 20  n question */.  
e2c0: 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46 69  pTab = sqlite3Fi
e2d0: 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61 62  ndTable(db, zTab
e2e0: 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65 29  leName, zDbName)
e2f0: 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c 7c  ;.  if( !pTab ||
e300: 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20 29   pTab->pSelect )
e310: 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a  {.    pTab = 0;.
e320: 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f      goto error_o
e330: 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46 69  ut;.  }..  /* Fi
e340: 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66 6f  nd the column fo
e350: 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73 20  r which info is 
e360: 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20 69  requested */.  i
e370: 66 28 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69  f( sqlite3IsRowi
e380: 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29  d(zColumnName) )
e390: 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54 61  {.    iCol = pTa
e3a0: 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 69 66  b->iPKey;.    if
e3b0: 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20  ( iCol>=0 ){.   
e3c0: 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d     pCol = &pTab-
e3d0: 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20  >aCol[iCol];.   
e3e0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
e3f0: 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c  for(iCol=0; iCol
e400: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f  <pTab->nCol; iCo
e410: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  l++){.      pCol
e420: 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b 69   = &pTab->aCol[i
e430: 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  Col];.      if( 
e440: 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43 6d  0==sqlite3StrICm
e450: 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pCol->zName, z
e460: 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20  ColumnName) ){. 
e470: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
e480: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
e490: 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e  if( iCol==pTab->
e4a0: 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70 54  nCol ){.      pT
e4b0: 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f  ab = 0;.      go
e4c0: 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20  to error_out;.  
e4d0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68    }.  }..  /* Th
e4e0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63  e following bloc
e4f0: 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65 74  k stores the met
e500: 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74 68  a information th
e510: 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72  at will be retur
e520: 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ned.  ** to the 
e530: 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c 20  caller in local 
e540: 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61 54  variables zDataT
e550: 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e  ype, zCollSeq, n
e560: 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79 6b  otnull, primaryk
e570: 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74 6f  ey.  ** and auto
e580: 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f 69  inc. At this poi
e590: 6e 74 20 74 68 65 72 65 20 61 72 65 20 74 77 6f  nt there are two
e5a0: 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a 0a   possibilities:.
e5b0: 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20 31    ** .  **     1
e5c0: 2e 20 54 68 65 20 73 70 65 63 69 66 69 65 64 20  . The specified 
e5d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73 20  column name was 
e5e0: 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f 72  rowid", "oid" or
e5f0: 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a 2a   "_rowid_" .  **
e600: 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65 72          and ther
e610: 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69 74  e is no explicit
e620: 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b 20  ly declared IPK 
e630: 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20  column. .  **.  
e640: 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74 61  **     2. The ta
e650: 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69 65  ble is not a vie
e660: 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e  w and the column
e670: 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65 64   name identified
e680: 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20 20   an .  **       
e690: 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63 6c   explicitly decl
e6a0: 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70  ared column. Cop
e6b0: 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  y meta informati
e6c0: 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20  on from *pCol.. 
e6d0: 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c 20   */ .  if( pCol 
e6e0: 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70 65  ){.    zDataType
e6f0: 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a   = pCol->zType;.
e700: 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 70      zCollSeq = p
e710: 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20  Col->zColl;.    
e720: 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e  notnull = pCol->
e730: 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20 20  notNull!=0;.    
e740: 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 70 43  primarykey  = pC
e750: 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65 79 21 3d 30  ol->isPrimKey!=0
e760: 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20  ;.    autoinc = 
e770: 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f  pTab->iPKey==iCo
e780: 6c 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46  l && (pTab->tabF
e790: 6c 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e  lags & TF_Autoin
e7a0: 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d  crement)!=0;.  }
e7b0: 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54  else{.    zDataT
e7c0: 79 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b  ype = "INTEGER";
e7d0: 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20  .    primarykey 
e7e0: 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  = 1;.  }.  if( !
e7f0: 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20  zCollSeq ){.    
e800: 7a 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41  zCollSeq = "BINA
e810: 52 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f  RY";.  }..error_
e820: 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74  out:.  sqlite3Bt
e830: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
e840: 0a 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33  .  (void)sqlite3
e850: 53 61 66 65 74 79 4f 66 66 28 64 62 29 3b 0a 0a  SafetyOff(db);..
e860: 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 65    /* Whether the
e870: 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 73   function call s
e880: 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69 6c  ucceeded or fail
e890: 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74 70  ed, set the outp
e8a0: 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20 20  ut parameters.  
e8b0: 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20 74  ** to whatever t
e8c0: 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e 74  heir local count
e8d0: 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e 2e  erparts contain.
e8e0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69 64   If an error did
e8f0: 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68 69   occur,.  ** thi
e900: 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63 74  s has the effect
e910: 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c 20   of zeroing all 
e920: 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65 72  output parameter
e930: 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 7a  s..  */.  if( pz
e940: 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44 61  DataType ) *pzDa
e950: 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54 79  taType = zDataTy
e960: 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c 6c  pe;.  if( pzColl
e970: 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65 71  Seq ) *pzCollSeq
e980: 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20 69   = zCollSeq;.  i
e990: 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a 70  f( pNotNull ) *p
e9a0: 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75 6c  NotNull = notnul
e9b0: 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61 72  l;.  if( pPrimar
e9c0: 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72 79  yKey ) *pPrimary
e9d0: 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65 79  Key = primarykey
e9e0: 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e 63  ;.  if( pAutoinc
e9f0: 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20 61   ) *pAutoinc = a
ea00: 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20 53  utoinc;..  if( S
ea10: 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26 20  QLITE_OK==rc && 
ea20: 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71 6c  !pTab ){.    sql
ea30: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
ea40: 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45 72  ErrMsg);.    zEr
ea50: 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50  rMsg = sqlite3MP
ea60: 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73 75  rintf(db, "no su
ea70: 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 3a  ch table column:
ea80: 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65 4e   %s.%s", zTableN
ea90: 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43 6f  ame,.        zCo
eaa0: 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 72  lumnName);.    r
eab0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
eac0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45  ;.  }.  sqlite3E
ead0: 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 28 7a 45  rror(db, rc, (zE
eae0: 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a  rrMsg?"%s":0), z
eaf0: 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
eb00: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
eb10: 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71  rMsg);.  rc = sq
eb20: 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
eb30: 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
eb40: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
eb50: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
eb60: 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
eb70: 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
eb80: 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
eb90: 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
eba0: 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
ebb0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
ebc0: 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20  sleep(int ms){. 
ebd0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
ebe0: 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
ebf0: 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
ec00: 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
ec10: 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75  ( pVfs==0 ) retu
ec20: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rn 0;..  /* This
ec30: 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
ec40: 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  in milliseconds,
ec50: 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79   but the underly
ec60: 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20  ing OsSleep() . 
ec70: 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63   ** API uses mic
ec80: 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65  roseconds. Hence
ec90: 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a   the 1000's..  *
eca0: 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65  /.  rc = (sqlite
ecb0: 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31  3OsSleep(pVfs, 1
ecc0: 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20  000*ms)/1000);. 
ecd0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
ece0: 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
ecf0: 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e  isable the exten
ed00: 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73  ded result codes
ed10: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ed20: 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
ed30: 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a  _codes(sqlite3 *
ed40: 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a  db, int onoff){.
ed50: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
ed60: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
ed70: 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
ed80: 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66  = onoff ? 0xffff
ed90: 66 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73  ffff : 0xff;.  s
eda0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
edb0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
edc0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
edd0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  K;.}../*.** Invo
ede0: 6b 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74  ke the xFileCont
edf0: 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20  rol method on a 
ee00: 70 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62  particular datab
ee10: 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ase..*/.int sqli
ee20: 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c  te3_file_control
ee30: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
ee40: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
ee50: 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
ee60: 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63  *pArg){.  int rc
ee70: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
ee80: 0a 20 20 69 6e 74 20 69 44 62 3b 0a 20 20 73 71  .  int iDb;.  sq
ee90: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
eea0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
eeb0: 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d 30 20 29  if( zDbName==0 )
eec0: 7b 0a 20 20 20 20 69 44 62 20 3d 20 30 3b 0a 20  {.    iDb = 0;. 
eed0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
eee0: 69 44 62 3d 30 3b 20 69 44 62 3c 64 62 2d 3e 6e  iDb=0; iDb<db->n
eef0: 44 62 3b 20 69 44 62 2b 2b 29 7b 0a 20 20 20 20  Db; iDb++){.    
ef00: 20 20 69 66 28 20 73 74 72 63 6d 70 28 64 62 2d    if( strcmp(db-
ef10: 3e 61 44 62 5b 69 44 62 5d 2e 7a 4e 61 6d 65 2c  >aDb[iDb].zName,
ef20: 20 7a 44 62 4e 61 6d 65 29 3d 3d 30 20 29 20 62   zDbName)==0 ) b
ef30: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
ef40: 20 20 69 66 28 20 69 44 62 3c 64 62 2d 3e 6e 44    if( iDb<db->nD
ef50: 62 20 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  b ){.    Btree *
ef60: 70 42 74 72 65 65 20 3d 20 64 62 2d 3e 61 44 62  pBtree = db->aDb
ef70: 5b 69 44 62 5d 2e 70 42 74 3b 0a 20 20 20 20 69  [iDb].pBt;.    i
ef80: 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
ef90: 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
efa0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
efb0: 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 20 20  file *fd;.      
efc0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
efd0: 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 20  r(pBtree);.     
efe0: 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65   pPager = sqlite
eff0: 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74 72  3BtreePager(pBtr
f000: 65 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ee);.      asser
f010: 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
f020: 20 20 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74        fd = sqlit
f030: 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
f040: 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
f050: 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20  t( fd!=0 );.    
f060: 20 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f    if( fd->pMetho
f070: 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ds ){.        rc
f080: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
f090: 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20  Control(fd, op, 
f0a0: 70 41 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pArg);.      }. 
f0b0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
f0c0: 65 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a  eLeave(pBtree);.
f0d0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
f0e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f0f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f100: 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f  turn rc;   .}../
f110: 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  *.** Interface t
f120: 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f  o the testing lo
f130: 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  gic..*/.int sqli
f140: 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
f150: 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20  (int op, ...){. 
f160: 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66   int rc = 0;.#if
f170: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f180: 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20  _BUILTIN_TEST.  
f190: 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
f1a0: 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a  _start(ap, op);.
f1b0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
f1c0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
f1d0: 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
f1e0: 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
f1f0: 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  G..    */.    ca
f200: 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
f210: 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a  RL_PRNG_SAVE: {.
f220: 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
f230: 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20  gSaveState();.  
f240: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f250: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
f260: 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74  Restore the stat
f270: 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f  e of the PRNG to
f280: 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20   the last state 
f290: 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20  saved using.    
f2a0: 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49  ** PRNG_SAVE.  I
f2b0: 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20  f PRNG_SAVE has 
f2c0: 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65  never before bee
f2d0: 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20  n called, then. 
f2e0: 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20     ** this verb 
f2f0: 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52  acts like PRNG_R
f300: 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ESET..    */.   
f310: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
f320: 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f  TCTRL_PRNG_RESTO
f330: 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  RE: {.      sqli
f340: 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74  te3PrngRestoreSt
f350: 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
f360: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
f370: 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74  *.    ** Reset t
f380: 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20  he PRNG back to 
f390: 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  its uninitialize
f3a0: 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65  d state.  The ne
f3b0: 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  xt call.    ** t
f3c0: 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  o sqlite3_random
f3d0: 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65  ness() will rese
f3e0: 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e  ed the PRNG usin
f3f0: 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a  g a single call.
f400: 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52      ** to the xR
f410: 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64  andomness method
f420: 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
f430: 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  VFS..    */.    
f440: 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
f450: 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a  CTRL_PRNG_RESET:
f460: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
f470: 50 72 6e 67 52 65 73 65 74 53 74 61 74 65 28 29  PrngResetState()
f480: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f490: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
f4a0: 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
f4b0: 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43  t_control(BITVEC
f4c0: 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f  _TEST, size, pro
f4d0: 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20  gram).    **.   
f4e0: 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61   ** Run a test a
f4f0: 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20  gainst a Bitvec 
f500: 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20  object of size. 
f510: 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67   The program arg
f520: 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20  ument.    ** is 
f530: 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65  an array of inte
f540: 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65  gers that define
f550: 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74  s the test.  Ret
f560: 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20  urn -1 on a.    
f570: 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
f580: 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e  tion error, 0 on
f590: 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e   success, or non
f5a0: 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72  -zero for an err
f5b0: 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  or..    ** See t
f5c0: 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  he sqlite3Bitvec
f5d0: 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f  BuiltinTest() fo
f5e0: 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
f5f0: 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
f600: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
f610: 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43  _TESTCTRL_BITVEC
f620: 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69  _TEST: {.      i
f630: 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
f640: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
f650: 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61  nt *aProg = va_a
f660: 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20  rg(ap, int*);.  
f670: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f680: 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73  BitvecBuiltinTes
f690: 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20  t(sz, aProg);.  
f6a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
f6b0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
f6c0: 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
f6d0: 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c  ntrol(BENIGN_MAL
f6e0: 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69  LOC_HOOKS, xBegi
f6f0: 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a  n, xEnd).    **.
f700: 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20      ** Register 
f710: 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f  hooks to call to
f720: 20 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20   indicate which 
f730: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
f740: 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65  s .    ** are be
f750: 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nign..    */.   
f760: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
f770: 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c  TCTRL_BENIGN_MAL
f780: 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20  LOC_HOOKS: {.   
f790: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20     typedef void 
f7a0: 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29  (*void_function)
f7b0: 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f  (void);.      vo
f7c0: 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
f7d0: 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20  ignBegin;.      
f7e0: 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
f7f0: 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20  enignEnd;.      
f800: 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76  xBenignBegin = v
f810: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
f820: 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
f830: 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f  xBenignEnd = va_
f840: 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
f850: 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71  ction);.      sq
f860: 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f  lite3BenignMallo
f870: 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65  cHooks(xBenignBe
f880: 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29  gin, xBenignEnd)
f890: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f8a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
f8b0: 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
f8c0: 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
f8d0: 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e  _TESTCTRL_PENDIN
f8e0: 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64  G_BYTE, unsigned
f8f0: 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
f900: 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45     ** Set the PE
f910: 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68  NDING byte to th
f920: 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61  e value in the a
f930: 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e  rgument, if X>0.
f940: 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20  .    ** Make no 
f950: 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e  changes if X==0.
f960: 20 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c    Return the val
f970: 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e  ue of the pendin
f980: 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73  g byte.    ** as
f990: 20 69 74 20 65 78 69 73 74 69 6e 67 20 62 65 66   it existing bef
f9a0: 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ore this routine
f9b0: 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20   was called..   
f9c0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52   **.    ** IMPOR
f9d0: 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20  TANT:  Changing 
f9e0: 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
f9f0: 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30   from 0x40000000
fa00: 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20   results in.    
fa10: 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62  ** an incompatib
fa20: 6c 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  le database file
fa30: 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69   format.  Changi
fa40: 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62  ng the PENDING b
fa50: 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65  yte.    ** while
fa60: 20 61 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f   any database co
fa70: 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e  nnection is open
fa80: 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65   results in unde
fa90: 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a  fined and.    **
faa0: 20 64 69 6c 65 74 65 72 69 6f 75 73 20 62 65 68   dileterious beh
fab0: 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20  avior..    */.  
fac0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
fad0: 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
fae0: 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 75 6e 73  YTE: {.      uns
faf0: 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c  igned int newVal
fb00: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e   = va_arg(ap, un
fb10: 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20  signed int);.   
fb20: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
fb30: 65 6e 64 69 6e 67 42 79 74 65 3b 0a 20 20 20 20  endingByte;.    
fb40: 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73    if( newVal ) s
fb50: 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74  qlite3PendingByt
fb60: 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20  e = newVal;.    
fb70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
fb80: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
fb90: 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
fba0: 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
fbb0: 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20  TRL_ASSERT, int 
fbc0: 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  X).    **.    **
fbd0: 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f   This action pro
fbe0: 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65  vides a run-time
fbf0: 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65   test to see whe
fc00: 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20  ther or not.    
fc10: 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20  ** assert() was 
fc20: 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
fc30: 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69  le-time.  If X i
fc40: 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72  s true and asser
fc50: 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e  t().    ** is en
fc60: 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20  abled, then the 
fc70: 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
fc80: 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74  true.  If X is t
fc90: 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61  rue and.    ** a
fca0: 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
fcb0: 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65  led, then the re
fcc0: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
fcd0: 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20  ro.  If X is.   
fce0: 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73   ** false and as
fcf0: 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
fd00: 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65  d, then the asse
fd10: 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20  rtion fires and 
fd20: 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65  the.    ** proce
fd30: 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58  ss aborts.  If X
fd40: 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73   is false and as
fd50: 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
fd60: 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20  ed, then the.   
fd70: 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65   ** return value
fd80: 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   is zero..    */
fd90: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
fda0: 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
fdb0: 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69  : {.      volati
fdc0: 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20  le int x = 0;.  
fdd0: 20 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d      assert( (x =
fde0: 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29   va_arg(ap,int))
fdf0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20  !=0 );.      rc 
fe00: 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = x;.      break
fe10: 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a  ;.    }...    /*
fe20: 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
fe30: 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
fe40: 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c  LITE_TESTCTRL_AL
fe50: 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20  WAYS, int X).   
fe60: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
fe70: 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
fe80: 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
fe90: 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41  to see how the A
fea0: 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a  LWAYS and.    **
feb0: 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65   NEVER macros we
fec0: 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f  re defined at co
fed0: 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20  mpile-time..    
fee0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
fef0: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c  turn value is AL
ff00: 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a  WAYS(X).  .    *
ff10: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63  *.    ** The rec
ff20: 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73  ommended test is
ff30: 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72   X==2.  If the r
ff40: 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32  eturn value is 2
ff50: 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20  , that means.   
ff60: 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64   ** ALWAYS() and
ff70: 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74   NEVER() are bot
ff80: 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  h no-op pass-thr
ff90: 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69  ough macros, whi
ffa0: 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a  ch is the.    **
ffb0: 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67   default setting
ffc0: 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
ffd0: 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65   value is 1, the
ffe0: 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69  n ALWAYS() is ei
fff0: 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64  ther.    ** hard
10000 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f  -coded to true o
10010 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74  r else it assert
10020 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e  s if its argumen
10030 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  t is false..    
10040 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68  ** The first beh
10050 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65  avior (hard-code
10060 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68  d to true) is th
10070 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a  e case if.    **
10080 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
10090 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68  _ASSERT shows th
100a0 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64  at assert() is d
100b0 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20  isabled and the 
100c0 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65  second.    ** be
100d0 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69  havior (assert i
100e0 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74  f the argument t
100f0 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61  o ALWAYS() is fa
10100 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65  lse) is the case
10110 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
10120 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
10130 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
10140 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
10150 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
10160 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  The run-time tes
10170 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68  t procedure migh
10180 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67  t look something
10190 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20   like this:.    
101a0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28  **.    **    if(
101b0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
101c0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
101d0 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29  TCTRL_ALWAYS, 2)
101e0 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20  ==2 ){.    **   
101f0 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61     // ALWAYS() a
10200 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e  nd NEVER() are n
10210 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67  o-op pass-throug
10220 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20  h macros.    ** 
10230 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c     }else if( sql
10240 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
10250 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
10260 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a  L_ASSERT, 1) ){.
10270 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
10280 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73  LWAYS(x) asserts
10290 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e   that x is true.
102a0 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74   NEVER(x) assert
102b0 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20  s x is false..  
102c0 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    **    }else{. 
102d0 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
102e0 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e  WAYS(x) is a con
102f0 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28  stant 1.  NEVER(
10300 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
10310 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a   0..    **    }.
10320 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
10330 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
10340 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20  ALWAYS: {.      
10350 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
10360 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63  p,int);.      rc
10370 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20   = ALWAYS(x);.  
10380 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
10390 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
103a0 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
103b0 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
103c0 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75 72  _TEST */.  retur
103d0 6e 20 72 63 3b 0a 7d 0a                          n rc;.}.