/ Hex Artifact Content
Login

Artifact e5bcc6d9cf791a25ebfa4e3029293ac56939824a:


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: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66  u.h".#endif..#if
0320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0330: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0340: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0350: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0360: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0370: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0380: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
0390: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
03a0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
03b0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03d0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03e0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
03f0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0400: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0410: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0420: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0430: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0450: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0460: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0470: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0480: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0490: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
04a0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
04b0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
04c0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
04d0: 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30 30  F: R-63124-39300
04e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
04f0: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0500: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0510: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0520: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0530: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0540: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0550: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0560: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0570: 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ro. .*/.const ch
0580: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72  ar *sqlite3_sour
0590: 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74 75  ceid(void){ retu
05a0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  rn SQLITE_SOURCE
05b0: 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45  _ID; }../* IMPLE
05c0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
05d0: 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65 20  35210-63508 The 
05e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
05f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e 63  on_number() func
0600: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
0610: 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61 6c  an integer equal
0620: 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53 49   to SQLITE_VERSI
0630: 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e  ON_NUMBER..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  t sqlite3_libver
0650: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64  sion_number(void
0660: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0670: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b  _VERSION_NUMBER;
0680: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0690: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30 37 39  ATION-OF: R-2079
06a0: 30 2d 31 34 30 32 35 20 54 68 65 20 73 71 6c 69  0-14025 The sqli
06b0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
06c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
06d0: 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64  s.** zero if and
06e0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65 20   only if SQLite 
06f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
0700: 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64 65 20  h mutexing code 
0710: 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f 0a 2a  omitted due to.*
0720: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  * the SQLITE_THR
0730: 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c 65 2d  EADSAFE compile-
0740: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65 69 6e  time option bein
0750: 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69  g set to 0..*/.i
0760: 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  nt sqlite3_threa
0770: 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65 74  dsafe(void){ ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45 41  urn SQLITE_THREA
0790: 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21 64  DSAFE; }..#if !d
07a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
07b0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
07c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
07d0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
07e0: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
07f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  ng function poin
0800: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
0810: 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45  and if.** SQLITE
0820: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
0830: 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
0840: 20 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69   messages descri
0850: 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69  bing.** I/O acti
0860: 76 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75  ve are written u
0870: 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  sing this functi
0880: 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61  on.  These messa
0890: 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  ges.** are inten
08a0: 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ded for debuggin
08b0: 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e  g activity only.
08c0: 0a 2a 2f 0a 2f 2a 20 6e 6f 74 2d 70 72 69 76 61  .*/./* not-priva
08d0: 74 65 20 2a 2f 20 76 6f 69 64 20 28 2a 73 71 6c  te */ void (*sql
08e0: 69 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e  ite3IoTrace)(con
08f0: 73 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d  st char*, ...) =
0900: 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   0;.#endif../*.*
0910: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
0920: 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  ng global variab
0930: 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73  le points to a s
0940: 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74  tring which is t
0950: 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20  he.** name of a 
0960: 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20  directory, then 
0970: 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77  that directory w
0980: 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73  ill be used to s
0990: 74 6f 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72  tore.** temporar
09a0: 79 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  y files..**.** S
09b0: 65 65 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41  ee also the "PRA
09c0: 47 4d 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64  GMA temp_store_d
09d0: 69 72 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f  irectory" SQL co
09e0: 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a  mmand..*/.char *
09f0: 73 71 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72  sqlite3_temp_dir
0a00: 65 63 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a  ectory = 0;../*.
0a10: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
0a20: 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61  ing global varia
0a30: 62 6c 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20  ble points to a 
0a40: 73 74 72 69 6e 67 20 77 68 69 63 68 20 69 73 20  string which is 
0a50: 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61  the.** name of a
0a60: 20 64 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e   directory, then
0a70: 20 74 68 61 74 20 64 69 72 65 63 74 6f 72 79 20   that directory 
0a80: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
0a90: 73 74 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74  store.** all dat
0aa0: 61 62 61 73 65 20 66 69 6c 65 73 20 73 70 65 63  abase files spec
0ab0: 69 66 69 65 64 20 77 69 74 68 20 61 20 72 65 6c  ified with a rel
0ac0: 61 74 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a  ative pathname..
0ad0: 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74  **.** See also t
0ae0: 68 65 20 22 50 52 41 47 4d 41 20 64 61 74 61 5f  he "PRAGMA data_
0af0: 73 74 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22  store_directory"
0b00: 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   SQL command..*/
0b10: 0a 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64  .char *sqlite3_d
0b20: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
0b30: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  0;../*.** Initia
0b40: 6c 69 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a  lize SQLite.  .*
0b50: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
0b60: 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  e must be called
0b70: 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74   to initialize t
0b80: 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  he memory alloca
0b90: 74 69 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e  tion,.** VFS, an
0ba0: 64 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  d mutex subsyste
0bb0: 6d 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ms prior to doin
0bc0: 67 20 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f  g any serious wo
0bd0: 72 6b 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74  rk with.** SQLit
0be0: 65 2e 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20  e.  But as long 
0bf0: 61 73 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f  as you do not co
0c00: 6d 70 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54  mpile with SQLIT
0c10: 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
0c20: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
0c30: 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61  will be called a
0c40: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20  utomatically by 
0c50: 6b 65 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63  key routines suc
0c60: 68 20 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  h as.** sqlite3_
0c70: 6f 70 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20  open().  .**.** 
0c80: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
0c90: 61 20 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f  a no-op except o
0ca0: 6e 20 69 74 73 20 76 65 72 79 20 66 69 72 73 74  n its very first
0cb0: 20 63 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72   call for the pr
0cc0: 6f 63 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72  ocess,.** or for
0cd0: 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
0ce0: 61 66 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20  after a call to 
0cf0: 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e  sqlite3_shutdown
0d00: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
0d10: 74 20 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c  t thread to call
0d20: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   this routine ru
0d30: 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a  ns the initializ
0d40: 61 74 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70  ation to.** comp
0d50: 6c 65 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73  letion.  If subs
0d60: 65 71 75 65 6e 74 20 74 68 72 65 61 64 73 20 63  equent threads c
0d70: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
0d80: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
0d90: 74 0a 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20  t.** thread has 
0da0: 66 69 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69  finished the ini
0db0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63  tialization proc
0dc0: 65 73 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75  ess, then the su
0dd0: 62 73 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65  bsequent.** thre
0de0: 61 64 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75  ads must block u
0df0: 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20 74  ntil the first t
0e00: 68 72 65 61 64 20 66 69 6e 69 73 68 65 73 20 77  hread finishes w
0e10: 69 74 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69  ith the initiali
0e20: 7a 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  zation..**.** Th
0e30: 65 20 66 69 72 73 74 20 74 68 72 65 61 64 20 6d  e first thread m
0e40: 69 67 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72  ight call this r
0e50: 6f 75 74 69 6e 65 20 72 65 63 75 72 73 69 76 65  outine recursive
0e60: 6c 79 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a  ly.  Recursive.*
0e70: 2a 20 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20  * calls to this 
0e80: 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e  routine should n
0e90: 6f 74 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75  ot block, of cou
0ea0: 72 73 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  rse.  Otherwise 
0eb0: 74 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  the.** initializ
0ec0: 61 74 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f  ation process wo
0ed0: 75 6c 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65  uld never comple
0ee0: 74 65 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20  te..**.** Let X 
0ef0: 62 65 20 74 68 65 20 66 69 72 73 74 20 74 68 72  be the first thr
0f00: 65 61 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69  ead to enter thi
0f10: 73 20 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20  s routine.  Let 
0f20: 59 20 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a  Y be some other.
0f30: 2a 2a 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e  ** thread.  Then
0f40: 20 77 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69   while the initi
0f50: 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66  al invocation of
0f60: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79   this routine by
0f70: 20 58 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c   X is.** incompl
0f80: 65 74 65 2c 20 69 74 20 69 73 20 72 65 71 75 69  ete, it is requi
0f90: 72 65 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20  red that:.**.** 
0fa0: 20 20 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74     *  Calls to t
0fb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d  his routine from
0fc0: 20 59 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e   Y must block un
0fd0: 74 69 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f  til the outer-mo
0fe0: 73 74 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c  st.**       call
0ff0: 20 62 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e   by X completes.
1000: 0a 2a 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63  .**.**    *  Rec
1010: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20  ursive calls to 
1020: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f  this routine fro
1030: 6d 20 74 68 72 65 61 64 20 58 20 72 65 74 75 72  m thread X retur
1040: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a  n immediately.**
1050: 20 20 20 20 20 20 20 77 69 74 68 6f 75 74 20 62         without b
1060: 6c 6f 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  locking..*/.int 
1070: 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69  sqlite3_initiali
1080: 7a 65 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45  ze(void){.  MUTE
1090: 58 5f 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33  X_LOGIC( sqlite3
10a0: 5f 6d 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b  _mutex *pMaster;
10b0: 20 29 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20   )       /* The 
10c0: 6d 61 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65  main static mute
10d0: 78 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  x */.  int rc;  
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1100: 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f      /* Result co
1110: 64 65 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  de */.#ifdef SQL
1120: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
1130: 20 69 6e 74 20 62 52 75 6e 45 78 74 72 61 49 6e   int bRunExtraIn
1140: 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  it = 0;         
1150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1160: 20 45 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a   Extra initializ
1170: 61 74 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a  ation needed */.
1180: 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1190: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20  QLITE_OMIT_WSD. 
11a0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73   rc = sqlite3_ws
11b0: 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29  d_init(4096, 24)
11c0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
11d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
11e0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64  urn rc;.  }.#end
11f0: 69 66 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69  if..  /* If SQLi
1200: 74 65 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f  te is already co
1210: 6d 70 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c  mpletely initial
1220: 69 7a 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20  ized, then this 
1230: 63 61 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c  call.  ** to sql
1240: 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
1250: 29 20 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f  ) should be a no
1260: 2d 6f 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e  -op.  But the in
1270: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a  itialization.  *
1280: 2a 20 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65  * must be comple
1290: 74 65 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d  te.  So isInit m
12a0: 75 73 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75  ust not be set u
12b0: 6e 74 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e  ntil the very en
12c0: 64 0a 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72  d.  ** of this r
12d0: 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69  outine..  */.  i
12e0: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
12f0: 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20  Config.isInit ) 
1300: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1310: 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  ;..  /* Make sur
1320: 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73  e the mutex subs
1330: 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c  ystem is initial
1340: 69 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65  ized.  If unable
1350: 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61   to .  ** initia
1360: 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73  lize the mutex s
1370: 75 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e  ubsystem, return
1380: 20 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20   early with the 
1390: 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74  error..  ** If t
13a0: 68 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20  he system is so 
13b0: 73 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65  sick that we are
13c0: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
13d0: 61 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a  ate a mutex,.  *
13e0: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d  * there is not m
13f0: 75 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f  uch SQLite is go
1400: 69 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74  ing to be able t
1410: 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  o do..  **.  ** 
1420: 54 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  The mutex subsys
1430: 74 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61  tem must take ca
1440: 72 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e  re of serializin
1450: 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69  g its own.  ** i
1460: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20  nitialization.. 
1470: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
1480: 65 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20  e3MutexInit();. 
1490: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
14a0: 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69   rc;..  /* Initi
14b0: 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63  alize the malloc
14c0: 28 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68  () system and th
14d0: 65 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69  e recursive pIni
14e0: 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20  tMutex mutex..  
14f0: 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f  ** This operatio
1500: 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  n is protected b
1510: 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53  y the STATIC_MAS
1520: 54 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65  TER mutex.  Note
1530: 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78   that.  ** Mutex
1540: 41 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65  Alloc() is calle
1550: 64 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d  d for a static m
1560: 75 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e  utex prior to in
1570: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20  itializing the. 
1580: 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79   ** malloc subsy
1590: 73 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c  stem - this impl
15a0: 69 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c  ies that the all
15b0: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61  ocation of a sta
15c0: 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d  tic.  ** mutex m
15d0: 75 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20  ust not require 
15e0: 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65  support from the
15f0: 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65   malloc subsyste
1600: 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f  m..  */.  MUTEX_
1610: 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
1620: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
1630: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1640: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
1650: 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
1660: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
1670: 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ;.  sqlite3Globa
1680: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
1690: 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  nit = 1;.  if( !
16a0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
16b0: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
16c0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
16d0: 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29  ite3MallocInit()
16e0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
16f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1700: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1710: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
1720: 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21  t = 1;.    if( !
1730: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1740: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29  fig.pInitMutex )
1750: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
1760: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
1770: 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20  tMutex =.       
1780: 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78      sqlite3Mutex
1790: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
17a0: 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20  EX_RECURSIVE);. 
17b0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
17c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
17d0: 72 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69  reMutex && !sqli
17e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
17f0: 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20  pInitMutex ){.  
1800: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1810: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
1820: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1830: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1840: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
1850: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
1860: 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20  itMutex++;.  }. 
1870: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
1880: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
1890: 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f    /* If rc is no
18a0: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74  t SQLITE_OK at t
18b0: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
18c0: 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f  either the mallo
18d0: 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d  c.  ** subsystem
18e0: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e   could not be in
18f0: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65  itialized or the
1900: 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74   system failed t
1910: 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  o allocate.  ** 
1920: 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  the pInitMutex m
1930: 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20  utex. Return an 
1940: 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20  error in either 
1950: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  case.  */.  if( 
1960: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1970: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
1980: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65    }..  /* Do the
1990: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69   rest of the ini
19a0: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65  tialization unde
19b0: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  r the recursive 
19c0: 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68  mutex so.  ** th
19d0: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62  at we will be ab
19e0: 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63  le to handle rec
19f0: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
1a00: 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  o.  ** sqlite3_i
1a10: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68  nitialize().  Th
1a20: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1a30: 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20  s normally come 
1a40: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c  through.  ** sql
1a50: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1a60: 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73  hen it invokes s
1a70: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1a80: 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72  ter(), but other
1a90: 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20  .  ** recursive 
1aa0: 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f  calls might also
1ab0: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   be possible..  
1ac0: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
1ad0: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31  TATION-OF: R-001
1ae0: 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20  40-37445 SQLite 
1af0: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
1b00: 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20  rializes calls. 
1b10: 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74   ** to the xInit
1b20: 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20   method, so the 
1b30: 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65  xInit method nee
1b40: 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73  d not be threads
1b50: 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  afe..  **.  ** T
1b60: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74  he following mut
1b70: 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61  ex is what seria
1b80: 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20  lizes access to 
1b90: 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68  the appdef pcach
1ba0: 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74  e xInit.  ** met
1bb0: 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74  hods.  The sqlit
1bc0: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
1bd0: 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73  s.xInit() all is
1be0: 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65   embedded in the
1bf0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
1c00: 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69  lite3PcacheIniti
1c10: 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  alize()..  */.  
1c20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1c30: 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ter(sqlite3Globa
1c40: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1c50: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
1c60: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1c70: 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69  sInit==0 && sqli
1c80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1c90: 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b  inProgress==0 ){
1ca0: 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61 73 68  .    FuncDefHash
1cb0: 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41   *pHash = &GLOBA
1cc0: 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73  L(FuncDefHash, s
1cd0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63  qlite3GlobalFunc
1ce0: 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69  tions);.    sqli
1cf0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1d00: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a  inProgress = 1;.
1d10: 20 20 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68      memset(pHash
1d20: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
1d30: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
1d40: 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ns));.    sqlite
1d50: 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46  3RegisterGlobalF
1d60: 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20  unctions();.    
1d70: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1d80: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
1d90: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
1da0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
1db0: 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b  cheInitialize();
1dc0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1dd0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1de0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1df0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
1e00: 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  heInit = 1;.    
1e10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e20: 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20  Init();.    }.  
1e30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1e40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1e50: 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65 72  ite3PCacheBuffer
1e60: 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c  Setup( sqlite3Gl
1e70: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65  obalConfig.pPage
1e80: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
1e90: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1ea0: 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33  .szPage, sqlite3
1eb0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61  GlobalConfig.nPa
1ec0: 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ge);.      sqlit
1ed0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1ee0: 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65  sInit = 1;.#ifde
1ef0: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  f SQLITE_EXTRA_I
1f00: 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78  NIT.      bRunEx
1f10: 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e  traInit = 1;.#en
1f20: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  dif.    }.    sq
1f30: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1f40: 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30  g.inProgress = 0
1f50: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1f60: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
1f70: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f80: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20  pInitMutex);..  
1f90: 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72  /* Go back under
1fa0: 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74 65   the static mute
1fb0: 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74  x and clean up t
1fc0: 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a  he recursive.  *
1fd0: 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65  * mutex to preve
1fe0: 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65  nt a resource le
1ff0: 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ak..  */.  sqlit
2000: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
2010: 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Master);.  sqlit
2020: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2030: 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a  RefInitMutex--;.
2040: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2050: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
2060: 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20  itMutex<=0 ){.  
2070: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
2080: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
2090: 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29  efInitMutex==0 )
20a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
20b0: 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33  tex_free(sqlite3
20c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
20d0: 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71  itMutex);.    sq
20e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
20f0: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30  g.pInitMutex = 0
2100: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2110: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
2120: 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ter);..  /* The 
2130: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73  following is jus
2140: 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  t a sanity check
2150: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51   to make sure SQ
2160: 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65  Lite has.  ** be
2170: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72  en compiled corr
2180: 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d  ectly.  It is im
2190: 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74  portant to run t
21a0: 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20  his code, but.  
21b0: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
21c0: 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f   to run it too o
21d0: 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70  ften and soak up
21e0: 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20   CPU cycles for 
21f0: 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20  no.  ** reason. 
2200: 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e   So we run it on
2210: 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61  ce during initia
2220: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  lization..  */.#
2230: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69  ifndef NDEBUG.#i
2240: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2250: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
2260: 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69  .  /* This secti
2270: 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c  on of code's onl
2280: 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76 69  y "output" is vi
2290: 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  a assert() state
22a0: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28  ments. */.  if (
22b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
22c0: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
22d0: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
22e0: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
22f0: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
2300: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
2310: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
2320: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
2330: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
2340: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
2350: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
2360: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
2370: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
2380: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
2390: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
23a0: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
23b0: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
23c0: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
23d0: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
23e0: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
23f0: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
2400: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
2410: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2420: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
2430: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
2440: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
2450: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
2460: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
2470: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
2480: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
2490: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
24a0: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
24b0: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
24c0: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
24d0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
24e0: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
24f0: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
2500: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
2510: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
2520: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
2530: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
2540: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
2550: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
2560: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
2570: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
2580: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
2590: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
25a0: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
25b0: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
25c0: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
25d0: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
25e0: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
25f0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2600: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2610: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2620: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2630: 69 64 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  id){.#ifdef SQLI
2640: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 69 6e  TE_OMIT_WSD.  in
2650: 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 77  t rc = sqlite3_w
2660: 73 64 5f 69 6e 69 74 28 34 30 39 36 2c 20 32 34  sd_init(4096, 24
2670: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2680: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
2690: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e  turn rc;.  }.#en
26a0: 64 69 66 0a 0a 20 20 69 66 28 20 73 71 6c 69 74  dif..  if( sqlit
26b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
26c0: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
26d0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
26e0: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
26f0: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
2700: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2710: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2720: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2730: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2740: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2750: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2760: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2770: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2780: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2790: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
27a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
27b0: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
27c0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
27d0: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
27e0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
27f0: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
2800: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2810: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2820: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2830: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2840: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2850: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2860: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2870: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2880: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2890: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
28a0: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
28b0: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
28c0: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
28d0: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
28e0: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
28f0: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
2900: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2910: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2920: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2930: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2940: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2950: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2960: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2970: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2980: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2990: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
29a0: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
29b0: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
29c0: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
29d0: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
29e0: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
29f0: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
2a00: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2a10: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2a20: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2a30: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2a40: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2a50: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2a60: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2a70: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2a80: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2a90: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2aa0: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2ab0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2ac0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2ad0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2ae0: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2af0: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2b00: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2b10: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2b20: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2b30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b40: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2b50: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
2b60: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
2b70: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
2b80: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
2b90: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
2ba0: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
2bb0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2bc0: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
2bd0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
2be0: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
2bf0: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
2c00: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
2c10: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2c20: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
2c30: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
2c40: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
2c50: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
2c60: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
2c70: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
2c80: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
2c90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
2ca0: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
2cb0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2cc0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2cd0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
2ce0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
2cf0: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
2d00: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
2d10: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
2d20: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
2d30: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
2d40: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
2d50: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d60: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
2d70: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
2d80: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
2d90: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
2da0: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
2db0: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
2dc0: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
2dd0: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
2de0: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
2df0: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
2e00: 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69  .    */.#if defi
2e10: 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41  ned(SQLITE_THREA
2e20: 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45  DSAFE) && SQLITE
2e30: 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20 20 2f  _THREADSAFE>0  /
2e40: 2a 20 49 4d 50 3a 20 52 2d 35 34 34 36 36 2d 34  * IMP: R-54466-4
2e50: 36 37 35 36 20 2a 2f 0a 20 20 20 20 63 61 73 65  6756 */.    case
2e60: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
2e70: 49 4e 47 4c 45 54 48 52 45 41 44 3a 20 7b 0a 20  INGLETHREAD: {. 
2e80: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
2e90: 61 6c 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a  all mutexing */.
2ea0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
2eb0: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
2ec0: 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  utex = 0;.      
2ed0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2ee0: 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d  fig.bFullMutex =
2ef0: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
2f00: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69  .    }.#endif.#i
2f10: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2f20: 5f 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20  _THREADSAFE) && 
2f30: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
2f40: 45 3e 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 30  E>0 /* IMP: R-20
2f50: 35 32 30 2d 35 34 30 38 36 20 2a 2f 0a 20 20 20  520-54086 */.   
2f60: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2f70: 46 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a  FIG_MULTITHREAD:
2f80: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61   {.      /* Disa
2f90: 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20  ble mutexing of 
2fa0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2fb0: 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f 2a  ions */.      /*
2fc0: 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e 67   Enable mutexing
2fd0: 20 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73 74   of core data st
2fe0: 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20  ructures */.    
2ff0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3000: 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78  onfig.bCoreMutex
3010: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
3020: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3030: 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a  bFullMutex = 0;.
3040: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3050: 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65   }.#endif.#if de
3060: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52  fined(SQLITE_THR
3070: 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49  EADSAFE) && SQLI
3080: 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 20  TE_THREADSAFE>0 
3090: 2f 2a 20 49 4d 50 3a 20 52 2d 35 39 35 39 33 2d  /* IMP: R-59593-
30a0: 32 31 38 31 30 20 2a 2f 0a 20 20 20 20 63 61 73  21810 */.    cas
30b0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
30c0: 53 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20  SERIALIZED: {.  
30d0: 20 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c      /* Enable al
30e0: 6c 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20  l mutexing */.  
30f0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3100: 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74  lConfig.bCoreMut
3110: 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71  ex = 1;.      sq
3120: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3130: 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31  g.bFullMutex = 1
3140: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
3150: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 23 69 66 20     }.#endif.#if 
3160: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
3170: 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51  HREADSAFE) && SQ
3180: 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e  LITE_THREADSAFE>
3190: 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 33 36 36  0 /* IMP: R-6366
31a0: 36 2d 34 38 37 35 35 20 2a 2f 0a 20 20 20 20 63  6-48755 */.    c
31b0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
31c0: 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20  G_MUTEX: {.     
31d0: 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61   /* Specify an a
31e0: 6c 74 65 72 6e 61 74 69 76 65 20 6d 75 74 65 78  lternative mutex
31f0: 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
3200: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3210: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74  GlobalConfig.mut
3220: 65 78 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c  ex = *va_arg(ap,
3230: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d   sqlite3_mutex_m
3240: 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20  ethods*);.      
3250: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
3260: 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
3270: 53 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46  SQLITE_THREADSAF
3280: 45 29 20 26 26 20 53 51 4c 49 54 45 5f 54 48 52  E) && SQLITE_THR
3290: 45 41 44 53 41 46 45 3e 30 20 2f 2a 20 49 4d 50  EADSAFE>0 /* IMP
32a0: 3a 20 52 2d 31 34 34 35 30 2d 33 37 35 39 37 20  : R-14450-37597 
32b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
32c0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54  TE_CONFIG_GETMUT
32d0: 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52  EX: {.      /* R
32e0: 65 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72  etrieve the curr
32f0: 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d  ent mutex implem
3300: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
3310: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
3320: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68  lite3_mutex_meth
3330: 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ods*) = sqlite3G
3340: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65  lobalConfig.mute
3350: 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  x;.      break;.
3360: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
3370: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3380: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  NFIG_MALLOC: {. 
3390: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
33a0: 2d 4f 46 3a 20 52 2d 35 35 35 39 34 2d 32 31 30  -OF: R-55594-210
33b0: 33 30 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f  30 The SQLITE_CO
33c0: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 20 6f 70 74 69  NFIG_MALLOC opti
33d0: 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20 20 20 20  on takes a.     
33e0: 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72 67 75 6d   ** single argum
33f0: 65 6e 74 20 77 68 69 63 68 20 69 73 20 61 20 70  ent which is a p
3400: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 73  ointer to an ins
3410: 74 61 6e 63 65 20 6f 66 20 74 68 65 0a 20 20 20  tance of the.   
3420: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 65     ** sqlite3_me
3430: 6d 5f 6d 65 74 68 6f 64 73 20 73 74 72 75 63 74  m_methods struct
3440: 75 72 65 2e 20 54 68 65 20 61 72 67 75 6d 65 6e  ure. The argumen
3450: 74 20 73 70 65 63 69 66 69 65 73 20 61 6c 74 65  t specifies alte
3460: 72 6e 61 74 69 76 65 0a 20 20 20 20 20 20 2a 2a  rnative.      **
3470: 20 6c 6f 77 2d 6c 65 76 65 6c 20 6d 65 6d 6f 72   low-level memor
3480: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75  y allocation rou
3490: 74 69 6e 65 73 20 74 6f 20 62 65 20 75 73 65 64  tines to be used
34a0: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 74 68 65   in place of the
34b0: 20 6d 65 6d 6f 72 79 0a 20 20 20 20 20 20 2a 2a   memory.      **
34c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f 75 74   allocation rout
34d0: 69 6e 65 73 20 62 75 69 6c 74 20 69 6e 74 6f 20  ines built into 
34e0: 53 51 4c 69 74 65 2e 20 2a 2f 0a 20 20 20 20 20  SQLite. */.     
34f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3500: 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67  nfig.m = *va_arg
3510: 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d  (ap, sqlite3_mem
3520: 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20  _methods*);.    
3530: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3540: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3550: 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a  ONFIG_GETMALLOC:
3560: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
3570: 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 31 32 31 33  ENCE-OF: R-51213
3580: 2d 34 36 34 31 34 20 54 68 65 20 53 51 4c 49 54  -46414 The SQLIT
3590: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c  E_CONFIG_GETMALL
35a0: 4f 43 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  OC option takes 
35b0: 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67 6c  a.      ** singl
35c0: 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68  e argument which
35d0: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
35e0: 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20   an instance of 
35f0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  the.      ** sql
3600: 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64 73  ite3_mem_methods
3610: 20 73 74 72 75 63 74 75 72 65 2e 20 54 68 65 20   structure. The 
3620: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3630: 6f 64 73 20 73 74 72 75 63 74 75 72 65 20 69 73  ods structure is
3640: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
3650: 20 77 69 74 68 20 74 68 65 20 63 75 72 72 65 6e   with the curren
3660: 74 6c 79 20 64 65 66 69 6e 65 64 20 6d 65 6d 6f  tly defined memo
3670: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 72 6f  ry allocation ro
3680: 75 74 69 6e 65 73 2e 20 2a 2f 0a 20 20 20 20 20  utines. */.     
3690: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
36a0: 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c  alConfig.m.xMall
36b0: 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d  oc==0 ) sqlite3M
36c0: 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  emSetDefault();.
36d0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
36e0: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
36f0: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
3700: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b  3GlobalConfig.m;
3710: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3720: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3730: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54  ITE_CONFIG_MEMST
3740: 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ATUS: {.      /*
3750: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
3760: 36 31 32 37 35 2d 33 35 31 35 37 20 54 68 65 20  61275-35157 The 
3770: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45  SQLITE_CONFIG_ME
3780: 4d 53 54 41 54 55 53 20 6f 70 74 69 6f 6e 20 74  MSTATUS option t
3790: 61 6b 65 73 0a 20 20 20 20 20 20 2a 2a 20 73 69  akes.      ** si
37a0: 6e 67 6c 65 20 61 72 67 75 6d 65 6e 74 20 6f 66  ngle argument of
37b0: 20 74 79 70 65 20 69 6e 74 2c 20 69 6e 74 65 72   type int, inter
37c0: 70 72 65 74 65 64 20 61 73 20 61 20 62 6f 6f 6c  preted as a bool
37d0: 65 61 6e 2c 20 77 68 69 63 68 20 65 6e 61 62 6c  ean, which enabl
37e0: 65 73 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 64  es.      ** or d
37f0: 69 73 61 62 6c 65 73 20 74 68 65 20 63 6f 6c 6c  isables the coll
3800: 65 63 74 69 6f 6e 20 6f 66 20 6d 65 6d 6f 72 79  ection of memory
3810: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73 74 61 74   allocation stat
3820: 69 73 74 69 63 73 2e 20 2a 2f 0a 20 20 20 20 20  istics. */.     
3830: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3840: 6e 66 69 67 2e 62 4d 65 6d 73 74 61 74 20 3d 20  nfig.bMemstat = 
3850: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3860: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3870: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3880: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43 52 41 54  ITE_CONFIG_SCRAT
3890: 43 48 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  CH: {.      /* E
38a0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 38  VIDENCE-OF: R-08
38b0: 34 30 34 2d 36 30 38 38 37 20 54 68 65 72 65 20  404-60887 There 
38c0: 61 72 65 20 74 68 72 65 65 20 61 72 67 75 6d 65  are three argume
38d0: 6e 74 73 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20  nts to.      ** 
38e0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 43  SQLITE_CONFIG_SC
38f0: 52 41 54 43 48 3a 20 41 20 70 6f 69 6e 74 65 72  RATCH: A pointer
3900: 20 61 6e 20 38 2d 62 79 74 65 20 61 6c 69 67 6e   an 8-byte align
3910: 65 64 20 6d 65 6d 6f 72 79 20 62 75 66 66 65 72  ed memory buffer
3920: 20 66 72 6f 6d 0a 20 20 20 20 20 20 2a 2a 20 77   from.      ** w
3930: 68 69 63 68 20 74 68 65 20 73 63 72 61 74 63 68  hich the scratch
3940: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 77 69 6c   allocations wil
3950: 6c 20 62 65 20 64 72 61 77 6e 2c 20 74 68 65 20  l be drawn, the 
3960: 73 69 7a 65 20 6f 66 20 65 61 63 68 20 73 63 72  size of each scr
3970: 61 74 63 68 0a 20 20 20 20 20 20 2a 2a 20 61 6c  atch.      ** al
3980: 6c 6f 63 61 74 69 6f 6e 20 28 73 7a 29 2c 20 61  location (sz), a
3990: 6e 64 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e  nd the maximum n
39a0: 75 6d 62 65 72 20 6f 66 20 73 63 72 61 74 63 68  umber of scratch
39b0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 28 4e 29   allocations (N)
39c0: 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  . */.      sqlit
39d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
39e0: 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67  Scratch = va_arg
39f0: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
3a00: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3a10: 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68  Config.szScratch
3a20: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3a30: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
3a40: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53  3GlobalConfig.nS
3a50: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
3a60: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
3a70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3a80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3a90: 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b  FIG_PAGECACHE: {
3aa0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3ab0: 43 45 2d 4f 46 3a 20 52 2d 33 31 34 30 38 2d 34  CE-OF: R-31408-4
3ac0: 30 35 31 30 20 54 68 65 72 65 20 61 72 65 20 74  0510 There are t
3ad0: 68 72 65 65 20 61 72 67 75 6d 65 6e 74 73 20 74  hree arguments t
3ae0: 6f 0a 20 20 20 20 20 20 2a 2a 20 53 51 4c 49 54  o.      ** SQLIT
3af0: 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43  E_CONFIG_PAGECAC
3b00: 48 45 3a 20 41 20 70 6f 69 6e 74 65 72 20 74 6f  HE: A pointer to
3b10: 20 38 2d 62 79 74 65 20 61 6c 69 67 6e 65 64 20   8-byte aligned 
3b20: 6d 65 6d 6f 72 79 2c 20 74 68 65 20 73 69 7a 65  memory, the size
3b30: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 65 61 63  .      ** of eac
3b40: 68 20 70 61 67 65 20 62 75 66 66 65 72 20 28 73  h page buffer (s
3b50: 7a 29 2c 20 61 6e 64 20 74 68 65 20 6e 75 6d 62  z), and the numb
3b60: 65 72 20 6f 66 20 70 61 67 65 73 20 28 4e 29 2e  er of pages (N).
3b70: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3b80: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50  3GlobalConfig.pP
3b90: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
3ba0: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73   void*);.      s
3bb0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3bc0: 69 67 2e 73 7a 50 61 67 65 20 3d 20 76 61 5f 61  ig.szPage = va_a
3bd0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3be0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3bf0: 43 6f 6e 66 69 67 2e 6e 50 61 67 65 20 3d 20 76  Config.nPage = v
3c00: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
3c10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3c20: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
3c30: 54 45 5f 43 4f 4e 46 49 47 5f 50 43 41 43 48 45  TE_CONFIG_PCACHE
3c40: 5f 48 44 52 53 5a 3a 20 7b 0a 20 20 20 20 20 20  _HDRSZ: {.      
3c50: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
3c60: 52 2d 33 39 31 30 30 2d 32 37 33 31 37 20 54 68  R-39100-27317 Th
3c70: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3c80: 50 43 41 43 48 45 5f 48 44 52 53 5a 20 6f 70 74  PCACHE_HDRSZ opt
3c90: 69 6f 6e 20 74 61 6b 65 73 0a 20 20 20 20 20 20  ion takes.      
3ca0: 2a 2a 20 61 20 73 69 6e 67 6c 65 20 70 61 72 61  ** a single para
3cb0: 6d 65 74 65 72 20 77 68 69 63 68 20 69 73 20 61  meter which is a
3cc0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69   pointer to an i
3cd0: 6e 74 65 67 65 72 20 61 6e 64 20 77 72 69 74 65  nteger and write
3ce0: 73 20 69 6e 74 6f 0a 20 20 20 20 20 20 2a 2a 20  s into.      ** 
3cf0: 74 68 61 74 20 69 6e 74 65 67 65 72 20 74 68 65  that integer the
3d00: 20 6e 75 6d 62 65 72 20 6f 66 20 65 78 74 72 61   number of extra
3d10: 20 62 79 74 65 73 20 70 65 72 20 70 61 67 65 20   bytes per page 
3d20: 72 65 71 75 69 72 65 64 20 66 6f 72 20 65 61 63  required for eac
3d30: 68 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20  h page.      ** 
3d40: 69 6e 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  in SQLITE_CONFIG
3d50: 5f 50 41 47 45 43 41 43 48 45 2e 20 2a 2f 0a 20  _PAGECACHE. */. 
3d60: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
3d70: 20 69 6e 74 2a 29 20 3d 20 0a 20 20 20 20 20 20   int*) = .      
3d80: 20 20 20 20 73 71 6c 69 74 65 33 48 65 61 64 65      sqlite3Heade
3d90: 72 53 69 7a 65 42 74 72 65 65 28 29 20 2b 0a 20  rSizeBtree() +. 
3da0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
3db0: 48 65 61 64 65 72 53 69 7a 65 50 63 61 63 68 65  HeaderSizePcache
3dc0: 28 29 20 2b 0a 20 20 20 20 20 20 20 20 20 20 73  () +.          s
3dd0: 71 6c 69 74 65 33 48 65 61 64 65 72 53 69 7a 65  qlite3HeaderSize
3de0: 50 63 61 63 68 65 31 28 29 3b 0a 20 20 20 20 20  Pcache1();.     
3df0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3e00: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3e10: 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a  ONFIG_PCACHE: {.
3e20: 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
3e30: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
3e40: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3e50: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50  LITE_CONFIG_GETP
3e60: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
3e70: 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a  * now an error *
3e80: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
3e90: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
3ea0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3eb0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3ec0: 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b  ONFIG_PCACHE2: {
3ed0: 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  .      /* EVIDEN
3ee0: 43 45 2d 4f 46 3a 20 52 2d 36 33 33 32 35 2d 34  CE-OF: R-63325-4
3ef0: 38 33 37 38 20 54 68 65 20 53 51 4c 49 54 45 5f  8378 The SQLITE_
3f00: 43 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 20 6f  CONFIG_PCACHE2 o
3f10: 70 74 69 6f 6e 20 74 61 6b 65 73 20 61 0a 20 20  ption takes a.  
3f20: 20 20 20 20 2a 2a 20 73 69 6e 67 6c 65 20 61 72      ** single ar
3f30: 67 75 6d 65 6e 74 20 77 68 69 63 68 20 69 73 20  gument which is 
3f40: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
3f50: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
3f60: 65 74 68 6f 64 73 32 0a 20 20 20 20 20 20 2a 2a  ethods2.      **
3f70: 20 6f 62 6a 65 63 74 2e 20 54 68 69 73 20 6f 62   object. This ob
3f80: 6a 65 63 74 20 73 70 65 63 69 66 69 65 73 20 74  ject specifies t
3f90: 68 65 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  he interface to 
3fa0: 61 20 63 75 73 74 6f 6d 20 70 61 67 65 20 63 61  a custom page ca
3fb0: 63 68 65 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70  che.      ** imp
3fc0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 2a 2f 0a  lementation. */.
3fd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3fe0: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
3ff0: 32 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  2 = *va_arg(ap, 
4000: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
4010: 65 74 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20  ethods2*);.     
4020: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4030: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
4040: 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a  NFIG_GETPCACHE2:
4050: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
4060: 45 4e 43 45 2d 4f 46 3a 20 52 2d 32 32 30 33 35  ENCE-OF: R-22035
4070: 2d 34 36 31 38 32 20 54 68 65 20 53 51 4c 49 54  -46182 The SQLIT
4080: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43  E_CONFIG_GETPCAC
4090: 48 45 32 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73  HE2 option takes
40a0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 73 69 6e 67   a.      ** sing
40b0: 6c 65 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63  le argument whic
40c0: 68 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  h is a pointer t
40d0: 6f 20 61 6e 20 73 71 6c 69 74 65 33 5f 70 63 61  o an sqlite3_pca
40e0: 63 68 65 5f 6d 65 74 68 6f 64 73 32 0a 20 20 20  che_methods2.   
40f0: 20 20 20 2a 2a 20 6f 62 6a 65 63 74 2e 20 53 51     ** object. SQ
4100: 4c 69 74 65 20 63 6f 70 69 65 73 20 6f 66 20 74  Lite copies of t
4110: 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
4120: 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  cache implementa
4130: 74 69 6f 6e 20 69 6e 74 6f 0a 20 20 20 20 20 20  tion into.      
4140: 2a 2a 20 74 68 61 74 20 6f 62 6a 65 63 74 2e 20  ** that object. 
4150: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  */.      if( sql
4160: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4170: 2e 70 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d  .pcache2.xInit==
4180: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
4190: 69 74 65 33 50 43 61 63 68 65 53 65 74 44 65 66  ite3PCacheSetDef
41a0: 61 75 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a  ault();.      }.
41b0: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
41c0: 2c 20 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65  , sqlite3_pcache
41d0: 5f 6d 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71  _methods2*) = sq
41e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
41f0: 67 2e 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20  g.pcache2;.     
4200: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 2f   break;.    }../
4210: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
4220: 2d 30 36 36 32 36 2d 31 32 39 31 31 20 54 68 65  -06626-12911 The
4230: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 48   SQLITE_CONFIG_H
4240: 45 41 50 20 6f 70 74 69 6f 6e 20 69 73 20 6f 6e  EAP option is on
4250: 6c 79 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 20  ly.** available 
4260: 69 66 20 53 51 4c 69 74 65 20 69 73 20 63 6f 6d  if SQLite is com
4270: 70 69 6c 65 64 20 77 69 74 68 20 65 69 74 68 65  piled with eithe
4280: 72 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  r SQLITE_ENABLE_
4290: 4d 45 4d 53 59 53 33 20 6f 72 0a 2a 2a 20 53 51  MEMSYS3 or.** SQ
42a0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
42b0: 59 53 35 20 61 6e 64 20 72 65 74 75 72 6e 73 20  YS5 and returns 
42c0: 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 20  SQLITE_ERROR if 
42d0: 69 6e 76 6f 6b 65 64 20 6f 74 68 65 72 77 69 73  invoked otherwis
42e0: 65 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  e. */.#if define
42f0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
4300: 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66 69  MEMSYS3) || defi
4310: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
4320: 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20 63  E_MEMSYS5).    c
4330: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
4340: 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20 20  G_HEAP: {.      
4350: 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  /* EVIDENCE-OF: 
4360: 52 2d 31 39 38 35 34 2d 34 32 31 32 36 20 54 68  R-19854-42126 Th
4370: 65 72 65 20 61 72 65 20 74 68 72 65 65 20 61 72  ere are three ar
4380: 67 75 6d 65 6e 74 73 20 74 6f 0a 20 20 20 20 20  guments to.     
4390: 20 2a 2a 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49   ** SQLITE_CONFI
43a0: 47 5f 48 45 41 50 3a 20 41 6e 20 38 2d 62 79 74  G_HEAP: An 8-byt
43b0: 65 20 61 6c 69 67 6e 65 64 20 70 6f 69 6e 74 65  e aligned pointe
43c0: 72 20 74 6f 20 74 68 65 20 6d 65 6d 6f 72 79 2c  r to the memory,
43d0: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6e 75   the.      ** nu
43e0: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
43f0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 62 75 66 66   the memory buff
4400: 65 72 2c 20 61 6e 64 20 74 68 65 20 6d 69 6e 69  er, and the mini
4410: 6d 75 6d 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 73  mum allocation s
4420: 69 7a 65 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ize. */.      sq
4430: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4440: 67 2e 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67  g.pHeap = va_arg
4450: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
4460: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4470: 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76  Config.nHeap = v
4480: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
4490: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
44a0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20  balConfig.mnReq 
44b0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
44c0: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71  );..      if( sq
44d0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
44e0: 67 2e 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20  g.mnReq<1 ){.   
44f0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4500: 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d  alConfig.mnReq =
4510: 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
4520: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
4530: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31  lConfig.mnReq>(1
4540: 3c 3c 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20  <<12) ){.       
4550: 20 2f 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75   /* cap min requ
4560: 65 73 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32  est size at 2^12
4570: 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69   */.        sqli
4580: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
4590: 6d 6e 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b  mnReq = (1<<12);
45a0: 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
45b0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
45c0: 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30  lConfig.pHeap==0
45d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 45   ){.        /* E
45e0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 34 39  VIDENCE-OF: R-49
45f0: 39 32 30 2d 36 30 31 38 39 20 49 66 20 74 68 65  920-60189 If the
4600: 20 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 28   first pointer (
4610: 74 68 65 20 6d 65 6d 6f 72 79 20 70 6f 69 6e 74  the memory point
4620: 65 72 29 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  er).        ** i
4630: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 53 51 4c  s NULL, then SQL
4640: 69 74 65 20 72 65 76 65 72 74 73 20 74 6f 20 75  ite reverts to u
4650: 73 69 6e 67 20 69 74 73 20 64 65 66 61 75 6c 74  sing its default
4660: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f   memory allocato
4670: 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 28 74 68  r.        ** (th
4680: 65 20 73 79 73 74 65 6d 20 6d 61 6c 6c 6f 63 28  e system malloc(
4690: 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  ) implementation
46a0: 29 2c 20 75 6e 64 6f 69 6e 67 20 61 6e 79 20 70  ), undoing any p
46b0: 72 69 6f 72 20 69 6e 76 6f 63 61 74 69 6f 6e 20  rior invocation 
46c0: 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 51  of.        ** SQ
46d0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c  LITE_CONFIG_MALL
46e0: 4f 43 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  OC..        **. 
46f0: 20 20 20 20 20 20 20 2a 2a 20 53 65 74 74 69 6e         ** Settin
4700: 67 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  g sqlite3GlobalC
4710: 6f 6e 66 69 67 2e 6d 20 74 6f 20 61 6c 6c 20 7a  onfig.m to all z
4720: 65 72 6f 73 20 77 69 6c 6c 20 63 61 75 73 65 20  eros will cause 
4730: 6d 61 6c 6c 6f 63 20 74 6f 0a 20 20 20 20 20 20  malloc to.      
4740: 20 20 2a 2a 20 72 65 76 65 72 74 20 74 6f 20 69    ** revert to i
4750: 74 73 20 64 65 66 61 75 6c 74 20 69 6d 70 6c 65  ts default imple
4760: 6d 65 6e 74 61 74 69 6f 6e 20 77 68 65 6e 20 73  mentation when s
4770: 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a  qlite3_initializ
4780: 65 28 29 20 69 73 20 72 75 6e 0a 20 20 20 20 20  e() is run.     
4790: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 6d 65     */.        me
47a0: 6d 73 65 74 28 26 73 71 6c 69 74 65 33 47 6c 6f  mset(&sqlite3Glo
47b0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20 30 2c 20  balConfig.m, 0, 
47c0: 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 47 6c  sizeof(sqlite3Gl
47d0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29 29 3b 0a  obalConfig.m));.
47e0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
47f0: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
4800: 2d 4f 46 3a 20 52 2d 36 31 30 30 36 2d 30 38 39  -OF: R-61006-089
4810: 31 38 20 49 66 20 74 68 65 20 6d 65 6d 6f 72 79  18 If the memory
4820: 20 70 6f 69 6e 74 65 72 20 69 73 20 6e 6f 74 20   pointer is not 
4830: 4e 55 4c 4c 20 74 68 65 6e 20 74 68 65 0a 20 20  NULL then the.  
4840: 20 20 20 20 20 20 2a 2a 20 61 6c 74 65 72 6e 61        ** alterna
4850: 74 69 76 65 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  tive memory allo
4860: 63 61 74 6f 72 20 69 73 20 65 6e 67 61 67 65 64  cator is engaged
4870: 20 74 6f 20 68 61 6e 64 6c 65 20 61 6c 6c 20 6f   to handle all o
4880: 66 20 53 51 4c 69 74 65 73 0a 20 20 20 20 20 20  f SQLites.      
4890: 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f    ** memory allo
48a0: 63 61 74 69 6f 6e 20 6e 65 65 64 73 2e 20 2a 2f  cation needs. */
48b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
48c0: 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 0a 20 20  NABLE_MEMSYS3.  
48d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
48e0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73  balConfig.m = *s
48f0: 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73  qlite3MemGetMems
4900: 79 73 33 28 29 3b 0a 23 65 6e 64 69 66 0a 23 69  ys3();.#endif.#i
4910: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
4920: 4c 45 5f 4d 45 4d 53 59 53 35 0a 20 20 20 20 20  LE_MEMSYS5.     
4930: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4940: 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69  Config.m = *sqli
4950: 74 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 35  te3MemGetMemsys5
4960: 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ();.#endif.     
4970: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
4980: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20      }.#endif..  
4990: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
49a0: 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20  NFIG_LOOKASIDE: 
49b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
49c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f  lobalConfig.szLo
49d0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
49e0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
49f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4a00: 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20  nfig.nLookaside 
4a10: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
4a20: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4a30: 20 20 20 20 7d 0a 20 20 20 20 0a 20 20 20 20 2f      }.    .    /
4a40: 2a 20 52 65 63 6f 72 64 20 61 20 70 6f 69 6e 74  * Record a point
4a50: 65 72 20 74 6f 20 74 68 65 20 6c 6f 67 67 65 72  er to the logger
4a60: 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 69 74   function and it
4a70: 73 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  s first argument
4a80: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 64 65 66  ..    ** The def
4a90: 61 75 6c 74 20 69 73 20 4e 55 4c 4c 2e 20 20 4c  ault is NULL.  L
4aa0: 6f 67 67 69 6e 67 20 69 73 20 64 69 73 61 62 6c  ogging is disabl
4ab0: 65 64 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  ed if the functi
4ac0: 6f 6e 20 70 6f 69 6e 74 65 72 20 69 73 0a 20 20  on pointer is.  
4ad0: 20 20 2a 2a 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a    ** NULL..    *
4ae0: 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
4af0: 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a  E_CONFIG_LOG: {.
4b00: 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73        /* MSVC is
4b10: 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c   picky about pul
4b20: 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66  ling func ptrs f
4b30: 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20  rom va lists..  
4b40: 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75      ** http://su
4b50: 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e  pport.microsoft.
4b60: 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20  com/kb/47961.   
4b70: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f     ** sqlite3Glo
4b80: 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d  balConfig.xLog =
4b90: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
4ba0: 28 2a 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f  (*)(void*,int,co
4bb0: 6e 73 74 20 63 68 61 72 2a 29 29 3b 0a 20 20 20  nst char*));.   
4bc0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65     */.      type
4bd0: 64 65 66 20 76 6f 69 64 28 2a 4c 4f 47 46 55 4e  def void(*LOGFUN
4be0: 43 5f 74 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  C_t)(void*,int,c
4bf0: 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20  onst char*);.   
4c00: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
4c10: 43 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61  Config.xLog = va
4c20: 5f 61 72 67 28 61 70 2c 20 4c 4f 47 46 55 4e 43  _arg(ap, LOGFUNC
4c30: 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  _t);.      sqlit
4c40: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
4c50: 4c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28  LogArg = va_arg(
4c60: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
4c70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
4c80: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4c90: 4f 46 3a 20 52 2d 35 35 35 34 38 2d 33 33 38 31  OF: R-55548-3381
4ca0: 37 20 54 68 65 20 63 6f 6d 70 69 6c 65 2d 74 69  7 The compile-ti
4cb0: 6d 65 20 73 65 74 74 69 6e 67 20 66 6f 72 20 55  me setting for U
4cc0: 52 49 20 66 69 6c 65 6e 61 6d 65 73 0a 20 20 20  RI filenames.   
4cd0: 20 2a 2a 20 63 61 6e 20 62 65 20 63 68 61 6e 67   ** can be chang
4ce0: 65 64 20 61 74 20 73 74 61 72 74 2d 74 69 6d 65  ed at start-time
4cf0: 20 75 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a   using the.    *
4d00: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
4d10: 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55  (SQLITE_CONFIG_U
4d20: 52 49 2c 31 29 20 6f 72 0a 20 20 20 20 2a 2a 20  RI,1) or.    ** 
4d30: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53  sqlite3_config(S
4d40: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49  QLITE_CONFIG_URI
4d50: 2c 30 29 20 63 6f 6e 66 69 67 75 72 61 74 69 6f  ,0) configuratio
4d60: 6e 20 63 61 6c 6c 73 2e 0a 20 20 20 20 2a 2f 0a  n calls..    */.
4d70: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4d80: 43 4f 4e 46 49 47 5f 55 52 49 3a 20 7b 0a 20 20  CONFIG_URI: {.  
4d90: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
4da0: 4f 46 3a 20 52 2d 32 35 34 35 31 2d 36 31 31 32  OF: R-25451-6112
4db0: 35 20 54 68 65 20 53 51 4c 49 54 45 5f 43 4f 4e  5 The SQLITE_CON
4dc0: 46 49 47 5f 55 52 49 20 6f 70 74 69 6f 6e 20 74  FIG_URI option t
4dd0: 61 6b 65 73 20 61 20 73 69 6e 67 6c 65 0a 20 20  akes a single.  
4de0: 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20      ** argument 
4df0: 6f 66 20 74 79 70 65 20 69 6e 74 2e 20 49 66 20  of type int. If 
4e00: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 55  non-zero, then U
4e10: 52 49 20 68 61 6e 64 6c 69 6e 67 20 69 73 20 67  RI handling is g
4e20: 6c 6f 62 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  lobally.      **
4e30: 20 65 6e 61 62 6c 65 64 2e 20 49 66 20 74 68 65   enabled. If the
4e40: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 7a 65   parameter is ze
4e50: 72 6f 2c 20 74 68 65 6e 20 55 52 49 20 68 61 6e  ro, then URI han
4e60: 64 6c 69 6e 67 20 69 73 20 67 6c 6f 62 61 6c 6c  dling is globall
4e70: 79 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62  y.      ** disab
4e80: 6c 65 64 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  led. */.      sq
4e90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4ea0: 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f  g.bOpenUri = va_
4eb0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
4ec0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4ed0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
4ee0: 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e  E_CONFIG_COVERIN
4ef0: 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a  G_INDEX_SCAN: {.
4f00: 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43        /* EVIDENC
4f10: 45 2d 4f 46 3a 20 52 2d 33 36 35 39 32 2d 30 32  E-OF: R-36592-02
4f20: 37 37 32 20 54 68 65 20 53 51 4c 49 54 45 5f 43  772 The SQLITE_C
4f30: 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49  ONFIG_COVERING_I
4f40: 4e 44 45 58 5f 53 43 41 4e 0a 20 20 20 20 20 20  NDEX_SCAN.      
4f50: 2a 2a 20 6f 70 74 69 6f 6e 20 74 61 6b 65 73 20  ** option takes 
4f60: 61 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  a single integer
4f70: 20 61 72 67 75 6d 65 6e 74 20 77 68 69 63 68 20   argument which 
4f80: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
4f90: 73 20 61 0a 20 20 20 20 20 20 2a 2a 20 62 6f 6f  s a.      ** boo
4fa0: 6c 65 61 6e 20 69 6e 20 6f 72 64 65 72 20 74 6f  lean in order to
4fb0: 20 65 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   enable or disab
4fc0: 6c 65 20 74 68 65 20 75 73 65 20 6f 66 20 63 6f  le the use of co
4fd0: 76 65 72 69 6e 67 20 69 6e 64 69 63 65 73 20 66  vering indices f
4fe0: 6f 72 0a 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c  or.      ** full
4ff0: 20 74 61 62 6c 65 20 73 63 61 6e 73 20 69 6e 20   table scans in 
5000: 74 68 65 20 71 75 65 72 79 20 6f 70 74 69 6d 69  the query optimi
5010: 7a 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  zer. */.      sq
5020: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
5030: 67 2e 62 55 73 65 43 69 73 20 3d 20 76 61 5f 61  g.bUseCis = va_a
5040: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
5050: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5060: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
5070: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 20  NABLE_SQLLOG.   
5080: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
5090: 46 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b 0a 20 20  FIG_SQLLOG: {.  
50a0: 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
50b0: 28 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29 28  (*SQLLOGFUNC_t)(
50c0: 76 6f 69 64 2a 2c 20 73 71 6c 69 74 65 33 2a 2c  void*, sqlite3*,
50d0: 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e   const char*, in
50e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
50f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
5100: 71 6c 6c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  qllog = va_arg(a
5110: 70 2c 20 53 51 4c 4c 4f 47 46 55 4e 43 5f 74 29  p, SQLLOGFUNC_t)
5120: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
5130: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c  lobalConfig.pSql
5140: 6c 6f 67 41 72 67 20 3d 20 76 61 5f 61 72 67 28  logArg = va_arg(
5150: 61 70 2c 20 76 6f 69 64 20 2a 29 3b 0a 20 20 20  ap, void *);.   
5160: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
5170: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
5180: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d   SQLITE_CONFIG_M
5190: 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20 20 20 20  MAP_SIZE: {.    
51a0: 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
51b0: 3a 20 52 2d 35 38 30 36 33 2d 33 38 32 35 38 20  : R-58063-38258 
51c0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 4d  SQLITE_CONFIG_MM
51d0: 41 50 5f 53 49 5a 45 20 74 61 6b 65 73 20 74 77  AP_SIZE takes tw
51e0: 6f 20 36 34 2d 62 69 74 0a 20 20 20 20 20 20 2a  o 64-bit.      *
51f0: 2a 20 69 6e 74 65 67 65 72 20 28 73 71 6c 69 74  * integer (sqlit
5200: 65 33 5f 69 6e 74 36 34 29 20 76 61 6c 75 65 73  e3_int64) values
5210: 20 74 68 61 74 20 61 72 65 20 74 68 65 20 64 65   that are the de
5220: 66 61 75 6c 74 20 6d 6d 61 70 20 73 69 7a 65 20  fault mmap size 
5230: 6c 69 6d 69 74 0a 20 20 20 20 20 20 2a 2a 20 28  limit.      ** (
5240: 74 68 65 20 64 65 66 61 75 6c 74 20 73 65 74 74  the default sett
5250: 69 6e 67 20 66 6f 72 20 50 52 41 47 4d 41 20 6d  ing for PRAGMA m
5260: 6d 61 70 5f 73 69 7a 65 29 20 61 6e 64 20 74 68  map_size) and th
5270: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
5280: 64 0a 20 20 20 20 20 20 2a 2a 20 6d 6d 61 70 20  d.      ** mmap 
5290: 73 69 7a 65 20 6c 69 6d 69 74 2e 20 2a 2f 0a 20  size limit. */. 
52a0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
52b0: 36 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61  64 szMmap = va_a
52c0: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69  rg(ap, sqlite3_i
52d0: 6e 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c  nt64);.      sql
52e0: 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61  ite3_int64 mxMma
52f0: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  p = va_arg(ap, s
5300: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20  qlite3_int64);. 
5310: 20 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45       /* EVIDENCE
5320: 2d 4f 46 3a 20 52 2d 35 33 33 36 37 2d 34 33 31  -OF: R-53367-431
5330: 39 30 20 49 66 20 65 69 74 68 65 72 20 61 72 67  90 If either arg
5340: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 6f 70  ument to this op
5350: 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 2a 2a  tion is.      **
5360: 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20   negative, then 
5370: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 69 73  that argument is
5380: 20 63 68 61 6e 67 65 64 20 74 6f 20 69 74 73 20   changed to its 
5390: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 64 65 66  compile-time def
53a0: 61 75 6c 74 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ault..      **. 
53b0: 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
53c0: 2d 4f 46 3a 20 52 2d 33 34 39 39 33 2d 34 35 30  -OF: R-34993-450
53d0: 33 31 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 61  31 The maximum a
53e0: 6c 6c 6f 77 65 64 20 6d 6d 61 70 20 73 69 7a 65  llowed mmap size
53f0: 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 20 2a   will be.      *
5400: 2a 20 73 69 6c 65 6e 74 6c 79 20 74 72 75 6e 63  * silently trunc
5410: 61 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72  ated if necessar
5420: 79 20 73 6f 20 74 68 61 74 20 69 74 20 64 6f 65  y so that it doe
5430: 73 20 6e 6f 74 20 65 78 63 65 65 64 20 74 68 65  s not exceed the
5440: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  .      ** compil
5450: 65 2d 74 69 6d 65 20 6d 61 78 69 6d 75 6d 20 6d  e-time maximum m
5460: 6d 61 70 20 73 69 7a 65 20 73 65 74 20 62 79 20  map size set by 
5470: 74 68 65 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4d  the SQLITE_MAX_M
5480: 4d 41 50 5f 53 49 5a 45 0a 20 20 20 20 20 20 2a  MAP_SIZE.      *
5490: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  * compile-time o
54a0: 70 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  ption..      */.
54b0: 20 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70        if( mxMmap
54c0: 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c  <0 || mxMmap>SQL
54d0: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
54e0: 45 20 29 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c  E ) mxMmap = SQL
54f0: 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a  ITE_MAX_MMAP_SIZ
5500: 45 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d  E;.      if( szM
5510: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
5520: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
5530: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
5540: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
5550: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
5560: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
5570: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
5580: 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  xMmap = mxMmap;.
5590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
55a0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
55b0: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
55c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
55d0: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
55e0: 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
55f0: 54 45 5f 57 49 4e 33 32 5f 4d 41 4c 4c 4f 43 29  TE_WIN32_MALLOC)
5600: 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 37 38 30   /* IMP: R-04780
5610: 2d 35 35 38 31 35 20 2a 2f 0a 20 20 20 20 63 61  -55815 */.    ca
5620: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
5630: 5f 57 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a  _WIN32_HEAPSIZE:
5640: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 56 49 44   {.      /* EVID
5650: 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 34 39 32 36  ENCE-OF: R-34926
5660: 2d 30 33 33 36 30 20 53 51 4c 49 54 45 5f 43 4f  -03360 SQLITE_CO
5670: 4e 46 49 47 5f 57 49 4e 33 32 5f 48 45 41 50 53  NFIG_WIN32_HEAPS
5680: 49 5a 45 20 74 61 6b 65 73 20 61 20 33 32 2d 62  IZE takes a 32-b
5690: 69 74 0a 20 20 20 20 20 20 2a 2a 20 75 6e 73 69  it.      ** unsi
56a0: 67 6e 65 64 20 69 6e 74 65 67 65 72 20 76 61 6c  gned integer val
56b0: 75 65 20 74 68 61 74 20 73 70 65 63 69 66 69 65  ue that specifie
56c0: 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69  s the maximum si
56d0: 7a 65 20 6f 66 20 74 68 65 20 63 72 65 61 74 65  ze of the create
56e0: 64 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 70 2e  d.      ** heap.
56f0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
5700: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48  3GlobalConfig.nH
5710: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
5720: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
5730: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
5740: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
5750: 45 5f 43 4f 4e 46 49 47 5f 50 4d 41 53 5a 3a 20  E_CONFIG_PMASZ: 
5760: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
5770: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 6d  lobalConfig.szPm
5780: 61 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  a = va_arg(ap, u
5790: 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
57a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
57b0: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  ..    default: {
57c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
57d0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
57e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
57f0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
5800: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5810: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20  *.** Set up the 
5820: 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72  lookaside buffer
5830: 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  s for a database
5840: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20   connection..** 
5850: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
5860: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a   on success.  .*
5870: 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69  * If lookaside i
5880: 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
5890: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
58a0: 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  BUSY..**.** The 
58b0: 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  sz parameter is 
58c0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
58d0: 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b  tes in each look
58e0: 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54  aside slot..** T
58f0: 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72  he cnt parameter
5900: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
5910: 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74  f slots.  If pSt
5920: 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a  art is NULL the.
5930: 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ** space for the
5940: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
5950: 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  y is obtained fr
5960: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
5970: 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72  c()..** If pStar
5980: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
5990: 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20  en it is sz*cnt 
59a0: 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
59b0: 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68  to use for.** th
59c0: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
59d0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
59e0: 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  t setupLookaside
59f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
5a00: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a  id *pBuf, int sz
5a10: 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f  , int cnt){.  vo
5a20: 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66  id *pStart;.  if
5a30: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
5a40: 6e 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75  nOut ){.    retu
5a50: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
5a60: 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e    }.  /* Free an
5a70: 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61  y existing looka
5a80: 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20  side buffer for 
5a90: 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f  this handle befo
5aa0: 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69  re.  ** allocati
5ab0: 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20  ng a new one so 
5ac0: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f  we don't have to
5ad0: 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20   have space for 
5ae0: 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68  .  ** both at th
5af0: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a  e same time..  *
5b00: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
5b10: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
5b20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
5b30: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
5b40: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
5b50: 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20   /* The size of 
5b60: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  a lookaside slot
5b70: 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e   after ROUNDDOWN
5b80: 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61  8 needs to be la
5b90: 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61  rger.  ** than a
5ba0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75   pointer to be u
5bb0: 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a  seful..  */.  sz
5bc0: 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a   = ROUNDDOWN8(sz
5bd0: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33  );  /* IMP: R-33
5be0: 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69  038-09382 */.  i
5bf0: 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65  f( sz<=(int)size
5c00: 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  of(LookasideSlot
5c10: 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69  *) ) sz = 0;.  i
5c20: 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d  f( cnt<0 ) cnt =
5c30: 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20   0;.  if( sz==0 
5c40: 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  || cnt==0 ){.   
5c50: 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74   sz = 0;.    pSt
5c60: 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  art = 0;.  }else
5c70: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a   if( pBuf==0 ){.
5c80: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
5c90: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
5ca0: 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c      pStart = sql
5cb0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63  ite3Malloc( sz*c
5cc0: 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  nt );  /* IMP: R
5cd0: 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a  -61949-35727 */.
5ce0: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
5cf0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
5d00: 20 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63    if( pStart ) c
5d10: 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  nt = sqlite3Mall
5d20: 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73  ocSize(pStart)/s
5d30: 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  z;.  }else{.    
5d40: 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  pStart = pBuf;. 
5d50: 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   }.  db->lookasi
5d60: 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61  de.pStart = pSta
5d70: 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  rt;.  db->lookas
5d80: 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20  ide.pFree = 0;. 
5d90: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73   db->lookaside.s
5da0: 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69  z = (u16)sz;.  i
5db0: 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
5dc0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b   int i;.    Look
5dd0: 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20  asideSlot *p;.  
5de0: 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28    assert( sz > (
5df0: 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61  int)sizeof(Looka
5e00: 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20  sideSlot*) );.  
5e10: 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65    p = (Lookaside
5e20: 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20  Slot*)pStart;.  
5e30: 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69    for(i=cnt-1; i
5e40: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  >=0; i--){.     
5e50: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e   p->pNext = db->
5e60: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b  lookaside.pFree;
5e70: 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  .      db->looka
5e80: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a  side.pFree = p;.
5e90: 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61        p = (Looka
5ea0: 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a  sideSlot*)&((u8*
5eb0: 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20  )p)[sz];.    }. 
5ec0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
5ed0: 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64  .pEnd = p;.    d
5ee0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
5ef0: 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 64  abled = 1;.    d
5f00: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
5f10: 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30  lloced = pBuf==0
5f20: 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a   ?1:0;.  }else{.
5f30: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
5f40: 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20  e.pStart = db;. 
5f50: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
5f60: 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20  .pEnd = db;.    
5f70: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
5f80: 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  nabled = 0;.    
5f90: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
5fa0: 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d  alloced = 0;.  }
5fb0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5fc0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
5fd0: 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61  turn the mutex a
5fe0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
5ff0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
6000: 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  tion..*/.sqlite3
6010: 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f  _mutex *sqlite3_
6020: 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33  db_mutex(sqlite3
6030: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
6040: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
6050: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
6060: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
6070: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
6080: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
6090: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
60a0: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
60b0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d 75 74    return db->mut
60c0: 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  ex;.}../*.** Fre
60d0: 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d 65 6d  e up as much mem
60e0: 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20 66 72  ory as we can fr
60f0: 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64 61 74  om the given dat
6100: 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
6110: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
6120: 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65 5f 6d  te3_db_release_m
6130: 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20 2a 64  emory(sqlite3 *d
6140: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 23 69  b){.  int i;..#i
6150: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6160: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
6170: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
6180: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72  yCheckOk(db) ) r
6190: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
61a0: 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
61b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
61c0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
61d0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
61e0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
61f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
6200: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
6210: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
6220: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
6230: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
6240: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
6250: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
6260: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  er(pBt);.      s
6270: 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
6280: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
6290: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
62a0: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
62b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
62c0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
62d0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
62e0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
62f0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
6300: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
6310: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
6320: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
6330: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
6340: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
6350: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
6360: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
6370: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
6380: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
6390: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
63a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
63b0: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
63c0: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
63d0: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
63e0: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
63f0: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
6400: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
6410: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6420: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
6430: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
6440: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
6450: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
6460: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
6470: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
6480: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
6490: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
64a0: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
64b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
64c0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
64d0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
64e0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
64f0: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
6500: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
6510: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
6520: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
6530: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
6540: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
6550: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
6560: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
6570: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
6580: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
6590: 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54  E_FKEY,    SQLIT
65a0: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20  E_ForeignKeys   
65b0: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
65c0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
65d0: 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51  ABLE_TRIGGER, SQ
65e0: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
65f0: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  er  },.      };.
6600: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
6610: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
6620: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
6630: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
6640: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
6650: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
6660: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
6670: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
6680: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
6690: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
66a0: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
66b0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
66c0: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
66d0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
66e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
66f0: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
6700: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
6710: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
6720: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
6730: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
6740: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
6750: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
6760: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
6770: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
6780: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
6790: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
67a0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
67b0: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
67c0: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
67d0: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
67e0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
67f0: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
6800: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
6810: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20   pRes ){.       
6820: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62       *pRes = (db
6830: 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f  ->flags & aFlagO
6840: 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20  p[i].mask)!=0;. 
6850: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6860: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
6870: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  _OK;.          b
6880: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
6890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
68a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
68b0: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
68c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
68d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
68e0: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
68f0: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
6900: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
6910: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
6920: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
6930: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
6940: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
6950: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
6960: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
6970: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
6980: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
6990: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
69a0: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
69b0: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
69c0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
69d0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
69e0: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
69f0: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
6a00: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
6a10: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
6a20: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
6a30: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
6a40: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
6a50: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
6a60: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
6a70: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
6a80: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
6a90: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
6aa0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
6ab0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
6ac0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
6ad0: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
6ae0: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
6af0: 79 32 3b 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43  y2;.  /* EVIDENC
6b00: 45 2d 4f 46 3a 20 52 2d 36 35 30 33 33 2d 32 38  E-OF: R-65033-28
6b10: 34 34 39 20 54 68 65 20 62 75 69 6c 74 2d 69 6e  449 The built-in
6b20: 20 42 49 4e 41 52 59 20 63 6f 6c 6c 61 74 69 6f   BINARY collatio
6b30: 6e 20 63 6f 6d 70 61 72 65 73 0a 20 20 2a 2a 20  n compares.  ** 
6b40: 73 74 72 69 6e 67 73 20 62 79 74 65 20 62 79 20  strings byte by 
6b50: 62 79 74 65 20 75 73 69 6e 67 20 74 68 65 20 6d  byte using the m
6b60: 65 6d 63 6d 70 28 29 20 66 75 6e 63 74 69 6f 6e  emcmp() function
6b70: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
6b80: 72 64 20 43 0a 20 20 2a 2a 20 6c 69 62 72 61 72  rd C.  ** librar
6b90: 79 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 6d 65 6d  y. */.  rc = mem
6ba0: 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32  cmp(pKey1, pKey2
6bb0: 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  , n);.  if( rc==
6bc0: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64  0 ){.    if( pad
6bd0: 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c  Flag.     && all
6be0: 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70  Spaces(((char*)p
6bf0: 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e  Key1)+n, nKey1-n
6c00: 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61  ).     && allSpa
6c10: 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79  ces(((char*)pKey
6c20: 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20  2)+n, nKey2-n). 
6c30: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 45     ){.      /* E
6c40: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 31  VIDENCE-OF: R-31
6c50: 36 32 34 2d 32 34 37 33 37 20 52 54 52 49 4d 20  624-24737 RTRIM 
6c60: 69 73 20 6c 69 6b 65 20 42 49 4e 41 52 59 20 65  is like BINARY e
6c70: 78 63 65 70 74 20 74 68 61 74 20 65 78 74 72 61  xcept that extra
6c80: 0a 20 20 20 20 20 20 2a 2a 20 73 70 61 63 65 73  .      ** spaces
6c90: 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65   at the end of e
6ca0: 69 74 68 65 72 20 73 74 72 69 6e 67 20 64 6f 20  ither string do 
6cb0: 6e 6f 74 20 63 68 61 6e 67 65 20 74 68 65 20 72  not change the r
6cc0: 65 73 75 6c 74 2e 20 49 6e 20 6f 74 68 65 72 0a  esult. In other.
6cd0: 20 20 20 20 20 20 2a 2a 20 77 6f 72 64 73 2c 20        ** words, 
6ce0: 73 74 72 69 6e 67 73 20 77 69 6c 6c 20 63 6f 6d  strings will com
6cf0: 70 61 72 65 20 65 71 75 61 6c 20 74 6f 20 6f 6e  pare equal to on
6d00: 65 20 61 6e 6f 74 68 65 72 20 61 73 20 6c 6f 6e  e another as lon
6d10: 67 20 61 73 20 74 68 65 79 0a 20 20 20 20 20 20  g as they.      
6d20: 2a 2a 20 64 69 66 66 65 72 20 6f 6e 6c 79 20 69  ** differ only i
6d30: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
6d40: 73 70 61 63 65 73 20 61 74 20 74 68 65 20 65 6e  spaces at the en
6d50: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
6d60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
6d70: 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
6d80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
6d90: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
6da0: 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69   Another built-i
6db0: 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  n collating sequ
6dc0: 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a  ence: NOCASE. .*
6dd0: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74  *.** This collat
6de0: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
6df0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
6e00: 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e  sed for "case in
6e10: 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d  dependent.** com
6e20: 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65  parison". SQLite
6e30: 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  's knowledge of 
6e40: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
6e50: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73  case equivalents
6e60: 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79  .** extends only
6e70: 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61   to the 26 chara
6e80: 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68  cters used in th
6e90: 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e English langua
6ea0: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  ge..**.** At the
6eb0: 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73   moment there is
6ec0: 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d   only a UTF-8 im
6ed0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
6ee0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61  .static int noca
6ef0: 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28  seCollatingFunc(
6f00: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
6f10: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
6f20: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
6f30: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
6f40: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
6f50: 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71  .){.  int r = sq
6f60: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20  lite3StrNICmp(. 
6f70: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
6f80: 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74   *)pKey1, (const
6f90: 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28   char *)pKey2, (
6fa0: 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65  nKey1<nKey2)?nKe
6fb0: 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55  y1:nKey2);.  UNU
6fc0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
6fd0: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d  tUsed);.  if( 0=
6fe0: 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b  =r ){.    r = nK
6ff0: 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  ey1-nKey2;.  }. 
7000: 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a   return r;.}../*
7010: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52  .** Return the R
7020: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
7030: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
7040: 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  /.sqlite_int64 s
7050: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
7060: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
7070: 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
7080: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
7090: 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
70a0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
70b0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
70c0: 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
70d0: 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
70e0: 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
70f0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61 73    return db->las
7100: 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tRowid;.}../*.**
7110: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
7120: 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69 6e  er of changes in
7130: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
7140: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
7150: 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _exec()..*/.int 
7160: 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73 28  sqlite3_changes(
7170: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
7180: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
7190: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
71a0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
71b0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
71c0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
71d0: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
71e0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
71f0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
7200: 64 62 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a  db->nChange;.}..
7210: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
7220: 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67   number of chang
7230: 65 73 20 73 69 6e 63 65 20 74 68 65 20 64 61 74  es since the dat
7240: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73  abase handle was
7250: 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20   opened..*/.int 
7260: 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68  sqlite3_total_ch
7270: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
7280: 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  b){.#ifdef SQLIT
7290: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
72a0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
72b0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
72c0: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
72d0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
72e0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
72f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72  ;.  }.#endif.  r
7300: 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c  eturn db->nTotal
7310: 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Change;.}../*.**
7320: 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20   Close all open 
7330: 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73  savepoints. This
7340: 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d   function only m
7350: 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64  anipulates field
7360: 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  s of the.** data
7370: 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65  base handle obje
7380: 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  ct, it does not 
7390: 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f  close any savepo
73a0: 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65  ints that may be
73b0: 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20   open.** at the 
73c0: 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76  b-tree/pager lev
73d0: 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  el..*/.void sqli
73e0: 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e  te3CloseSavepoin
73f0: 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ts(sqlite3 *db){
7400: 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53  .  while( db->pS
7410: 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
7420: 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20  Savepoint *pTmp 
7430: 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74  = db->pSavepoint
7440: 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70  ;.    db->pSavep
7450: 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65  oint = pTmp->pNe
7460: 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  xt;.    sqlite3D
7470: 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b  bFree(db, pTmp);
7480: 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65  .  }.  db->nSave
7490: 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d  point = 0;.  db-
74a0: 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b  >nStatement = 0;
74b0: 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63  .  db->isTransac
74c0: 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  tionSavepoint = 
74d0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f  0;.}../*.** Invo
74e0: 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  ke the destructo
74f0: 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63  r function assoc
7500: 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44  iated with FuncD
7510: 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78  ef p, if any. Ex
7520: 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73  cept,.** if this
7530: 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74   is not the last
7540: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e   copy of the fun
7550: 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e  ction, do not in
7560: 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c  voke it. Multipl
7570: 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61  e.** copies of a
7580: 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e   single function
7590: 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65   are created whe
75a0: 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  n create_functio
75b0: 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  n() is called.**
75c0: 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59   with SQLITE_ANY
75d0: 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67   as the encoding
75e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
75f0: 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79   functionDestroy
7600: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75  (sqlite3 *db, Fu
7610: 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e  ncDef *p){.  Fun
7620: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65  cDestructor *pDe
7630: 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44  structor = p->pD
7640: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28  estructor;.  if(
7650: 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a   pDestructor ){.
7660: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
7670: 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28  >nRef--;.    if(
7680: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52   pDestructor->nR
7690: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ef==0 ){.      p
76a0: 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73  Destructor->xDes
76b0: 74 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72  troy(pDestructor
76c0: 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20  ->pUserData);.  
76d0: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
76e0: 65 28 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f  e(db, pDestructo
76f0: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  r);.    }.  }.}.
7700: 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63  ./*.** Disconnec
7710: 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74  t all sqlite3_vt
7720: 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  ab objects that 
7730: 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61  belong to databa
7740: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a  se connection.**
7750: 20 64 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c   db. This is cal
7760: 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73 20 62  led when db is b
7770: 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  eing closed..*/.
7780: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 63  static void disc
7790: 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71  onnectAllVtab(sq
77a0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e  lite3 *db){.#ifn
77b0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
77c0: 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69  VIRTUALTABLE.  i
77d0: 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42  nt i;.  sqlite3B
77e0: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
77f0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
7800: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
7810: 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d    Schema *pSchem
7820: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  a = db->aDb[i].p
7830: 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20  Schema;.    if( 
7840: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65  db->aDb[i].pSche
7850: 6d 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73 68  ma ){.      Hash
7860: 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66  Elem *p;.      f
7870: 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46  or(p=sqliteHashF
7880: 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74  irst(&pSchema->t
7890: 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71  blHash); p; p=sq
78a0: 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29  liteHashNext(p))
78b0: 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20  {.        Table 
78c0: 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a  *pTab = (Table *
78d0: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
78e0: 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  p);.        if( 
78f0: 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20  IsVirtual(pTab) 
7900: 29 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73  ) sqlite3VtabDis
7910: 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62  connect(db, pTab
7920: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
7930: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74  .  }.  sqlite3Vt
7940: 61 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29  abUnlockList(db)
7950: 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  ;.  sqlite3Btree
7960: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65  LeaveAll(db);.#e
7970: 6c 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  lse.  UNUSED_PAR
7980: 41 4d 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64  AMETER(db);.#end
7990: 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  if.}../*.** Retu
79a0: 72 6e 20 54 52 55 45 20 69 66 20 64 61 74 61 62  rn TRUE if datab
79b0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
79c0: 62 20 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65  b has unfinalize
79d0: 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74  d prepared.** st
79e0: 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69  atements or unfi
79f0: 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62  nished sqlite3_b
7a00: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20  ackup objects.  
7a10: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
7a20: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
7a30: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
7a40: 69 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28  int j;.  assert(
7a50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68   sqlite3_mutex_h
7a60: 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29  eld(db->mutex) )
7a70: 3b 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62  ;.  if( db->pVdb
7a80: 65 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  e ) return 1;.  
7a90: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e  for(j=0; j<db->n
7aa0: 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74  Db; j++){.    Bt
7ab0: 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61  ree *pBt = db->a
7ac0: 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69  Db[j].pBt;.    i
7ad0: 66 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65  f( pBt && sqlite
7ae0: 33 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70  3BtreeIsInBackup
7af0: 28 70 42 74 29 20 29 20 72 65 74 75 72 6e 20 31  (pBt) ) return 1
7b00: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
7b10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  ;.}../*.** Close
7b20: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c   an existing SQL
7b30: 69 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a  ite database.*/.
7b40: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
7b50: 65 33 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20  e3Close(sqlite3 
7b60: 2a 64 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f  *db, int forceZo
7b70: 6d 62 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62  mbie){.  if( !db
7b80: 20 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45   ){.    /* EVIDE
7b90: 4e 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d  NCE-OF: R-63257-
7ba0: 31 31 37 34 30 20 43 61 6c 6c 69 6e 67 20 73 71  11740 Calling sq
7bb0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72  lite3_close() or
7bc0: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
7bd0: 63 6c 6f 73 65 5f 76 32 28 29 20 77 69 74 68 20  close_v2() with 
7be0: 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61  a NULL pointer a
7bf0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 68 61 72  rgument is a har
7c00: 6d 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a  mless no-op. */.
7c10: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
7c20: 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  E_OK;.  }.  if( 
7c30: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
7c40: 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20  eckSickOrOk(db) 
7c50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
7c60: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
7c70: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
7c80: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
7c90: 6d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f  mutex);..  /* Fo
7ca0: 72 63 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20  rce xDisconnect 
7cb0: 63 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72  calls on all vir
7cc0: 74 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20  tual tables */. 
7cd0: 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74   disconnectAllVt
7ce0: 61 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66  ab(db);..  /* If
7cf0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
7d00: 73 20 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63  s open, the disc
7d10: 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20  onnectAllVtab() 
7d20: 63 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20  call above.  ** 
7d30: 77 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61  will not have ca
7d40: 6c 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e  lled the xDiscon
7d50: 6e 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e  nect() method on
7d60: 20 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a   any virtual.  *
7d70: 2a 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20  * tables in the 
7d80: 64 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72  db->aVTrans[] ar
7d90: 72 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ray. The followi
7da0: 6e 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  ng sqlite3VtabRo
7db0: 6c 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61  llback().  ** ca
7dc0: 6c 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57  ll will do so. W
7dd0: 65 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69  e need to do thi
7de0: 73 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65  s before the che
7df0: 63 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20  ck for active.  
7e00: 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  ** SQL statement
7e10: 73 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20  s below, as the 
7e20: 76 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e  v-table implemen
7e30: 74 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74  tation may be st
7e40: 6f 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20  oring.  ** some 
7e50: 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
7e60: 6e 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  nts internally..
7e70: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74    */.  sqlite3Vt
7e80: 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a  abRollback(db);.
7e90: 0a 20 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68  .  /* Legacy beh
7ea0: 61 76 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63  avior (sqlite3_c
7eb0: 6c 6f 73 65 28 29 20 62 65 68 61 76 69 6f 72 29  lose() behavior)
7ec0: 20 69 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20   is to return.  
7ed0: 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69  ** SQLITE_BUSY i
7ee0: 66 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  f the connection
7ef0: 20 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73   can not be clos
7f00: 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  ed immediately..
7f10: 20 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63    */.  if( !forc
7f20: 65 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65  eZombie && conne
7f30: 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20  ctionIsBusy(db) 
7f40: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
7f50: 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53  rorWithMsg(db, S
7f60: 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61  QLITE_BUSY, "una
7f70: 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65  ble to close due
7f80: 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20   to unfinalized 
7f90: 22 0a 20 20 20 20 20 20 20 22 73 74 61 74 65 6d  ".       "statem
7fa0: 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68  ents or unfinish
7fb0: 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20  ed backups");.  
7fc0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7fd0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
7fe0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
7ff0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23  ITE_BUSY;.  }..#
8000: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
8010: 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28  BLE_SQLLOG.  if(
8020: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
8030: 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a  nfig.xSqllog ){.
8040: 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74      /* Closing t
8050: 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74  he handle. Fourt
8060: 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70  h parameter is p
8070: 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20  assed the value 
8080: 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  2. */.    sqlite
8090: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53  3GlobalConfig.xS
80a0: 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f  qllog(sqlite3Glo
80b0: 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f  balConfig.pSqllo
80c0: 67 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b  gArg, db, 0, 2);
80d0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
80e0: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f  * Convert the co
80f0: 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20  nnection into a 
8100: 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20  zombie and then 
8110: 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20  close it..  */. 
8120: 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
8130: 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45  ITE_MAGIC_ZOMBIE
8140: 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65  ;.  sqlite3Leave
8150: 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d  MutexAndCloseZom
8160: 62 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72  bie(db);.  retur
8170: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
8180: 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74  /*.** Two variat
8190: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c  ions on the publ
81a0: 69 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72  ic interface for
81b0: 20 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62   closing a datab
81c0: 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
81d0: 6e 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63  n. The sqlite3_c
81e0: 6c 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72  lose() version r
81f0: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55  eturns SQLITE_BU
8200: 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73  SY and.** leaves
8210: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
8220: 6f 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20  option if there 
8230: 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20  are unfinalized 
8240: 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74  prepared.** stat
8250: 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69  ements or unfini
8260: 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63  shed sqlite3_bac
8270: 6b 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74  kups.  The sqlit
8280: 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a  e3_close_v2().**
8290: 20 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20   version forces 
82a0: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74  the connection t
82b0: 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69  o become a zombi
82c0: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a  e if there are.*
82d0: 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75  * unclosed resou
82e0: 72 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67  rces, and arrang
82f0: 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74  es for deallocat
8300: 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73  ion when the las
8310: 74 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61  t.** prepare sta
8320: 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65  tement or sqlite
8330: 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e  3_backup closes.
8340: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
8350: 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64  close(sqlite3 *d
8360: 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  b){ return sqlit
8370: 65 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d  e3Close(db,0); }
8380: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .int sqlite3_clo
8390: 73 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64  se_v2(sqlite3 *d
83a0: 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74  b){ return sqlit
83b0: 65 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d  e3Close(db,1); }
83c0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74  .../*.** Close t
83d0: 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61  he mutex on data
83e0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
83f0: 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65  db..**.** Furthe
8400: 72 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61  rmore, if databa
8410: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
8420: 20 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65   is a zombie (me
8430: 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72 65  aning that there
8440: 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70  .** has been a p
8450: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
8460: 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f  ite3_close(db) o
8470: 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  r sqlite3_close_
8480: 76 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65  v2(db)) and.** e
8490: 76 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d  very sqlite3_stm
84a0: 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66  t has now been f
84b0: 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65  inalized and eve
84c0: 72 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  ry sqlite3_backu
84d0: 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65  p has.** finishe
84e0: 64 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c  d, then free all
84f0: 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76   resources..*/.v
8500: 6f 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65  oid sqlite3Leave
8510: 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d  MutexAndCloseZom
8520: 62 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  bie(sqlite3 *db)
8530: 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b  {.  HashElem *i;
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c      /* Hash tabl
8560: 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  e iterator */.  
8570: 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20  int j;..  /* If 
8580: 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61  there are outsta
8590: 6e 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74  nding sqlite3_st
85a0: 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61  mt or sqlite3_ba
85b0: 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a  ckup objects.  *
85c0: 2a 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e  * or if the conn
85d0: 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79  ection has not y
85e0: 65 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62  et been closed b
85f0: 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  y sqlite3_close_
8600: 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20  v2(),.  ** then 
8610: 6a 75 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d  just leave the m
8620: 75 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e  utex and return.
8630: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  .  */.  if( db->
8640: 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41  magic!=SQLITE_MA
8650: 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f  GIC_ZOMBIE || co
8660: 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64  nnectionIsBusy(d
8670: 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  b) ){.    sqlite
8680: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
8690: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65  ->mutex);.    re
86a0: 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  turn;.  }..  /* 
86b0: 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73  If we reach this
86c0: 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73   point, it means
86d0: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
86e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  se connection ha
86f0: 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c  s.  ** closed al
8700: 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61  l sqlite3_stmt a
8710: 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  nd sqlite3_backu
8720: 70 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61  p objects and ha
8730: 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73  s been.  ** pass
8740: 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c  ed to sqlite3_cl
8750: 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61  ose (meaning tha
8760: 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65  t it is a zombie
8770: 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20  ).  Therefore,. 
8780: 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64   ** go ahead and
8790: 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72   free all resour
87a0: 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20  ces..  */..  /* 
87b0: 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
87c0: 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69   is open, roll i
87d0: 74 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73  t back. This als
87e0: 6f 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 69  o ensures that i
87f0: 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62  f.  ** any datab
8800: 61 73 65 20 73 63 68 65 6d 61 73 20 68 61 76 65  ase schemas have
8810: 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62   been modified b
8820: 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64  y an uncommitted
8830: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a   transaction.  *
8840: 2a 20 74 68 65 79 20 61 72 65 20 72 65 73 65 74  * they are reset
8850: 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 72  . And that the r
8860: 65 71 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d  equired b-tree m
8870: 75 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20  utex is held to 
8880: 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61  make.  ** the pa
8890: 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64  ger rollback and
88a0: 20 73 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e   schema reset an
88b0: 20 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f   atomic operatio
88c0: 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52  n. */.  sqlite3R
88d0: 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53  ollbackAll(db, S
88e0: 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a  QLITE_OK);..  /*
88f0: 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61   Free any outsta
8900: 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20  nding Savepoint 
8910: 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20  structures. */. 
8920: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
8930: 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20  epoints(db);..  
8940: 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74  /* Close all dat
8950: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
8960: 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  s */.  for(j=0; 
8970: 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b  j<db->nDb; j++){
8980: 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a  .    struct Db *
8990: 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a  pDb = &db->aDb[j
89a0: 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e  ];.    if( pDb->
89b0: 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  pBt ){.      sql
89c0: 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70  ite3BtreeClose(p
89d0: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20  Db->pBt);.      
89e0: 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20  pDb->pBt = 0;.  
89f0: 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a      if( j!=1 ){.
8a00: 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63          pDb->pSc
8a10: 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20  hema = 0;.      
8a20: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
8a30: 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20   Clear the TEMP 
8a40: 73 63 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c  schema separatel
8a50: 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20  y and last */.  
8a60: 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  if( db->aDb[1].p
8a70: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71  Schema ){.    sq
8a80: 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72  lite3SchemaClear
8a90: 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68  (db->aDb[1].pSch
8aa0: 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ema);.  }.  sqli
8ab0: 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73  te3VtabUnlockLis
8ac0: 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65  t(db);..  /* Fre
8ad0: 65 20 75 70 20 74 68 65 20 61 72 72 61 79 20 6f  e up the array o
8ae0: 66 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61  f auxiliary data
8af0: 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  bases */.  sqlit
8b00: 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61  e3CollapseDataba
8b10: 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61  seArray(db);.  a
8b20: 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d  ssert( db->nDb<=
8b30: 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64  2 );.  assert( d
8b40: 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53  b->aDb==db->aDbS
8b50: 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54  tatic );..  /* T
8b60: 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20  ell the code in 
8b70: 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74 68  notify.c that th
8b80: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20  e connection no 
8b90: 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79  longer holds any
8ba0: 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20  .  ** locks and 
8bb0: 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65  does not require
8bc0: 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c   any further unl
8bd0: 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62  ock-notify callb
8be0: 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  acks..  */.  sql
8bf0: 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c  ite3ConnectionCl
8c00: 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72  osed(db);..  for
8c10: 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a  (j=0; j<ArraySiz
8c20: 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20  e(db->aFunc.a); 
8c30: 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65  j++){.    FuncDe
8c40: 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68  f *pNext, *pHash
8c50: 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d  , *p;.    for(p=
8c60: 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20  db->aFunc.a[j]; 
8c70: 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20  p; p=pHash){.   
8c80: 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48     pHash = p->pH
8c90: 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  ash;.      while
8ca0: 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66  ( p ){.        f
8cb0: 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64  unctionDestroy(d
8cc0: 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70  b, p);.        p
8cd0: 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b  Next = p->pNext;
8ce0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8cf0: 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20  DbFree(db, p);. 
8d00: 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74         p = pNext
8d10: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
8d20: 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69    }.  for(i=sqli
8d30: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
8d40: 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69  >aCollSeq); i; i
8d50: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
8d60: 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71  i)){.    CollSeq
8d70: 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53   *pColl = (CollS
8d80: 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  eq *)sqliteHashD
8d90: 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49  ata(i);.    /* I
8da0: 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75  nvoke any destru
8db0: 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64  ctors registered
8dc0: 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   for collation s
8dd0: 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74  equence user dat
8de0: 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d  a. */.    for(j=
8df0: 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20  0; j<3; j++){.  
8e00: 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d      if( pColl[j]
8e10: 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20  .xDel ){.       
8e20: 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70   pColl[j].xDel(p
8e30: 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a  Coll[j].pUser);.
8e40: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
8e50: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
8e60: 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a  db, pColl);.  }.
8e70: 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65    sqlite3HashCle
8e80: 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  ar(&db->aCollSeq
8e90: 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
8ea0: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
8eb0: 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69  BLE.  for(i=sqli
8ec0: 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d  teHashFirst(&db-
8ed0: 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d  >aModule); i; i=
8ee0: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
8ef0: 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a  )){.    Module *
8f00: 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a  pMod = (Module *
8f10: 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28  )sqliteHashData(
8f20: 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64  i);.    if( pMod
8f30: 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20  ->xDestroy ){.  
8f40: 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72      pMod->xDestr
8f50: 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a  oy(pMod->pAux);.
8f60: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
8f70: 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64  3DbFree(db, pMod
8f80: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
8f90: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
8fa0: 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a  Module);.#endif.
8fb0: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
8fc0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20  db, SQLITE_OK); 
8fd0: 2f 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61  /* Deallocates a
8fe0: 6e 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20  ny cached error 
8ff0: 73 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71  strings. */.  sq
9000: 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64  lite3ValueFree(d
9010: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69  b->pErr);.  sqli
9020: 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f  te3CloseExtensio
9030: 6e 73 28 64 62 29 3b 0a 23 69 66 20 53 51 4c 49  ns(db);.#if SQLI
9040: 54 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49  TE_USER_AUTHENTI
9050: 43 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33  CATION.  sqlite3
9060: 5f 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a  _free(db->auth.z
9070: 41 75 74 68 55 73 65 72 29 3b 0a 20 20 73 71 6c  AuthUser);.  sql
9080: 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75  ite3_free(db->au
9090: 74 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e  th.zAuthPW);.#en
90a0: 64 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63  dif..  db->magic
90b0: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
90c0: 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65  ERROR;..  /* The
90d0: 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73   temp-database s
90e0: 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74  chema is allocat
90f0: 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66  ed differently f
9100: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63  rom the other sc
9110: 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  hema.  ** object
9120: 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d  s (using sqliteM
9130: 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79  alloc() directly
9140: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c  , instead of sql
9150: 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
9160: 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e  ))..  ** So it n
9170: 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
9180: 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79   here. Todo: Why
9190: 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65   not roll the te
91a0: 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20  mp schema into. 
91b0: 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c   ** the same sql
91c0: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74  iteMalloc() as t
91d0: 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f  he one that allo
91e0: 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61  cates the databa
91f0: 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  se .  ** structu
9200: 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  re?.  */.  sqlit
9210: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
9220: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
9230: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
9240: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
9250: 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  x);.  db->magic 
9260: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43  = SQLITE_MAGIC_C
9270: 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  LOSED;.  sqlite3
9280: 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e  _mutex_free(db->
9290: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
92a0: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
92b0: 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46  nOut==0 );  /* F
92c0: 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73  ails on a lookas
92d0: 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20  ide memory leak 
92e0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  */.  if( db->loo
92f0: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
9300: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
9310: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
9320: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
9330: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
9340: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  b);.}../*.** Rol
9350: 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61  lback all databa
9360: 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72  se files.  If tr
9370: 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51  ipCode is not SQ
9380: 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a  LITE_OK, then.**
9390: 20 61 6e 79 20 77 72 69 74 65 20 63 75 72 73 6f   any write curso
93a0: 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  rs are invalidat
93b0: 65 64 20 28 22 74 72 69 70 70 65 64 22 20 2d 20  ed ("tripped" - 
93c0: 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20  as in "tripping 
93d0: 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65  a circuit.** bre
93e0: 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20  aker") and made 
93f0: 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f  to return tripCo
9400: 64 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20  de if there are 
9410: 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61  any further.** a
9420: 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74  ttempts to use t
9430: 68 61 74 20 63 75 72 73 6f 72 2e 20 20 52 65 61  hat cursor.  Rea
9440: 64 20 63 75 72 73 6f 72 73 20 72 65 6d 61 69 6e  d cursors remain
9450: 20 6f 70 65 6e 20 61 6e 64 20 76 61 6c 69 64 0a   open and valid.
9460: 2a 2a 20 62 75 74 20 61 72 65 20 22 73 61 76 65  ** but are "save
9470: 64 22 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  d" in case the t
9480: 61 62 6c 65 20 70 61 67 65 73 20 61 72 65 20 6d  able pages are m
9490: 6f 76 65 64 20 61 72 6f 75 6e 64 2e 0a 2a 2f 0a  oved around..*/.
94a0: 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c  void sqlite3Roll
94b0: 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20  backAll(sqlite3 
94c0: 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64  *db, int tripCod
94d0: 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  e){.  int i;.  i
94e0: 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a  nt inTrans = 0;.
94f0: 20 20 69 6e 74 20 73 63 68 65 6d 61 43 68 61 6e    int schemaChan
9500: 67 65 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71  ge;.  assert( sq
9510: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
9520: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
9530: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
9540: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20  ignMalloc();..  
9550: 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d  /* Obtain all b-
9560: 74 72 65 65 20 6d 75 74 65 78 65 73 20 62 65 66  tree mutexes bef
9570: 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63  ore making any c
9580: 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52 6f 6c  alls to BtreeRol
9590: 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54  lback(). .  ** T
95a0: 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  his is important
95b0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 72 61   in case the tra
95c0: 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 20 72  nsaction being r
95d0: 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73 0a 20  olled back has. 
95e0: 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 68 65   ** modified the
95f0: 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
9600: 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65 65 20  . If the b-tree 
9610: 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20  mutexes are not 
9620: 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c  taken.  ** here,
9630: 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20 73 68   then another sh
9640: 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65  ared-cache conne
9650: 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61  ction might snea
9660: 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a  k in between.  *
9670: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 72  * the database r
9680: 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65  ollback and sche
9690: 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63 68 20  ma reset, which 
96a0: 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73 65 0a  can cause false.
96b0: 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20    ** corruption 
96c0: 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20  reports in some 
96d0: 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c  cases.  */.  sql
96e0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
96f0: 6c 28 64 62 29 3b 0a 20 20 73 63 68 65 6d 61 43  l(db);.  schemaC
9700: 68 61 6e 67 65 20 3d 20 28 64 62 2d 3e 66 6c 61  hange = (db->fla
9710: 67 73 20 26 20 53 51 4c 49 54 45 5f 49 6e 74 65  gs & SQLITE_Inte
9720: 72 6e 43 68 61 6e 67 65 73 29 21 3d 30 20 26 26  rnChanges)!=0 &&
9730: 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d   db->init.busy==
9740: 30 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  0;..  for(i=0; i
9750: 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
9760: 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64      Btree *p = d
9770: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
9780: 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20     if( p ){.    
9790: 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74 72    if( sqlite3Btr
97a0: 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29  eeIsInTrans(p) )
97b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e  {.        inTran
97c0: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  s = 1;.      }. 
97d0: 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65       sqlite3Btre
97e0: 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69  eRollback(p, tri
97f0: 70 43 6f 64 65 2c 20 21 73 63 68 65 6d 61 43 68  pCode, !schemaCh
9800: 61 6e 67 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ange);.    }.  }
9810: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
9820: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71  llback(db);.  sq
9830: 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
9840: 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 28  lloc();..  if( (
9850: 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  db->flags&SQLITE
9860: 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21  _InternChanges)!
9870: 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62  =0 && db->init.b
9880: 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  usy==0 ){.    sq
9890: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
98a0: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
98b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
98c0: 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43  setAllSchemasOfC
98d0: 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20  onnection(db);. 
98e0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
98f0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a  eLeaveAll(db);..
9900: 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65    /* Any deferre
9910: 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f  d constraint vio
9920: 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77  lations have now
9930: 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20   been resolved. 
9940: 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  */.  db->nDeferr
9950: 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62  edCons = 0;.  db
9960: 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f  ->nDeferredImmCo
9970: 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c  ns = 0;.  db->fl
9980: 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44  ags &= ~SQLITE_D
9990: 65 66 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49  eferFKs;..  /* I
99a0: 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63  f one has been c
99b0: 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b  onfigured, invok
99c0: 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68  e the rollback-h
99d0: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ook callback */.
99e0: 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62    if( db->xRollb
99f0: 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28  ackCallback && (
9a00: 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e  inTrans || !db->
9a10: 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20  autoCommit) ){. 
9a20: 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b     db->xRollback
9a30: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f  Callback(db->pRo
9a40: 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a  llbackArg);.  }.
9a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
9a60: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
9a70: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
9a80: 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  ame correspondin
9a90: 67 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63  g to the error c
9aa0: 6f 64 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  ode.** specified
9ab0: 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
9ac0: 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69 6e 65  ..*/.#if (define
9ad0: 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
9ae0: 26 26 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  && SQLITE_OS_WIN
9af0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
9b00: 49 54 45 5f 54 45 53 54 29 0a 63 6f 6e 73 74 20  ITE_TEST).const 
9b10: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72  char *sqlite3Err
9b20: 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20  Name(int rc){.  
9b30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
9b40: 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20  e = 0;.  int i, 
9b50: 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a 20 20 66  origRc = rc;.  f
9b60: 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26 26 20 7a  or(i=0; i<2 && z
9b70: 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63  Name==0; i++, rc
9b80: 20 26 3d 20 30 78 66 66 29 7b 0a 20 20 20 20 73   &= 0xff){.    s
9b90: 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20  witch( rc ){.   
9ba0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f     case SQLITE_O
9bb0: 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K:              
9bc0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9bd0: 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20  TE_OK";         
9be0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9bf0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9c00: 45 52 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20  ERROR:          
9c10: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9c20: 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20  ITE_ERROR";     
9c30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9c40: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9c50: 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20 20  _INTERNAL:      
9c60: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9c70: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20  LITE_INTERNAL"; 
9c80: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9c90: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9ca0: 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20 20 20  E_PERM:         
9cb0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9cc0: 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20  QLITE_PERM";    
9cd0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9ce0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9cf0: 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 20  TE_ABORT:       
9d00: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9d10: 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20  SQLITE_ABORT";  
9d20: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9d30: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9d40: 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
9d50: 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  CK:     zName = 
9d60: 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f  "SQLITE_ABORT_RO
9d70: 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62 72 65 61  LLBACK";    brea
9d80: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9d90: 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20  LITE_BUSY:      
9da0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9db0: 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20   "SQLITE_BUSY"; 
9dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
9dd0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9de0: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56  QLITE_BUSY_RECOV
9df0: 45 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  ERY:      zName 
9e00: 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  = "SQLITE_BUSY_R
9e10: 45 43 4f 56 45 52 59 22 3b 20 20 20 20 20 62 72  ECOVERY";     br
9e20: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9e30: 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50  SQLITE_BUSY_SNAP
9e40: 53 48 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65  SHOT:      zName
9e50: 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f   = "SQLITE_BUSY_
9e60: 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20 20 62  SNAPSHOT";     b
9e70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9e80: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20   SQLITE_LOCKED: 
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9ea0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b  e = "SQLITE_LOCK
9eb0: 45 44 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  ED";            
9ec0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9ed0: 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f  e SQLITE_LOCKED_
9ee0: 53 48 41 52 45 44 43 41 43 48 45 3a 20 7a 4e 61  SHAREDCACHE: zNa
9ef0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43  me = "SQLITE_LOC
9f00: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 22  KED_SHAREDCACHE"
9f10: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
9f20: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a  se SQLITE_NOMEM:
9f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
9f40: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
9f50: 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20  MEM";           
9f60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9f70: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
9f80: 4e 4c 59 3a 20 20 20 20 20 20 20 20 20 20 20 7a  NLY:           z
9f90: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
9fa0: 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20 20  EADONLY";       
9fb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9fc0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
9fd0: 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20 20  ONLY_RECOVERY:  
9fe0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9ff0: 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52  READONLY_RECOVER
a000: 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  Y"; break;.     
a010: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
a020: 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20  DONLY_CANTLOCK: 
a030: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a040: 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f  _READONLY_CANTLO
a050: 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CK"; break;.    
a060: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
a070: 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a  ADONLY_ROLLBACK:
a080: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a090: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
a0a0: 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ACK"; break;.   
a0b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
a0c0: 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a  EADONLY_DBMOVED:
a0d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a0e0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f  TE_READONLY_DBMO
a0f0: 56 45 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  VED";  break;.  
a100: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a110: 49 4e 54 45 52 52 55 50 54 3a 20 20 20 20 20 20  INTERRUPT:      
a120: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a130: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20  ITE_INTERRUPT"; 
a140: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
a150: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a160: 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 20 20 20  _IOERR:         
a170: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a180: 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20  LITE_IOERR";    
a190: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
a1a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a1b0: 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20 20 20  E_IOERR_READ:   
a1c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
a1d0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44  QLITE_IOERR_READ
a1e0: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
a1f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a200: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
a210: 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22  EAD:   zName = "
a220: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
a230: 52 54 5f 52 45 41 44 22 3b 20 20 62 72 65 61 6b  RT_READ";  break
a240: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a250: 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a  ITE_IOERR_WRITE:
a260: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
a270: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52  "SQLITE_IOERR_WR
a280: 49 54 45 22 3b 20 20 20 20 20 20 20 62 72 65 61  ITE";       brea
a290: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a2a0: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
a2b0: 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  :        zName =
a2c0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46   "SQLITE_IOERR_F
a2d0: 53 59 4e 43 22 3b 20 20 20 20 20 20 20 62 72 65  SYNC";       bre
a2e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a2f0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
a300: 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d 65 20  FSYNC:    zName 
a310: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
a320: 44 49 52 5f 46 53 59 4e 43 22 3b 20 20 20 62 72  DIR_FSYNC";   br
a330: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
a340: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
a350: 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e 61 6d 65  NCATE:     zName
a360: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
a370: 5f 54 52 55 4e 43 41 54 45 22 3b 20 20 20 20 62  _TRUNCATE";    b
a380: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
a390: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
a3a0: 54 41 54 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  TAT:        zNam
a3b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
a3c0: 52 5f 46 53 54 41 54 22 3b 20 20 20 20 20 20 20  R_FSTAT";       
a3d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
a3e0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55  e SQLITE_IOERR_U
a3f0: 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61  NLOCK:       zNa
a400: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
a410: 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20 20  RR_UNLOCK";     
a420: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a430: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
a440: 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e  RDLOCK:       zN
a450: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
a460: 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20  ERR_RDLOCK";    
a470: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a480: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
a490: 5f 44 45 4c 45 54 45 3a 20 20 20 20 20 20 20 7a  _DELETE:       z
a4a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a4b0: 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b 20 20 20  OERR_DELETE";   
a4c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a4d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
a4e0: 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20  R_NOMEM:        
a4f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a500: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20  IOERR_NOMEM";   
a510: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a520: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
a530: 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20 20 20  RR_ACCESS:      
a540: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a550: 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22 3b 20  _IOERR_ACCESS"; 
a560: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a570: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
a580: 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45  ERR_CHECKRESERVE
a590: 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20  DLOCK:.         
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a5b0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a5c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45  SQLITE_IOERR_CHE
a5d0: 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b  CKRESERVEDLOCK";
a5e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
a5f0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
a600: 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e  LOCK:         zN
a610: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
a620: 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20  ERR_LOCK";      
a630: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
a640: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
a650: 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20 20 20 7a  _CLOSE:        z
a660: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
a670: 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20  OERR_CLOSE";    
a680: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
a690: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
a6a0: 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20  R_DIR_CLOSE:    
a6b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a6c0: 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22  IOERR_DIR_CLOSE"
a6d0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
a6e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
a6f0: 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20  RR_SHMOPEN:     
a700: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a710: 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b  _IOERR_SHMOPEN";
a720: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a730: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
a740: 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20  ERR_SHMSIZE:    
a750: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a760: 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22  E_IOERR_SHMSIZE"
a770: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
a780: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
a790: 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20  OERR_SHMLOCK:   
a7a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
a7b0: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b  TE_IOERR_SHMLOCK
a7c0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
a7d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a7e0: 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20  IOERR_SHMMAP:   
a7f0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
a800: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
a810: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
a820: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
a830: 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20 20 20 20  _IOERR_SEEK:    
a840: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
a850: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22  LITE_IOERR_SEEK"
a860: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
a870: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
a880: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
a890: 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  OENT: zName = "S
a8a0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
a8b0: 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b  TE_NOENT";break;
a8c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
a8d0: 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20  TE_IOERR_MMAP:  
a8e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
a8f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
a900: 50 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  P";        break
a910: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
a920: 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
a930: 50 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  PPATH:  zName = 
a940: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45  "SQLITE_IOERR_GE
a950: 54 54 45 4d 50 50 41 54 48 22 3b 20 62 72 65 61  TTEMPPATH"; brea
a960: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
a970: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
a980: 41 54 48 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ATH:     zName =
a990: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43   "SQLITE_IOERR_C
a9a0: 4f 4e 56 50 41 54 48 22 3b 20 20 20 20 62 72 65  ONVPATH";    bre
a9b0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
a9c0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20  QLITE_CORRUPT:  
a9d0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
a9e0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  = "SQLITE_CORRUP
a9f0: 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72  T";           br
aa00: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
aa10: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
aa20: 54 41 42 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  TAB:       zName
aa30: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55   = "SQLITE_CORRU
aa40: 50 54 5f 56 54 41 42 22 3b 20 20 20 20 20 20 62  PT_VTAB";      b
aa50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
aa60: 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44   SQLITE_NOTFOUND
aa70: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
aa80: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46  e = "SQLITE_NOTF
aa90: 4f 55 4e 44 22 3b 20 20 20 20 20 20 20 20 20 20  OUND";          
aaa0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
aab0: 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20  e SQLITE_FULL:  
aac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
aad0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c  me = "SQLITE_FUL
aae0: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  L";             
aaf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
ab00: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
ab10: 45 4e 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  EN:           zN
ab20: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
ab30: 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20 20 20 20  NTOPEN";        
ab40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
ab50: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
ab60: 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a  PEN_NOTEMPDIR: z
ab70: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
ab80: 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49  ANTOPEN_NOTEMPDI
ab90: 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  R";break;.      
aba0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
abb0: 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20 20 20 20  OPEN_ISDIR:     
abc0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
abd0: 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b  CANTOPEN_ISDIR";
abe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
abf0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
ac00: 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20  TOPEN_FULLPATH: 
ac10: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
ac20: 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41  _CANTOPEN_FULLPA
ac30: 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  TH"; break;.    
ac40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
ac50: 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 3a  NTOPEN_CONVPATH:
ac60: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
ac70: 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50  E_CANTOPEN_CONVP
ac80: 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ATH"; break;.   
ac90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50     case SQLITE_P
aca0: 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20  ROTOCOL:        
acb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
acc0: 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20  TE_PROTOCOL";   
acd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ace0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
acf0: 45 4d 50 54 59 3a 20 20 20 20 20 20 20 20 20 20  EMPTY:          
ad00: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
ad10: 49 54 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20  ITE_EMPTY";     
ad20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ad30: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
ad40: 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 20 20 20  _SCHEMA:        
ad50: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
ad60: 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20  LITE_SCHEMA";   
ad70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
ad80: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
ad90: 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20 20 20  E_TOOBIG:       
ada0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
adb0: 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20  QLITE_TOOBIG";  
adc0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
add0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
ade0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20  TE_CONSTRAINT:  
adf0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
ae00: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
ae10: 54 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  T";        break
ae20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
ae30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
ae40: 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20  NIQUE:  zName = 
ae50: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
ae60: 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62 72 65 61  NT_UNIQUE"; brea
ae70: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
ae80: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
ae90: 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d  TRIGGER: zName =
aea0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
aeb0: 49 4e 54 5f 54 52 49 47 47 45 52 22 3b 62 72 65  INT_TRIGGER";bre
aec0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
aed0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
aee0: 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20  _FOREIGNKEY:.   
aef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af00: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
af10: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
af20: 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b  STRAINT_FOREIGNK
af30: 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  EY";   break;.  
af40: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
af50: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b  CONSTRAINT_CHECK
af60: 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  :   zName = "SQL
af70: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43  ITE_CONSTRAINT_C
af80: 48 45 43 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20  HECK";  break;. 
af90: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
afa0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d  _CONSTRAINT_PRIM
afb0: 41 52 59 4b 45 59 3a 0a 20 20 20 20 20 20 20 20  ARYKEY:.        
afc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
afd0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
afe0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
aff0: 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 22 3b 20  NT_PRIMARYKEY"; 
b000: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
b010: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
b020: 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a  RAINT_NOTNULL: z
b030: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
b040: 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c  ONSTRAINT_NOTNUL
b050: 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  L";break;.      
b060: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
b070: 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f  TRAINT_COMMITHOO
b080: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
b090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b0a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b0b0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f  TE_CONSTRAINT_CO
b0c0: 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65  MMITHOOK";   bre
b0d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b0e0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
b0f0: 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20  _VTAB:    zName 
b100: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
b110: 41 49 4e 54 5f 56 54 41 42 22 3b 20 20 20 62 72  AINT_VTAB";   br
b120: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b130: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b140: 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  T_FUNCTION:.    
b150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b160: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b170: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
b180: 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22  TRAINT_FUNCTION"
b190: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
b1a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
b1b0: 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3a  ONSTRAINT_ROWID:
b1c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b1d0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f  TE_CONSTRAINT_RO
b1e0: 57 49 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  WID";  break;.  
b1f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
b200: 4d 49 53 4d 41 54 43 48 3a 20 20 20 20 20 20 20  MISMATCH:       
b210: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
b220: 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20  ITE_MISMATCH";  
b230: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b240: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
b250: 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 20 20 20  _MISUSE:        
b260: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
b270: 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20 20 20  LITE_MISUSE";   
b280: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
b290: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
b2a0: 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20 20  E_NOLFS:        
b2b0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
b2c0: 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20  QLITE_NOLFS";   
b2d0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b2e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
b2f0: 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20 20  TE_AUTH:        
b300: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
b310: 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20 20 20  SQLITE_AUTH";   
b320: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
b330: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
b340: 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20  ITE_FORMAT:     
b350: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
b360: 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b  "SQLITE_FORMAT";
b370: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
b380: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
b390: 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20  LITE_RANGE:     
b3a0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
b3b0: 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b   "SQLITE_RANGE";
b3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
b3d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b3e0: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20  QLITE_NOTADB:   
b3f0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b400: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42  = "SQLITE_NOTADB
b410: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
b420: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b430: 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20 20  SQLITE_ROW:     
b440: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
b450: 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b   = "SQLITE_ROW";
b460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
b470: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b480: 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 3a 20   SQLITE_NOTICE: 
b490: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b4a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49  e = "SQLITE_NOTI
b4b0: 43 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  CE";            
b4c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
b4d0: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f  e SQLITE_NOTICE_
b4e0: 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e 61  RECOVER_WAL: zNa
b4f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
b500: 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 22  ICE_RECOVER_WAL"
b510: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
b520: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  se SQLITE_NOTICE
b530: 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43  _RECOVER_ROLLBAC
b540: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
b550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b560: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
b570: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
b580: 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65  R_ROLLBACK"; bre
b590: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
b5a0: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 3a 20 20  QLITE_WARNING:  
b5b0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
b5c0: 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e  = "SQLITE_WARNIN
b5d0: 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 62 72  G";           br
b5e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
b5f0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
b600: 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e 61 6d 65  UTOINDEX:  zName
b610: 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49   = "SQLITE_WARNI
b620: 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22 3b 20 62  NG_AUTOINDEX"; b
b630: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
b640: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20   SQLITE_DONE:   
b650: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
b660: 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45  e = "SQLITE_DONE
b670: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
b680: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
b690: 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20  .  if( zName==0 
b6a0: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  ){.    static ch
b6b0: 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20  ar zBuf[50];.   
b6c0: 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
b6d0: 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20  f(sizeof(zBuf), 
b6e0: 7a 42 75 66 2c 20 22 53 51 4c 49 54 45 5f 55 4e  zBuf, "SQLITE_UN
b6f0: 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f 72 69 67  KNOWN(%d)", orig
b700: 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d  Rc);.    zName =
b710: 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 72 65 74   zBuf;.  }.  ret
b720: 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e  urn zName;.}.#en
b730: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
b740: 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  n a static strin
b750: 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73  g that describes
b760: 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72   the kind of err
b770: 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20  or specified in 
b780: 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  the.** argument.
b790: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
b7a0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e  sqlite3ErrStr(in
b7b0: 74 20 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20  t rc){.  static 
b7c0: 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73  const char* cons
b7d0: 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20  t aMsg[] = {.   
b7e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20   /* SQLITE_OK   
b7f0: 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61         */ "not a
b800: 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a  n error",.    /*
b810: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20   SQLITE_ERROR   
b820: 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69      */ "SQL logi
b830: 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69  c error or missi
b840: 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20  ng database",.  
b850: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45    /* SQLITE_INTE
b860: 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20  RNAL    */ 0,.  
b870: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d    /* SQLITE_PERM
b880: 20 20 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65          */ "acce
b890: 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65  ss permission de
b8a0: 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  nied",.    /* SQ
b8b0: 4c 49 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20  LITE_ABORT      
b8c0: 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65   */ "callback re
b8d0: 71 75 65 73 74 65 64 20 71 75 65 72 79 20 61 62  quested query ab
b8e0: 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ort",.    /* SQL
b8f0: 49 54 45 5f 42 55 53 59 20 20 20 20 20 20 20 20  ITE_BUSY        
b900: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 69 73 20  */ "database is 
b910: 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20  locked",.    /* 
b920: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20  SQLITE_LOCKED   
b930: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
b940: 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22  table is locked"
b950: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
b960: 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22  NOMEM       */ "
b970: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a  out of memory",.
b980: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45      /* SQLITE_RE
b990: 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74  ADONLY    */ "at
b9a0: 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61  tempt to write a
b9b0: 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61   readonly databa
b9c0: 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  se",.    /* SQLI
b9d0: 54 45 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a  TE_INTERRUPT   *
b9e0: 2f 20 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c  / "interrupted",
b9f0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
ba00: 4f 45 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64  OERR       */ "d
ba10: 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a  isk I/O error",.
ba20: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f      /* SQLITE_CO
ba30: 52 52 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61  RRUPT     */ "da
ba40: 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67  tabase disk imag
ba50: 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c  e is malformed",
ba60: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
ba70: 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75  OTFOUND    */ "u
ba80: 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e  nknown operation
ba90: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
baa0: 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20  _FULL        */ 
bab0: 22 64 61 74 61 62 61 73 65 20 6f 72 20 64 69 73  "database or dis
bac0: 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20  k is full",.    
bad0: 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  /* SQLITE_CANTOP
bae0: 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65  EN    */ "unable
baf0: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
bb00: 65 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20  e file",.    /* 
bb10: 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20  SQLITE_PROTOCOL 
bb20: 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70     */ "locking p
bb30: 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a  rotocol",.    /*
bb40: 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20   SQLITE_EMPTY   
bb50: 20 20 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f      */ "table co
bb60: 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c  ntains no data",
bb70: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53  .    /* SQLITE_S
bb80: 43 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64  CHEMA      */ "d
bb90: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68  atabase schema h
bba0: 61 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20  as changed",.   
bbb0: 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49   /* SQLITE_TOOBI
bbc0: 47 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e  G      */ "strin
bbd0: 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69  g or blob too bi
bbe0: 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  g",.    /* SQLIT
bbf0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f  E_CONSTRAINT  */
bc00: 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69   "constraint fai
bc10: 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  led",.    /* SQL
bc20: 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20  ITE_MISMATCH    
bc30: 2a 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69 73  */ "datatype mis
bc40: 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53  match",.    /* S
bc50: 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20  QLITE_MISUSE    
bc60: 20 20 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f    */ "library ro
bc70: 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74  utine called out
bc80: 20 6f 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20   of sequence",. 
bc90: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c     /* SQLITE_NOL
bca0: 46 53 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72  FS       */ "lar
bcb0: 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20  ge file support 
bcc0: 69 73 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20  is disabled",.  
bcd0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48    /* SQLITE_AUTH
bce0: 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68          */ "auth
bcf0: 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64  orization denied
bd00: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
bd10: 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20  _FORMAT      */ 
bd20: 22 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62  "auxiliary datab
bd30: 61 73 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72  ase format error
bd40: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
bd50: 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20  _RANGE       */ 
bd60: 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20  "bind or column 
bd70: 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e  index out of ran
bd80: 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ge",.    /* SQLI
bd90: 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a  TE_NOTADB      *
bda0: 2f 20 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79  / "file is encry
bdb0: 70 74 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61  pted or is not a
bdc0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b   database",.  };
bdd0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
bde0: 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65  Err = "unknown e
bdf0: 72 72 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28  rror";.  switch(
be00: 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20   rc ){.    case 
be10: 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c  SQLITE_ABORT_ROL
be20: 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a  LBACK: {.      z
be30: 45 72 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65  Err = "abort due
be40: 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20   to ROLLBACK";. 
be50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
be60: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
be70: 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30 78 66  .      rc &= 0xf
be80: 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57  f;.      if( ALW
be90: 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63  AYS(rc>=0) && rc
bea0: 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29  <ArraySize(aMsg)
beb0: 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20   && aMsg[rc]!=0 
bec0: 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20  ){.        zErr 
bed0: 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20  = aMsg[rc];.    
bee0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
bef0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
bf00: 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  urn zErr;.}../*.
bf10: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
bf20: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73  implements a bus
bf30: 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20  y callback that 
bf40: 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65 73  sleeps and tries
bf50: 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20  .** again until 
bf60: 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  a timeout value 
bf70: 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68 65  is reached.  The
bf80: 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69   timeout value i
bf90: 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20  s.** an integer 
bfa0: 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73  number of millis
bfb0: 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e  econds passed in
bfc0: 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a   as the first.**
bfd0: 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74   argument..*/.st
bfe0: 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44  atic int sqliteD
bff0: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
c000: 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20  ck(. void *ptr, 
c010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
c020: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
c030: 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75  tion */. int cou
c040: 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  nt              
c050: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74    /* Number of t
c060: 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20 62  imes table has b
c070: 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23  een busy */.){.#
c080: 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e  if SQLITE_OS_WIN
c090: 20 7c 7c 20 48 41 56 45 5f 55 53 4c 45 45 50 0a   || HAVE_USLEEP.
c0a0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
c0b0: 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20  8 delays[] =.   
c0c0: 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c    { 1, 2, 5, 10,
c0d0: 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c   15, 20, 25, 25,
c0e0: 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20    25,  50,  50, 
c0f0: 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  100 };.  static 
c100: 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b  const u8 totals[
c110: 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c  ] =.     { 0, 1,
c120: 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20   3,  8, 18, 33, 
c130: 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38  53, 78, 103, 128
c140: 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20  , 178, 228 };.# 
c150: 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72  define NDELAY Ar
c160: 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a  raySize(delays).
c170: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
c180: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a  (sqlite3 *)ptr;.
c190: 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20    int timeout = 
c1a0: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b  db->busyTimeout;
c1b0: 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72  .  int delay, pr
c1c0: 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ior;..  assert( 
c1d0: 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66  count>=0 );.  if
c1e0: 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59  ( count < NDELAY
c1f0: 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20   ){.    delay = 
c200: 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20  delays[count];. 
c210: 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c     prior = total
c220: 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73  s[count];.  }els
c230: 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64  e{.    delay = d
c240: 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b  elays[NDELAY-1];
c250: 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74  .    prior = tot
c260: 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20  als[NDELAY-1] + 
c270: 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44  delay*(count-(ND
c280: 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20  ELAY-1));.  }.  
c290: 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61  if( prior + dela
c2a0: 79 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  y > timeout ){. 
c2b0: 20 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f     delay = timeo
c2c0: 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20  ut - prior;.    
c2d0: 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72  if( delay<=0 ) r
c2e0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
c2f0: 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62  qlite3OsSleep(db
c300: 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30  ->pVfs, delay*10
c310: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
c320: 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33  .#else.  sqlite3
c330: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
c340: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d  *)ptr;.  int tim
c350: 65 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33  eout = ((sqlite3
c360: 20 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d   *)ptr)->busyTim
c370: 65 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75  eout;.  if( (cou
c380: 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d  nt+1)*1000 > tim
c390: 65 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75  eout ){.    retu
c3a0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
c3b0: 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70  te3OsSleep(db->p
c3c0: 56 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20  Vfs, 1000000);. 
c3d0: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
c3e0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  f.}../*.** Invok
c3f0: 65 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79  e the given busy
c400: 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20   handler..**.** 
c410: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
c420: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f  called when an o
c430: 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20  peration failed 
c440: 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20  with a lock..** 
c450: 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
c460: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
c470: 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65  , the lock is re
c480: 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a  tried.  If it.**
c490: 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20   returns 0, the 
c4a0: 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73  operation aborts
c4b0: 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f   with an SQLITE_
c4c0: 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69  BUSY error..*/.i
c4d0: 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  nt sqlite3Invoke
c4e0: 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79  BusyHandler(Busy
c4f0: 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69  Handler *p){.  i
c500: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56  nt rc;.  if( NEV
c510: 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78  ER(p==0) || p->x
c520: 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42  Func==0 || p->nB
c530: 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30  usy<0 ) return 0
c540: 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e  ;.  rc = p->xFun
c550: 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42  c(p->pArg, p->nB
c560: 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  usy);.  if( rc==
c570: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  0 ){.    p->nBus
c580: 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  y = -1;.  }else{
c590: 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b  .    p->nBusy++;
c5a0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c5b0: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ; .}../*.** This
c5c0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
c5d0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
c5e0: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
c5f0: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
c600: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
c610: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
c620: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
c630: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c640: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20  _busy_handler(. 
c650: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
c660: 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69  int (*xBusy)(voi
c670: 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  d*,int),.  void 
c680: 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20  *pArg.){.#ifdef 
c690: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
c6a0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
c6b0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
c6c0: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
c6d0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
c6e0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
c6f0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
c700: 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62  >mutex);.  db->b
c710: 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63  usyHandler.xFunc
c720: 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e   = xBusy;.  db->
c730: 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72 67  busyHandler.pArg
c740: 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62   = pArg;.  db->b
c750: 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79  usyHandler.nBusy
c760: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
c770: 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 73  Timeout = 0;.  s
c780: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
c790: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
c7a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c7b0: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
c7c0: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
c7d0: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a  SS_CALLBACK./*.*
c7e0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
c7f0: 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73 73  ets the progress
c800: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
c810: 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   Sqlite database
c820: 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e   to the.** given
c830: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
c840: 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65  on with the give
c850: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  n argument. The 
c860: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
c870: 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76  k will.** be inv
c880: 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20  oked every nOps 
c890: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64  opcodes..*/.void
c8a0: 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73   sqlite3_progres
c8b0: 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c  s_handler(.  sql
c8c0: 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74  ite3 *db, .  int
c8d0: 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78   nOps,.  int (*x
c8e0: 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29  Progress)(void*)
c8f0: 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  , .  void *pArg.
c900: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
c910: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
c920: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
c930: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
c940: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
c950: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
c960: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
c970: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
c980: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
c990: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
c9a0: 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20  ( nOps>0 ){.    
c9b0: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20  db->xProgress = 
c9c0: 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64  xProgress;.    d
c9d0: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
c9e0: 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70 73  = (unsigned)nOps
c9f0: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
ca00: 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  essArg = pArg;. 
ca10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
ca20: 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  xProgress = 0;. 
ca30: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
ca40: 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  Ops = 0;.    db-
ca50: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
ca60: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
ca70: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
ca80: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
ca90: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
caa0: 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20  outine installs 
cab0: 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68  a default busy h
cac0: 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74  andler that wait
cad0: 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65  s for the.** spe
cae0: 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66  cified number of
caf0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65   milliseconds be
cb00: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30  fore returning 0
cb10: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
cb20: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71  _busy_timeout(sq
cb30: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d  lite3 *db, int m
cb40: 73 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  s){.#ifdef SQLIT
cb50: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
cb60: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
cb70: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
cb80: 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
cb90: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
cba0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6d 73 3e  #endif.  if( ms>
cbb0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
cbc0: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
cbd0: 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42  , sqliteDefaultB
cbe0: 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  usyCallback, (vo
cbf0: 69 64 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d  id*)db);.    db-
cc00: 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d  >busyTimeout = m
cc10: 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
cc20: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
cc30: 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a  dler(db, 0, 0);.
cc40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
cc50: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
cc60: 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69   Cause any pendi
cc70: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ng operation to 
cc80: 73 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c  stop at its earl
cc90: 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79  iest opportunity
cca0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
ccb0: 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69  3_interrupt(sqli
ccc0: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
ccd0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
cce0: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
ccf0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
cd00: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
cd10: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
cd20: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
cd30: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
cd40: 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  .  db->u1.isInte
cd50: 72 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a  rrupted = 1;.}..
cd60: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
cd70: 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20  tion is exactly 
cd80: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
cd90: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
cda0: 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a  ion(), except.**
cdb0: 20 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69   that it is desi
cdc0: 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  gned to be calle
cdd0: 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f  d by internal co
cde0: 64 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e  de. The differen
cdf0: 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66  ce is.** that if
ce00: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
ce10: 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  s in sqlite3_cre
ce20: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
ce30: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  an error code.**
ce40: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
ce50: 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65   the mallocFaile
ce60: 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20  d flag cleared. 
ce70: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
ce80: 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c  reateFunc(.  sql
ce90: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
cea0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f  t char *zFunctio
ceb0: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
cec0: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
ced0: 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c  void *pUserData,
cee0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
cef0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
cf00: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
cf10: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
cf20: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
cf30: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
cf40: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
cf50: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
cf60: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
cf70: 74 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72  t*),.  FuncDestr
cf80: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
cf90: 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  or.){.  FuncDef 
cfa0: 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  *p;.  int nName;
cfb0: 0a 20 20 69 6e 74 20 65 78 74 72 61 46 6c 61 67  .  int extraFlag
cfc0: 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  s;..  assert( sq
cfd0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
cfe0: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
cff0: 20 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61   if( zFunctionNa
d000: 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28  me==0 ||.      (
d010: 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c  xFunc && (xFinal
d020: 20 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c 20 0a   || xStep)) || .
d030: 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26 26        (!xFunc &&
d040: 20 28 78 46 69 6e 61 6c 20 26 26 20 21 78 53 74   (xFinal && !xSt
d050: 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 21  ep)) ||.      (!
d060: 78 46 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61  xFunc && (!xFina
d070: 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a  l && xStep)) ||.
d080: 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c        (nArg<-1 |
d090: 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41  | nArg>SQLITE_MA
d0a0: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20  X_FUNCTION_ARG) 
d0b0: 7c 7c 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e  ||.      (255<(n
d0c0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
d0d0: 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f  rlen30( zFunctio
d0e0: 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20  nName))) ){.    
d0f0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
d100: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  SUSE_BKPT;.  }..
d110: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
d120: 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d  _FUNC_CONSTANT==
d130: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
d140: 53 54 49 43 20 29 3b 0a 20 20 65 78 74 72 61 46  STIC );.  extraF
d150: 6c 61 67 73 20 3d 20 65 6e 63 20 26 20 20 53 51  lags = enc &  SQ
d160: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
d170: 49 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53 51  IC;.  enc &= (SQ
d180: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
d190: 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20  K|SQLITE_ANY);. 
d1a0: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
d1b0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a  _OMIT_UTF16.  /*
d1c0: 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   If SQLITE_UTF16
d1d0: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
d1e0: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79   the encoding ty
d1f0: 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68  pe, transform th
d200: 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f  is.  ** to one o
d210: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  f SQLITE_UTF16LE
d220: 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36   or SQLITE_UTF16
d230: 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  BE using the.  *
d240: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
d250: 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49  TIVE macro. SQLI
d260: 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20  TE_UTF16 is not 
d270: 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  used internally.
d280: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51  .  **.  ** If SQ
d290: 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63  LITE_ANY is spec
d2a0: 69 66 69 65 64 2c 20 61 64 64 20 74 68 72 65 65  ified, add three
d2b0: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
d2c0: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74   function.  ** t
d2d0: 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  o the hash table
d2e0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63  ..  */.  if( enc
d2f0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29  ==SQLITE_UTF16 )
d300: 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49  {.    enc = SQLI
d310: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
d320: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d    }else if( enc=
d330: 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20  =SQLITE_ANY ){. 
d340: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72     int rc;.    r
d350: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
d360: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74  eFunc(db, zFunct
d370: 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  ionName, nArg, S
d380: 51 4c 49 54 45 5f 55 54 46 38 7c 65 78 74 72 61  QLITE_UTF8|extra
d390: 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
d3a0: 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63  pUserData, xFunc
d3b0: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
d3c0: 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20   pDestructor);. 
d3d0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d3e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
d3f0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
d400: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
d410: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
d420: 4c 49 54 45 5f 55 54 46 31 36 4c 45 7c 65 78 74  LITE_UTF16LE|ext
d430: 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  raFlags,.       
d440: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46     pUserData, xF
d450: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
d460: 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  al, pDestructor)
d470: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
d480: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
d490: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
d4a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20  ;.    }.    enc 
d4b0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  = SQLITE_UTF16BE
d4c0: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e  ;.  }.#else.  en
d4d0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
d4e0: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20  .#endif.  .  /* 
d4f0: 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73  Check if an exis
d500: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73  ting function is
d510: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
d520: 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66  n or deleted. If
d530: 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68   so,.  ** and th
d540: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
d550: 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  Ms, then return 
d560: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20  SQLITE_BUSY. If 
d570: 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  a function.  ** 
d580: 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64  is being overrid
d590: 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20  den/deleted but 
d5a0: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74  there are no act
d5b0: 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74  ive VMs, allow t
d5c0: 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  he.  ** operatio
d5d0: 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75  n to continue bu
d5e0: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  t invalidate all
d5f0: 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61   precompiled sta
d600: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
d610: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
d620: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
d630: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
d640: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
d650: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
d660: 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  (p->funcFlags & 
d670: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
d680: 41 53 4b 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e  ASK)==enc && p->
d690: 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20  nArg==nArg ){.  
d6a0: 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41    if( db->nVdbeA
d6b0: 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73  ctive ){.      s
d6c0: 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
d6d0: 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  sg(db, SQLITE_BU
d6e0: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
d6f0: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
d700: 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74  odify user-funct
d710: 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76  ion due to activ
d720: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
d730: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
d740: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
d750: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
d760: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
d770: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
d780: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
d790: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
d7a0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
d7b0: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
d7c0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
d7d0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
d7e0: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
d7f0: 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20   1);.  assert(p 
d800: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
d810: 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29  led);.  if( !p )
d820: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
d830: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
d840: 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72    /* If an older
d850: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
d860: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20  function with a 
d870: 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72  configured destr
d880: 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65  uctor is.  ** be
d890: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76  ing replaced inv
d8a0: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
d8b0: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  or function here
d8c0: 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44  . */.  functionD
d8d0: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a  estroy(db, p);..
d8e0: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
d8f0: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
d900: 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ctor->nRef++;.  
d910: 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74  }.  p->pDestruct
d920: 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72  or = pDestructor
d930: 3b 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73  ;.  p->funcFlags
d940: 20 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73   = (p->funcFlags
d950: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
d960: 4e 43 4d 41 53 4b 29 20 7c 20 65 78 74 72 61 46  NCMASK) | extraF
d970: 6c 61 67 73 3b 0a 20 20 74 65 73 74 63 61 73 65  lags;.  testcase
d980: 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  ( p->funcFlags &
d990: 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
d9a0: 49 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78 46  ISTIC );.  p->xF
d9b0: 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70  unc = xFunc;.  p
d9c0: 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b  ->xStep = xStep;
d9d0: 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20  .  p->xFinalize 
d9e0: 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70  = xFinal;.  p->p
d9f0: 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72  UserData = pUser
da00: 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20  Data;.  p->nArg 
da10: 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72  = (u16)nArg;.  r
da20: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
da30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
da40: 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74 69   new user functi
da50: 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
da60: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
da70: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
da80: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
da90: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
daa0: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
dab0: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
dac0: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
dad0: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
dae0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
daf0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
db00: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
db10: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
db20: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
db30: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
db40: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
db50: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
db60: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
db70: 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20  n_v2(db, zFunc, 
db80: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46  nArg, enc, p, xF
db90: 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20  unc, xStep,.    
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dbc0: 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69  xFinal, 0);.}..i
dbd0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
dbe0: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20  e_function_v2(. 
dbf0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
dc00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
dc10: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
dc20: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
dc30: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
dc40: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
dc50: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
dc60: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
dc70: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
dc80: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
dc90: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
dca0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
dcb0: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
dcc0: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
dcd0: 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64  (*xDestroy)(void
dce0: 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   *).){.  int rc 
dcf0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
dd00: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
dd10: 20 2a 70 41 72 67 20 3d 20 30 3b 0a 0a 23 69 66   *pArg = 0;..#if
dd20: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
dd30: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
dd40: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
dd50: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
dd60: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
dd70: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
dd80: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
dd90: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
dda0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
ddb0: 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20   xDestroy ){.   
ddc0: 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73   pArg = (FuncDes
ddd0: 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65  tructor *)sqlite
dde0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
ddf0: 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73  , sizeof(FuncDes
de00: 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69  tructor));.    i
de10: 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20  f( !pArg ){.    
de20: 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20    xDestroy(p);. 
de30: 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20       goto out;. 
de40: 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78     }.    pArg->x
de50: 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72  Destroy = xDestr
de60: 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55  oy;.    pArg->pU
de70: 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d  serData = p;.  }
de80: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43  .  rc = sqlite3C
de90: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
dea0: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
deb0: 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  p, xFunc, xStep,
dec0: 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a   xFinal, pArg);.
ded0: 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
dee0: 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  rg->nRef==0 ){. 
def0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
df00: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
df10: 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  xDestroy(p);.   
df20: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
df30: 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20  b, pArg);.  }.. 
df40: 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69  out:.  rc = sqli
df50: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
df60: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
df70: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
df80: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
df90: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
dfa0: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
dfb0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
dfc0: 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20  te_function16(. 
dfd0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
dfe0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e  const void *zFun
dff0: 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  ctionName,.  int
e000: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65   nArg,.  int eTe
e010: 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70  xtRep,.  void *p
e020: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63  ,.  void (*xFunc
e030: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
e040: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
e050: 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  alue**),.  void 
e060: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
e070: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
e080: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a  lite3_value**),.
e090: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
e0a0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
e0b0: 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
e0c0: 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a    char *zFunc8;.
e0d0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
e0e0: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
e0f0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
e100: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
e110: 7c 7c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  || zFunctionName
e120: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
e130: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
e140: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
e150: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
e160: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
e170: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
e180: 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63  ailed );.  zFunc
e190: 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
e1a0: 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  to8(db, zFunctio
e1b0: 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  nName, -1, SQLIT
e1c0: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
e1d0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
e1e0: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
e1f0: 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74  nc8, nArg, eText
e200: 52 65 70 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78  Rep, p, xFunc, x
e210: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 30 29 3b  Step, xFinal,0);
e220: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
e230: 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20  (db, zFunc8);.  
e240: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
e250: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
e260: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
e270: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
e280: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
e290: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ndif.../*.** Dec
e2a0: 6c 61 72 65 20 74 68 61 74 20 61 20 66 75 6e 63  lare that a func
e2b0: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76  tion has been ov
e2c0: 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69  erloaded by a vi
e2d0: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
e2e0: 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  ** If the functi
e2f0: 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  on already exist
e300: 73 20 61 73 20 61 20 72 65 67 75 6c 61 72 20 67  s as a regular g
e310: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20  lobal function, 
e320: 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
e330: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
e340: 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f    If the functio
e350: 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
e360: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a  , then create.**
e370: 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20   a new one that 
e380: 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61 20  always throws a 
e390: 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20  run-time error. 
e3a0: 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72   .**.** When vir
e3b0: 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65  tual tables inte
e3c0: 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  nd to provide an
e3d0: 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63   overloaded func
e3e0: 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68  tion, they.** sh
e3f0: 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72  ould call this r
e400: 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73  outine to make s
e410: 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66  ure the global f
e420: 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a  unction exists..
e430: 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ** A global func
e440: 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20  tion must exist 
e450: 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d  in order for nam
e460: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20  e resolution to 
e470: 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79  work.** properly
e480: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e490: 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
e4a0: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  on(.  sqlite3 *d
e4b0: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
e4c0: 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  *zName,.  int nA
e4d0: 72 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d  rg.){.  int nNam
e4e0: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
e4f0: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e  n30(zName);.  in
e500: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
e510: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
e520: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
e530: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
e540: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
e550: 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c  ) || zName==0 ||
e560: 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20   nArg<-2 ){.    
e570: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
e580: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
e590: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
e5a0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
e5b0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  mutex);.  if( sq
e5c0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
e5d0: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  n(db, zName, nNa
e5e0: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
e5f0: 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a  _UTF8, 0)==0 ){.
e600: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
e610: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
e620: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
e630: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
e640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e650: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e      0, sqlite3In
e660: 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  validFunction, 0
e670: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
e680: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
e690: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
e6a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
e6b0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
e6c0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
e6d0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e6e0: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
e6f0: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
e700: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
e710: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
e720: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
e730: 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
e740: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
e750: 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
e760: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
e770: 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
e780: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
e790: 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
e7a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
e7b0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
e7c0: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
e7d0: 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
e7e0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
e7f0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
e800: 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
e810: 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63  db, void (*xTrac
e820: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
e830: 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
e840: 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
e850: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
e860: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
e870: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
e880: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
e890: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
e8a0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
e8b0: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
e8c0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
e8d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
e8e0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
e8f0: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63  pOld = db->pTrac
e900: 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61  eArg;.  db->xTra
e910: 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64  ce = xTrace;.  d
e920: 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70  b->pTraceArg = p
e930: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
e940: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
e950: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
e960: 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65  pOld;.}./*.** Re
e970: 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65  gister a profile
e980: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
e990: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
e9a0: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
e9b0: 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  red .** profile 
e9c0: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75  function is retu
e9d0: 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
e9e0: 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e  NULL profile fun
e9f0: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
ea00: 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73   no profiling is
ea10: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
ea20: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c  n-NULL.** profil
ea30: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
ea40: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
ea50: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
ea60: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
ea70: 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74  f.** each SQL st
ea80: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
ea90: 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  run..*/.void *sq
eaa0: 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20  lite3_profile(. 
eab0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
eac0: 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29  void (*xProfile)
ead0: 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
eae0: 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  r*,sqlite_uint64
eaf0: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
eb00: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
eb10: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
eb20: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
eb30: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
eb40: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
eb50: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
eb60: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
eb70: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
eb80: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
eb90: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
eba0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
ebb0: 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69  Old = db->pProfi
ebc0: 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72  leArg;.  db->xPr
ebd0: 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65  ofile = xProfile
ebe0: 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  ;.  db->pProfile
ebf0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
ec00: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
ec10: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
ec20: 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23  return pOld;.}.#
ec30: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
ec40: 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  OMIT_TRACE */../
ec50: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
ec60: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
ec70: 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72  nvoked when a tr
ec80: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
ec90: 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76  s..** If the inv
eca0: 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65  oked function re
ecb0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
ecc0: 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20  then the commit 
ecd0: 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c  becomes a.** rol
ece0: 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  lback..*/.void *
ecf0: 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68  sqlite3_commit_h
ed00: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
ed10: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
ed20: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
ed30: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
ed40: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  base */.  int (*
ed50: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
ed60: 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  ),  /* Function 
ed70: 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63  to invoke on eac
ed80: 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f  h commit */.  vo
ed90: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
eda0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
edb0: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
edc0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
edd0: 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20   *pOld;..#ifdef 
ede0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
edf0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
ee00: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
ee10: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
ee20: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
ee30: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
ee40: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
ee50: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
ee60: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
ee70: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
ee80: 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64  >pCommitArg;.  d
ee90: 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
eea0: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
eeb0: 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67    db->pCommitArg
eec0: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
eed0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
eee0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
eef0: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a  urn pOld;.}../*.
ef00: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
ef10: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
ef20: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
ef30: 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c   row is updated,
ef40: 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20  .** inserted or 
ef50: 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68  deleted using th
ef60: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
ef70: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
ef80: 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f  *sqlite3_update_
ef90: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
efa0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
efb0: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
efc0: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
efd0: 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20  abase */.  void 
efe0: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
eff0: 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73  d*,int,char cons
f000: 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  t *,char const *
f010: 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a  ,sqlite_int64),.
f020: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
f030: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f040: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
f050: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
f060: 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66  void *pRet;..#if
f070: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
f080: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
f090: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
f0a0: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
f0b0: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
f0c0: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
f0d0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
f0e0: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
f0f0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
f100: 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
f110: 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b   db->pUpdateArg;
f120: 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61  .  db->xUpdateCa
f130: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
f140: 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74  ck;.  db->pUpdat
f150: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
f160: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f170: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f180: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
f190: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
f1a0: 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
f1b0: 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
f1c0: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
f1d0: 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   is rolled.** ba
f1e0: 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ck by this datab
f1f0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
f200: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
f210: 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a  _rollback_hook(.
f220: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
f230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
f240: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
f250: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
f260: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
f270: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f  lback)(void*), /
f280: 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
f290: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
f2a0: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
f2b0: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
f2c0: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
f2d0: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
f2e0: 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
f2f0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
f300: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
f310: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
f320: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
f330: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
f340: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
f350: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
f360: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f370: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
f380: 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c   pRet = db->pRol
f390: 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e  lbackArg;.  db->
f3a0: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
f3b0: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
f3c0: 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72   db->pRollbackAr
f3d0: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
f3e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f3f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f400: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
f410: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
f420: 4c 45 5f 50 52 45 55 50 44 41 54 45 5f 48 4f 4f  LE_PREUPDATE_HOO
f430: 4b 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  K./*.** Register
f440: 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62   a callback to b
f450: 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74  e invoked each t
f460: 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70 64  ime a row is upd
f470: 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65  ated,.** inserte
f480: 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73 69  d or deleted usi
f490: 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73 65  ng this database
f4a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
f4b0: 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72  void *sqlite3_pr
f4c0: 65 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20  eupdate_hook(.  
f4d0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
f4e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74            /* Att
f4f0: 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20  ach the hook to 
f500: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f  this database */
f510: 0a 20 20 76 6f 69 64 28 2a 78 43 61 6c 6c 62 61  .  void(*xCallba
f520: 63 6b 29 28 20 20 20 20 20 20 20 20 20 2f 2a 20  ck)(         /* 
f530: 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  Callback functio
f540: 6e 20 2a 2f 0a 20 20 20 20 76 6f 69 64 2a 2c 73  n */.    void*,s
f550: 71 6c 69 74 65 33 2a 2c 69 6e 74 2c 63 68 61 72  qlite3*,int,char
f560: 20 63 6f 6e 73 74 2a 2c 63 68 61 72 20 63 6f 6e   const*,char con
f570: 73 74 2a 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36  st*,sqlite3_int6
f580: 34 2c 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29  4,sqlite3_int64)
f590: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
f5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f5b0: 20 46 69 72 73 74 20 63 61 6c 6c 62 61 63 6b 20   First callback 
f5c0: 61 72 67 75 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  argument */.){. 
f5d0: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73   void *pRet;.  s
f5e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
f5f0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
f600: 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 50 72 65   pRet = db->pPre
f610: 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d  UpdateArg;.  db-
f620: 3e 78 50 72 65 55 70 64 61 74 65 43 61 6c 6c 62  >xPreUpdateCallb
f630: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
f640: 0a 20 20 64 62 2d 3e 70 50 72 65 55 70 64 61 74  .  db->pPreUpdat
f650: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
f660: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
f670: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
f680: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
f690: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f6a0: 5f 45 4e 41 42 4c 45 5f 50 52 45 55 50 44 41 54  _ENABLE_PREUPDAT
f6b0: 45 5f 48 4f 4f 4b 20 2a 2f 0a 0a 23 69 66 6e 64  E_HOOK */..#ifnd
f6c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
f6d0: 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71 6c  AL./*.** The sql
f6e0: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
f6f0: 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65  callback registe
f700: 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 77  red by sqlite3_w
f710: 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e  al_autocheckpoin
f720: 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73  t()..** Invoke s
f730: 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b  qlite3_wal_check
f740: 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75 6d  point if the num
f750: 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69 6e  ber of frames in
f760: 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a   the log file.**
f770: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
f780: 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72 67   sqlite3.pWalArg
f790: 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74 65   cast to an inte
f7a0: 67 65 72 20 28 74 68 65 20 76 61 6c 75 65 20 63  ger (the value c
f7b0: 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a 20  onfigured by.** 
f7c0: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
f7d0: 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73  nt())..*/ .int s
f7e0: 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74  qlite3WalDefault
f7f0: 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70 43  Hook(.  void *pC
f800: 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20 2f  lientData,     /
f810: 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20 20  * Argument */.  
f820: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
f830: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
f840: 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  tion */.  const 
f850: 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20  char *zDb,      
f860: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f 0a   /* Database */.
f870: 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20 20    int nFrame    
f880: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
f890: 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20   of WAL */.){.  
f8a0: 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c 49  if( nFrame>=SQLI
f8b0: 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70 43  TE_PTR_TO_INT(pC
f8c0: 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20 20  lientData) ){.  
f8d0: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
f8e0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
f8f0: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68    sqlite3_wal_ch
f900: 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44 62  eckpoint(db, zDb
f910: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e  );.    sqlite3En
f920: 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
f930: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
f940: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
f950: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
f960: 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43  _WAL */../*.** C
f970: 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c 69  onfigure an sqli
f980: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63  te3_wal_hook() c
f990: 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f 6d  allback to autom
f9a0: 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70 6f  atically checkpo
f9b0: 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61 73  int.** a databas
f9c0: 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74 69  e after committi
f9d0: 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
f9e0: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e 46   if there are nF
f9f0: 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20  rame or.** more 
fa00: 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f  frames in the lo
fa10: 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67 20  g file. Passing 
fa20: 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74 69  zero or a negati
fa30: 76 65 20 76 61 6c 75 65 20 61 73 20 74 68 65 0a  ve value as the.
fa40: 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d 65  ** nFrame parame
fa50: 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75 74  ter disables aut
fa60: 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e  omatic checkpoin
fa70: 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a  ts entirely..**.
fa80: 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20  ** The callback 
fa90: 72 65 67 69 73 74 65 72 65 64 20 62 79 20 74 68  registered by th
faa0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70 6c  is function repl
fab0: 61 63 65 73 20 61 6e 79 20 65 78 69 73 74 69 6e  aces any existin
fac0: 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65  g callback.** re
fad0: 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20 73  gistered using s
fae0: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
faf0: 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65 67  ). Likewise, reg
fb00: 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c 62  istering a callb
fb10: 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71 6c  ack.** using sql
fb20: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
fb30: 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75 74  disables the aut
fb40: 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69 6e  omatic checkpoin
fb50: 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20 63  t mechanism.** c
fb60: 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68 69  onfigured by thi
fb70: 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  s function..*/.i
fb80: 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  nt sqlite3_wal_a
fb90: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71  utocheckpoint(sq
fba0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6e  lite3 *db, int n
fbb0: 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20 53  Frame){.#ifdef S
fbc0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
fbd0: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
fbe0: 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f  R(db);.  UNUSED_
fbf0: 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d 65  PARAMETER(nFrame
fc00: 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64 65 66 20  );.#else.#ifdef 
fc10: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
fc20: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
fc30: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
fc40: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
fc50: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
fc60: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66  KPT;.#endif.  if
fc70: 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20  ( nFrame>0 ){.  
fc80: 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f    sqlite3_wal_ho
fc90: 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61  ok(db, sqlite3Wa
fca0: 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51  lDefaultHook, SQ
fcb0: 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
fcc0: 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73  nFrame));.  }els
fcd0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  e{.    sqlite3_w
fce0: 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30  al_hook(db, 0, 0
fcf0: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  );.  }.#endif.  
fd00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
fd10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
fd20: 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74  ter a callback t
fd30: 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63  o be invoked eac
fd40: 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63  h time a transac
fd50: 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a  tion is written.
fd60: 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74  ** into the writ
fd70: 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74  e-ahead-log by t
fd80: 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e  his database con
fd90: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64  nection..*/.void
fda0: 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f   *sqlite3_wal_ho
fdb0: 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ok(.  sqlite3 *d
fdc0: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
fdd0: 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20        /* Attach 
fde0: 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73  the hook to this
fdf0: 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20   db handle */.  
fe00: 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28  int(*xCallback)(
fe10: 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a  void *, sqlite3*
fe20: 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69  , const char*, i
fe30: 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  nt),.  void *pAr
fe40: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
fe50: 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20         /* First 
fe60: 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20  argument passed 
fe70: 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a  to xCallback() *
fe80: 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  /.){.#ifndef SQL
fe90: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76  ITE_OMIT_WAL.  v
fea0: 6f 69 64 20 2a 70 52 65 74 3b 0a 23 69 66 64 65  oid *pRet;.#ifde
feb0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
fec0: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
fed0: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
fee0: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
fef0: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
ff00: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
ff10: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
ff20: 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
ff30: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
ff40: 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
ff50: 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62  b->pWalArg;.  db
ff60: 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d  ->xWalCallback =
ff70: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
ff80: 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67  ->pWalArg = pArg
ff90: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
ffa0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
ffb0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
ffc0: 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  t;.#else.  retur
ffd0: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 0;.#endif.}../
ffe0: 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
fff0: 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f  database zDb..*/
10000 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
10010 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a  _checkpoint_v2(.
10020 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
10030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10040 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
10050 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndle */.  const 
10060 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20  char *zDb,      
10070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
10080 65 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61  e of attached da
10090 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29  tabase (or NULL)
100a0 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c   */.  int eMode,
100b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100c0 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
100d0 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c  CHECKPOINT_* val
100e0 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c  ue */.  int *pnL
100f0 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  og,             
10100 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
10110 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20  Size of WAL log 
10120 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69  in frames */.  i
10130 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20  nt *pnCkpt      
10140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10150 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d  * OUT: Total num
10160 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68  ber of frames ch
10170 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b  eckpointed */.){
10180 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
10190 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e  MIT_WAL.  return
101a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73   SQLITE_OK;.#els
101b0 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  e.  int rc;     
101c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101d0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
101e0 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  de */.  int iDb 
101f0 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  = SQLITE_MAX_ATT
10200 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74  ACHED;  /* sqlit
10210 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f  e3.aDb[] index o
10220 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69  f db to checkpoi
10230 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51  nt */..#ifdef SQ
10240 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
10250 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
10260 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
10270 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53  k(db) ) return S
10280 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
10290 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  T;.#endif..  /* 
102a0 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6f  Initialize the o
102b0 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 20  utput variables 
102c0 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61 6e  to -1 in case an
102d0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20 2a   error occurs. *
102e0 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29 20  /.  if( pnLog ) 
102f0 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20 69  *pnLog = -1;.  i
10300 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e 43  f( pnCkpt ) *pnC
10310 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73 73  kpt = -1;..  ass
10320 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43  ert( SQLITE_CHEC
10330 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 3d 3d  KPOINT_PASSIVE==
10340 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  0 );.  assert( S
10350 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
10360 5f 46 55 4c 4c 3d 3d 31 20 29 3b 0a 20 20 61 73  _FULL==1 );.  as
10370 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
10380 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 3d  CKPOINT_RESTART=
10390 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
103a0 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
103b0 54 5f 54 52 55 4e 43 41 54 45 3d 3d 33 20 29 3b  T_TRUNCATE==3 );
103c0 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c  .  if( eMode<SQL
103d0 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
103e0 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e  ASSIVE || eMode>
103f0 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
10400 54 5f 54 52 55 4e 43 41 54 45 20 29 7b 0a 20 20  T_TRUNCATE ){.  
10410 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
10420 3a 20 52 2d 30 33 39 39 36 2d 31 32 30 38 38 20  : R-03996-12088 
10430 54 68 65 20 4d 20 70 61 72 61 6d 65 74 65 72 20  The M parameter 
10440 6d 75 73 74 20 62 65 20 61 20 76 61 6c 69 64 20  must be a valid 
10450 63 68 65 63 6b 70 6f 69 6e 74 0a 20 20 20 20 2a  checkpoint.    *
10460 2a 20 6d 6f 64 65 3a 20 2a 2f 0a 20 20 20 20 72  * mode: */.    r
10470 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
10480 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69  USE;.  }..  sqli
10490 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
104a0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
104b0 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20  ( zDb && zDb[0] 
104c0 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c  ){.    iDb = sql
104d0 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64  ite3FindDbName(d
104e0 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69  b, zDb);.  }.  i
104f0 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20  f( iDb<0 ){.    
10500 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
10510 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  R;.    sqlite3Er
10520 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53  rorWithMsg(db, S
10530 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e  QLITE_ERROR, "un
10540 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20  known database: 
10550 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c  %s", zDb);.  }el
10560 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
10570 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64  ite3Checkpoint(d
10580 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70  b, iDb, eMode, p
10590 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20  nLog, pnCkpt);. 
105a0 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
105b0 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72  db, rc);.  }.  r
105c0 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
105d0 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
105e0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
105f0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
10600 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
10610 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  f.}.../*.** Chec
10620 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
10630 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e  zDb. If zDb is N
10640 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62  ULL, or if the b
10650 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73  uffer zDb points
10660 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20  .** to contains 
10670 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74  a zero-length st
10680 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68  ring, all attach
10690 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ed databases are
106a0 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65   .** checkpointe
106b0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
106c0 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
106d0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
106e0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
106f0 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
10700 3a 20 52 2d 34 31 36 31 33 2d 32 30 35 35 33 20  : R-41613-20553 
10710 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  The sqlite3_wal_
10720 63 68 65 63 6b 70 6f 69 6e 74 28 44 2c 58 29 20  checkpoint(D,X) 
10730 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
10740 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 77 61  .  ** sqlite3_wa
10750 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
10760 44 2c 58 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b  D,X,SQLITE_CHECK
10770 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c  POINT_PASSIVE,0,
10780 30 29 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  0). */.  return 
10790 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
107a0 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 7a 44 62  kpoint_v2(db,zDb
107b0 2c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  ,SQLITE_CHECKPOI
107c0 4e 54 5f 50 41 53 53 49 56 45 2c 30 2c 30 29 3b  NT_PASSIVE,0,0);
107d0 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
107e0 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
107f0 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69  * Run a checkpoi
10800 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69  nt on database i
10810 44 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f  Db. This is a no
10820 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73 65 20  -op if database 
10830 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75  iDb is.** not cu
10840 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20  rrently open in 
10850 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  WAL mode..**.** 
10860 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
10870 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20   is open on the 
10880 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20 63  database being c
10890 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69  heckpointed, thi
108a0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  s .** function r
108b0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f  eturns SQLITE_LO
108c0 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b  CKED and a check
108d0 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74  point is not att
108e0 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61  empted. If .** a
108f0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
10900 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65  hile running the
10910 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20   checkpoint, an 
10920 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
10930 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65  e is .** returne
10940 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49  d (i.e. SQLITE_I
10950 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65  OERR). Otherwise
10960 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  , SQLITE_OK..**.
10970 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20  ** The mutex on 
10980 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
10990 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c  db should be hel
109a0 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e  d by the caller.
109b0 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73   The mutex.** as
109c0 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
109d0 65 20 73 70 65 63 69 66 69 63 20 62 2d 74 72 65  e specific b-tre
109e0 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69  e being checkpoi
109f0 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79  nted is taken by
10a00 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f  .** this functio
10a10 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68 65 63  n while the chec
10a20 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e  kpoint is runnin
10a30 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20  g..**.** If iDb 
10a40 69 73 20 70 61 73 73 65 64 20 53 51 4c 49 54 45  is passed SQLITE
10a50 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74  _MAX_ATTACHED, t
10a60 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64  hen all attached
10a70 20 64 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a   databases are.*
10a80 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20  * checkpointed. 
10a90 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65  If an error is e
10aa0 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73  ncountered it is
10ab0 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69   returned immedi
10ac0 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74  ately -.** no at
10ad0 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f  tempt is made to
10ae0 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20   checkpoint any 
10af0 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61  remaining databa
10b00 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d  ses..**.** Param
10b10 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e  eter eMode is on
10b20 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43  e of SQLITE_CHEC
10b30 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20  KPOINT_PASSIVE, 
10b40 46 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 2e  FULL or RESTART.
10b50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
10b60 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
10b70 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20  3 *db, int iDb, 
10b80 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a  int eMode, int *
10b90 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b  pnLog, int *pnCk
10ba0 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pt){.  int rc = 
10bb0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
10bc0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10bd0 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
10be0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10bf0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
10c00 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74 68  ed to iterate th
10c10 72 6f 75 67 68 20 61 74 74 61 63 68 65 64 20 64  rough attached d
10c20 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73  bs */.  int bBus
10c30 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  y = 0;          
10c40 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
10c50 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68  if SQLITE_BUSY h
10c60 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65  as been encounte
10c70 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  red */..  assert
10c80 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10c90 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
10ca0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e  );.  assert( !pn
10cb0 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d  Log || *pnLog==-
10cc0 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  1 );.  assert( !
10cd0 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70  pnCkpt || *pnCkp
10ce0 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28  t==-1 );..  for(
10cf0 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26  i=0; i<db->nDb &
10d00 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
10d10 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69   i++){.    if( i
10d20 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51  ==iDb || iDb==SQ
10d30 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
10d40 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  D ){.      rc = 
10d50 73 71 6c 69 74 65 33 42 74 72 65 65 43 68 65 63  sqlite3BtreeChec
10d60 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69  kpoint(db->aDb[i
10d70 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e  ].pBt, eMode, pn
10d80 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20  Log, pnCkpt);.  
10d90 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20      pnLog = 0;. 
10da0 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b       pnCkpt = 0;
10db0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
10dc0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
10dd0 20 20 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b        bBusy = 1;
10de0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
10df0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d  LITE_OK;.      }
10e00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
10e10 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45  turn (rc==SQLITE
10e20 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20  _OK && bBusy) ? 
10e30 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63  SQLITE_BUSY : rc
10e40 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
10e50 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
10e60 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
10e70 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72  ction returns tr
10e80 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72  ue if main-memor
10e90 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  y should be used
10ea0 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61   instead of.** a
10eb0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
10ec0 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61  for transient pa
10ed0 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74  ger files and st
10ee0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
10ef0 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72  ..** The value r
10f00 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20  eturned depends 
10f10 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  on the value of 
10f20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28  db->temp_store (
10f30 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d  runtime.** param
10f40 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f  eter) and the co
10f50 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65  mpile time value
10f60 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f   of SQLITE_TEMP_
10f70 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f  STORE. The.** fo
10f80 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65  llowing table de
10f90 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c 61  scribes the rela
10fa0 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e  tionship between
10fb0 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65   these two value
10fc0 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75  s.** and this fu
10fd0 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76  nctions return v
10fe0 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51  alue..**.**   SQ
10ff0 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20  LITE_TEMP_STORE 
11000 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f      db->temp_sto
11010 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20  re     Location 
11020 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  of temporary dat
11030 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  abase.**   -----
11040 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
11050 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20   -------------- 
11060 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      ------------
11070 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11080 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20  --.**   0       
11090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
110a0 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
110b0 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
110c0 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
110d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110e0 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
110f0 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
11100 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20  eturn 0).**   1 
11110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11120 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20      2           
11130 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
11140 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20   (return 1).**  
11150 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
11160 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20         0        
11170 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
11180 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
11190 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
111a0 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20 20            1     
111b0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
111c0 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
111d0 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20 20               2  
111f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11200 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
11210 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 1).**   2     
11220 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11230 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
11240 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
11250 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20  turn 1).**   3  
11260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11270 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20 20     any          
11280 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
11290 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e  (return 1).*/.in
112a0 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d  t sqlite3TempInM
112b0 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69  emory(const sqli
112c0 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51  te3 *db){.#if SQ
112d0 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
112e0 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =1.  return ( db
112f0 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20  ->temp_store==2 
11300 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
11310 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
11320 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62  =2.  return ( db
11330 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20  ->temp_store!=1 
11340 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  );.#endif.#if SQ
11350 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d  LITE_TEMP_STORE=
11360 3d 33 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23  =3.  return 1;.#
11370 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
11380 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c  _TEMP_STORE<1 ||
11390 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
113a0 52 45 3e 33 0a 20 20 72 65 74 75 72 6e 20 30 3b  RE>3.  return 0;
113b0 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
113c0 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e   Return UTF-8 en
113d0 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61  coded English la
113e0 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69  nguage explanati
113f0 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72  on of the most r
11400 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a  ecent.** error..
11410 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
11420 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71  qlite3_errmsg(sq
11430 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f  lite3 *db){.  co
11440 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69  nst char *z;.  i
11450 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
11460 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
11470 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  tr(SQLITE_NOMEM)
11480 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
11490 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
114a0 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
114b0 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
114c0 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d  3ErrStr(SQLITE_M
114d0 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d  ISUSE_BKPT);.  }
114e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
114f0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
11500 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
11510 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
11520 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53   z = sqlite3ErrS
11530 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  tr(SQLITE_NOMEM)
11540 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
11550 65 73 74 63 61 73 65 28 20 64 62 2d 3e 70 45 72  estcase( db->pEr
11560 72 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20  r==0 );.    z = 
11570 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76  (char*)sqlite3_v
11580 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45  alue_text(db->pE
11590 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  rr);.    assert(
115a0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
115b0 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d  ed );.    if( z=
115c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20  =0 ){.      z = 
115d0 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62  sqlite3ErrStr(db
115e0 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20  ->errCode);.    
115f0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
11600 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
11610 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
11620 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53   z;.}..#ifndef S
11630 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
11640 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
11650 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67  F-16 encoded Eng
11660 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78  lish language ex
11670 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65  planation of the
11680 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20   most recent.** 
11690 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  error..*/.const 
116a0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72  void *sqlite3_er
116b0 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a  rmsg16(sqlite3 *
116c0 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  db){.  static co
116d0 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d  nst u16 outOfMem
116e0 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20  [] = {.    'o', 
116f0 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27  'u', 't', ' ', '
11700 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d  o', 'f', ' ', 'm
11710 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27  ', 'e', 'm', 'o'
11720 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20  , 'r', 'y', 0.  
11730 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
11740 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d  t u16 misuse[] =
11750 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27 2c   {.    'l', 'i',
11760 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c 20   'b', 'r', 'a', 
11770 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a  'r', 'y', ' ', .
11780 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27 75      'r', 'o', 'u
11790 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e 27  ', 't', 'i', 'n'
117a0 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'e', ' ', .   
117b0 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20   'c', 'a', 'l', 
117c0 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20 27  'l', 'e', 'd', '
117d0 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 75   ', .    'o', 'u
117e0 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20 20  ', 't', ' ', .  
117f0 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c    'o', 'f', ' ',
11800 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c 20   .    's', 'e', 
11810 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20 27  'q', 'u', 'e', '
11820 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30 0a  n', 'c', 'e', 0.
11830 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f    };..  const vo
11840 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62  id *z;.  if( !db
11850 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
11860 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b  void *)outOfMem;
11870 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69  .  }.  if( !sqli
11880 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
11890 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
118a0 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a    return (void *
118b0 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73  )misuse;.  }.  s
118c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
118d0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
118e0 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
118f0 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
11900 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65   (void *)outOfMe
11910 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  m;.  }else{.    
11920 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
11930 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
11940 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30  r);.    if( z==0
11950 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
11960 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62  3ErrorWithMsg(db
11970 2c 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73  , db->errCode, s
11980 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d  qlite3ErrStr(db-
11990 3e 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20 20  >errCode));.    
119a0 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
119b0 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70  lue_text16(db->p
119c0 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Err);.    }.    
119d0 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61  /* A malloc() ma
119e0 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 69  y have failed wi
119f0 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f  thin the call to
11a00 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
11a10 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61  ext16().    ** a
11a20 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69 73  bove. If this is
11a30 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
11a40 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  the db->mallocFa
11a50 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20  iled flag needs 
11a60 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65  to.    ** be cle
11a70 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  ared before retu
11a80 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64  rning. Do this d
11a90 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
11aa0 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73   of via.    ** s
11ab0 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 29 2c  qlite3ApiExit(),
11ac0 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e   to avoid settin
11ad0 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  g the database h
11ae0 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73  andle error mess
11af0 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
11b00 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11b10 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
11b20 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
11b30 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
11b40 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
11b50 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
11b60 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
11b70 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  Return the most 
11b80 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  recent error cod
11b90 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
11ba0 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65  n SQLite routine
11bb0 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20  . If NULL is.** 
11bc0 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
11bd0 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75  unction, we assu
11be0 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  me a malloc() fa
11bf0 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69  iled during sqli
11c00 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69  te3_open()..*/.i
11c10 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  nt sqlite3_errco
11c20 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
11c30 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71  .  if( db && !sq
11c40 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
11c50 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
11c60 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11c70 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
11c80 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20   }.  if( !db || 
11c90 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
11ca0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
11cb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
11cc0 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72  .  return db->er
11cd0 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d  rCode & db->errM
11ce0 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  ask;.}.int sqlit
11cf0 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
11d00 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ode(sqlite3 *db)
11d10 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73  {.  if( db && !s
11d20 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
11d30 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
11d40 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
11d50 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
11d60 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
11d70 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11d80 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
11d90 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
11da0 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
11db0 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrCode;.}../*.**
11dc0 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   Return a string
11dd0 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
11de0 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  the kind of erro
11df0 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
11e00 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  he.** argument. 
11e10 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20 73   For now, this s
11e20 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65 20  imply calls the 
11e30 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65 33  internal sqlite3
11e40 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63  ErrStr().** func
11e50 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  tion..*/.const c
11e60 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
11e70 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 72  str(int rc){.  r
11e80 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
11e90 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Str(rc);.}../*.*
11ea0 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
11eb0 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
11ec0 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 22  n for database "
11ed0 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69  db".  The name i
11ee0 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74  s zName.** and t
11ef0 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65  he encoding is e
11f00 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nc..*/.static in
11f10 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  t createCollatio
11f20 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
11f30 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
11f40 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63  zName, .  u8 enc
11f50 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a  ,.  void* pCtx,.
11f60 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
11f70 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
11f80 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
11f90 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28   void*),.  void(
11fa0 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b  *xDel)(void*).){
11fb0 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
11fc0 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20  l;.  int enc2;. 
11fd0 20 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69   .  assert( sqli
11fe0 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
11ff0 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20  b->mutex) );..  
12000 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46  /* If SQLITE_UTF
12010 31 36 20 69 73 20 73 70 65 63 69 66 69 65 64 20  16 is specified 
12020 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  as the encoding 
12030 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20  type, transform 
12040 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65  this.  ** to one
12050 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   of SQLITE_UTF16
12060 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46  LE or SQLITE_UTF
12070 31 36 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20  16BE using the. 
12080 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36   ** SQLITE_UTF16
12090 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51  NATIVE macro. SQ
120a0 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f  LITE_UTF16 is no
120b0 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c  t used internall
120c0 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d  y..  */.  enc2 =
120d0 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61 73 65   enc;.  testcase
120e0 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
120f0 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74 63 61  TF16 );.  testca
12100 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  se( enc2==SQLITE
12110 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29  _UTF16_ALIGNED )
12120 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d 53 51  ;.  if( enc2==SQ
12130 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e  LITE_UTF16 || en
12140 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
12150 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20 20 20  _ALIGNED ){.    
12160 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f 55 54  enc2 = SQLITE_UT
12170 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20  F16NATIVE;.  }. 
12180 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49 54 45   if( enc2<SQLITE
12190 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51  _UTF8 || enc2>SQ
121a0 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 7b 0a  LITE_UTF16BE ){.
121b0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
121c0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
121d0 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69   }..  /* Check i
121e0 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 72  f this call is r
121f0 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70 6c 61  emoving or repla
12200 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69 6e 67  cing an existing
12210 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a   collation .  **
12220 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20 73 6f   sequence. If so
12230 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
12240 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65 74 75  active VMs, retu
12250 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68 65 72  rn busy. If ther
12260 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63  e.  ** are no ac
12270 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69  tive VMs, invali
12280 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d  date any pre-com
12290 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
122a0 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d  ..  */.  pColl =
122b0 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c   sqlite3FindColl
122c0 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32  Seq(db, (u8)enc2
122d0 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69  , zName, 0);.  i
122e0 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c  f( pColl && pCol
122f0 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20 20 69  l->xCmp ){.    i
12300 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  f( db->nVdbeActi
12310 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ve ){.      sqli
12320 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
12330 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
12340 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c   .        "unabl
12350 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69  e to delete/modi
12360 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  fy collation seq
12370 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74  uence due to act
12380 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29  ive statements")
12390 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
123a0 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
123b0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  }.    sqlite3Exp
123c0 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
123d0 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20  ments(db);..    
123e0 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20  /* If collation 
123f0 73 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77  sequence pColl w
12400 61 73 20 63 72 65 61 74 65 64 20 64 69 72 65 63  as created direc
12410 74 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f  tly by a call to
12420 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f  .    ** sqlite3_
12430 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
12440 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61  , and not genera
12450 74 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c  ted by synthColl
12460 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68  Seq(),.    ** th
12470 65 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61  en any copies ma
12480 64 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53  de by synthCollS
12490 65 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20  eq() need to be 
124a0 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20  invalidated..   
124b0 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74   ** Also, collat
124c0 69 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d  ion destructor -
124d0 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20   CollSeq.xDel() 
124e0 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e  - function may n
124f0 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65  eed.    ** to be
12500 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20   called..    */ 
12510 0a 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d  .    if( (pColl-
12520 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55  >enc & ~SQLITE_U
12530 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65  TF16_ALIGNED)==e
12540 6e 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c  nc2 ){.      Col
12550 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71  lSeq *aColl = sq
12560 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64  lite3HashFind(&d
12570 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61  b->aCollSeq, zNa
12580 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  me);.      int j
12590 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
125a0 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<3; j++){.    
125b0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d      CollSeq *p =
125c0 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20   &aColl[j];.    
125d0 20 20 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d      if( p->enc==
125e0 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20  pColl->enc ){.  
125f0 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78          if( p->x
12600 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Del ){.         
12610 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55     p->xDel(p->pU
12620 73 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ser);.          
12630 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78  }.          p->x
12640 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Cmp = 0;.       
12650 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
12660 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20  .  }..  pColl = 
12670 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
12680 65 71 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c  eq(db, (u8)enc2,
12690 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66   zName, 1);.  if
126a0 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74  ( pColl==0 ) ret
126b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
126c0 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20  ;.  pColl->xCmp 
126d0 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43  = xCompare;.  pC
126e0 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74  oll->pUser = pCt
126f0 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c  x;.  pColl->xDel
12700 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c   = xDel;.  pColl
12710 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63  ->enc = (u8)(enc
12720 32 20 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54  2 | (enc & SQLIT
12730 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
12740 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f  );.  sqlite3Erro
12750 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  r(db, SQLITE_OK)
12760 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
12770 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  E_OK;.}.../*.** 
12780 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69 6e  This array defin
12790 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62 6f  es hard upper bo
127a0 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61  unds on limit va
127b0 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e  lues.  The.** in
127c0 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20 62  itializer must b
127d0 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20 77  e kept in sync w
127e0 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 4c  ith the SQLITE_L
127f0 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e  IMIT_*.** #defin
12800 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e  es in sqlite3.h.
12810 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
12820 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74 5b   int aHardLimit[
12830 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d  ] = {.  SQLITE_M
12840 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  AX_LENGTH,.  SQL
12850 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
12860 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
12870 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54  _COLUMN,.  SQLIT
12880 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48  E_MAX_EXPR_DEPTH
12890 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ,.  SQLITE_MAX_C
128a0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a  OMPOUND_SELECT,.
128b0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42    SQLITE_MAX_VDB
128c0 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  E_OP,.  SQLITE_M
128d0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c  AX_FUNCTION_ARG,
128e0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  .  SQLITE_MAX_AT
128f0 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54 45  TACHED,.  SQLITE
12900 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
12910 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49  N_LENGTH,.  SQLI
12920 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
12930 4e 55 4d 42 45 52 2c 20 20 20 20 20 20 2f 2a 20  NUMBER,      /* 
12940 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d 33 32 33  IMP: R-38091-323
12950 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54 45 5f 4d  52 */.  SQLITE_M
12960 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
12970 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57  ,.  SQLITE_MAX_W
12980 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 2c 0a 7d  ORKER_THREADS,.}
12990 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75  ;../*.** Make su
129a0 72 65 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69  re the hard limi
129b0 74 73 20 61 72 65 20 73 65 74 20 74 6f 20 72 65  ts are set to re
129c0 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a  asonable values.
129d0 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  */.#if SQLITE_MA
129e0 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65  X_LENGTH<100.# e
129f0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
12a00 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
12a10 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64  t least 100.#end
12a20 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
12a30 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30  X_SQL_LENGTH<100
12a40 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
12a50 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d  MAX_SQL_LENGTH m
12a60 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
12a70 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  100.#endif.#if S
12a80 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
12a90 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  NGTH>SQLITE_MAX_
12aa0 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53  LENGTH.# error S
12ab0 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
12ac0 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65  NGTH must not be
12ad0 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 53 51   greater than SQ
12ae0 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a  LITE_MAX_LENGTH.
12af0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
12b00 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
12b10 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20  ELECT<2.# error 
12b20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
12b30 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20  UND_SELECT must 
12b40 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65  be at least 2.#e
12b50 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
12b60 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23  MAX_VDBE_OP<40.#
12b70 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
12b80 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62  X_VDBE_OP must b
12b90 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65  e at least 40.#e
12ba0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
12bb0 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
12bc0 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58  <0 || SQLITE_MAX
12bd0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30  _FUNCTION_ARG>10
12be0 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
12bf0 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
12c00 52 47 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  RG must be betwe
12c10 65 6e 20 30 20 61 6e 64 20 31 30 30 30 0a 23 65  en 0 and 1000.#e
12c20 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
12c30 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c  MAX_ATTACHED<0 |
12c40 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  | SQLITE_MAX_ATT
12c50 41 43 48 45 44 3e 31 32 35 0a 23 20 65 72 72 6f  ACHED>125.# erro
12c60 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  r SQLITE_MAX_ATT
12c70 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62 65  ACHED must be be
12c80 74 77 65 65 6e 20 30 20 61 6e 64 20 31 32 35 0a  tween 0 and 125.
12c90 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
12ca0 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
12cb0 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72  RN_LENGTH<1.# er
12cc0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
12cd0 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
12ce0 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
12cf0 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ast 1.#endif.#if
12d00 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
12d10 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72  MN>32767.# error
12d20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
12d30 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65  MN must not exce
12d40 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a  ed 32767.#endif.
12d50 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  #if SQLITE_MAX_T
12d60 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23  RIGGER_DEPTH<1.#
12d70 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
12d80 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
12d90 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
12da0 20 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   1.#endif.#if SQ
12db0 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
12dc0 54 48 52 45 41 44 53 3c 30 20 7c 7c 20 53 51 4c  THREADS<0 || SQL
12dd0 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54  ITE_MAX_WORKER_T
12de0 48 52 45 41 44 53 3e 35 30 0a 23 20 65 72 72 6f  HREADS>50.# erro
12df0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  r SQLITE_MAX_WOR
12e00 4b 45 52 5f 54 48 52 45 41 44 53 20 6d 75 73 74  KER_THREADS must
12e10 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e   be between 0 an
12e20 64 20 35 30 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  d 50.#endif.../*
12e30 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76  .** Change the v
12e40 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e  alue of a limit.
12e50 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64    Report the old
12e60 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e   value..** If an
12e70 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69   invalid limit i
12e80 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69 65 64  ndex is supplied
12e90 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20  , report -1..** 
12ea0 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
12eb0 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74  but still report
12ec0 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69   the old value i
12ed0 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d  f the.** new lim
12ee0 69 74 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a  it is negative..
12ef0 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65  **.** A new lowe
12f00 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74  r limit does not
12f10 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67   shrink existing
12f20 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20   constructs..** 
12f30 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e  It merely preven
12f40 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74  ts new construct
12f50 73 20 74 68 61 74 20 65 78 63 65 65 64 20 74 68  s that exceed th
12f60 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20  e limit.** from 
12f70 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  forming..*/.int 
12f80 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71  sqlite3_limit(sq
12f90 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c  lite3 *db, int l
12fa0 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c  imitId, int newL
12fb0 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64  imit){.  int old
12fc0 4c 69 6d 69 74 3b 0a 0a 23 69 66 64 65 66 20 53  Limit;..#ifdef S
12fd0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
12fe0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
12ff0 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
13000 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76  Ok(db) ){.    (v
13010 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53  oid)SQLITE_MISUS
13020 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75  E_BKPT;.    retu
13030 72 6e 20 2d 31 3b 0a 20 20 7d 0a 23 65 6e 64 69  rn -1;.  }.#endi
13040 66 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  f..  /* EVIDENCE
13050 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30  -OF: R-30189-540
13060 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69  97 For each limi
13070 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54  t category SQLIT
13080 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a  E_LIMIT_NAME.  *
13090 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72  * there is a har
130a0 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65  d upper bound se
130b0 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t at compile-tim
130c0 65 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63  e by a C preproc
130d0 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f  essor.  ** macro
130e0 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d   called SQLITE_M
130f0 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f  AX_NAME. (The "_
13100 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e  LIMIT_" in the n
13110 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ame is changed t
13120 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29  o.  ** "_MAX_".)
13130 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
13140 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13150 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d  E_LIMIT_LENGTH]=
13160 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47  =SQLITE_MAX_LENG
13170 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
13180 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13190 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
131a0 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
131b0 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  SQL_LENGTH );.  
131c0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
131d0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
131e0 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f  COLUMN]==SQLITE_
131f0 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  MAX_COLUMN );.  
13200 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
13210 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
13220 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c  EXPR_DEPTH]==SQL
13230 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
13240 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
13250 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
13260 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
13270 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45  _SELECT]==SQLITE
13280 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
13290 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28  LECT);.  assert(
132a0 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
132b0 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50  TE_LIMIT_VDBE_OP
132c0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  ]==SQLITE_MAX_VD
132d0 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72  BE_OP );.  asser
132e0 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
132f0 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54  LITE_LIMIT_FUNCT
13300 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45  ION_ARG]==SQLITE
13310 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
13320 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  G );.  assert( a
13330 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
13340 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d  _LIMIT_ATTACHED]
13350 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  ==SQLITE_MAX_ATT
13360 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ACHED );.  asser
13370 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
13380 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
13390 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d  PATTERN_LENGTH]=
133a0 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
133b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
133e0 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
133f0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
13400 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
13410 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
13420 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  MBER]==SQLITE_MA
13430 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
13440 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  R);.  assert( aH
13450 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
13460 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
13470 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
13480 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29  _TRIGGER_DEPTH )
13490 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
134a0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
134b0 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MIT_WORKER_THREA
134c0 44 53 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  DS]==SQLITE_MAX_
134d0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 29  WORKER_THREADS )
134e0 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
134f0 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
13500 54 48 52 45 41 44 53 3d 3d 28 53 51 4c 49 54 45  THREADS==(SQLITE
13510 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a  _N_LIMIT-1) );..
13520 0a 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30  .  if( limitId<0
13530 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c   || limitId>=SQL
13540 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20  ITE_N_LIMIT ){. 
13550 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20     return -1;.  
13560 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64  }.  oldLimit = d
13570 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  b->aLimit[limitI
13580 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d  d];.  if( newLim
13590 69 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20  it>=0 ){        
135a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d             /* IM
135b0 50 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32  P: R-52476-28732
135c0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c   */.    if( newL
135d0 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b  imit>aHardLimit[
135e0 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20  limitId] ){.    
135f0 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61    newLimit = aHa
13600 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  rdLimit[limitId]
13610 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34  ;  /* IMP: R-514
13620 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20  63-25634 */.    
13630 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74  }.    db->aLimit
13640 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c  [limitId] = newL
13650 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  imit;.  }.  retu
13660 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20  rn oldLimit;    
13670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13680 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31   /* IMP: R-53341
13690 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a  -35419 */.}../*.
136a0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
136b0 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 72 73   is used to pars
136c0 65 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20  e both URIs and 
136d0 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65  non-URI filename
136e0 73 20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a  s passed by the.
136f0 2a 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20 66  ** user to API f
13700 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33  unctions sqlite3
13710 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74  _open() or sqlit
13720 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e  e3_open_v2(), an
13730 64 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a  d for database.*
13740 2a 20 55 52 49 73 20 73 70 65 63 69 66 69 65 64  * URIs specified
13750 20 61 73 20 70 61 72 74 20 6f 66 20 41 54 54 41   as part of ATTA
13760 43 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  CH statements..*
13770 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61  *.** The first a
13780 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20  rgument to this 
13790 66 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20  function is the 
137a0 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  name of the VFS 
137b0 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20  to use (or.** a 
137c0 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20  NULL to signify 
137d0 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 29  the default VFS)
137e0 20 69 66 20 74 68 65 20 55 52 49 20 64 6f 65 73   if the URI does
137f0 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22   not contain a "
13800 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72  vfs=xxx".** quer
13810 79 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65  y parameter. The
13820 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
13830 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52   contains the UR
13840 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69  I (or non-URI fi
13850 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c  lename).** itsel
13860 66 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e  f. When this fun
13870 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
13880 74 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69  the *pFlags vari
13890 61 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74  able should cont
138a0 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75  ain.** the defau
138b0 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e  lt flags to open
138c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
138d0 6e 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76  ndle with. The v
138e0 61 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a  alue stored in.*
138f0 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65  * *pFlags may be
13900 20 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 20   updated before 
13910 72 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65  returning if the
13920 20 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f   URI filename co
13930 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68  ntains .** "cach
13940 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d  e=xxx" or "mode=
13950 78 78 78 22 20 71 75 65 72 79 20 70 61 72 61 6d  xxx" query param
13960 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eters..**.** If 
13970 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
13980 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
13990 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  d. In this case 
139a0 2a 70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f  *ppVfs is set to
139b0 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65   point to.** the
139c0 20 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64   VFS that should
139d0 20 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e   be used to open
139e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
139f0 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73  le. *pzFile is s
13a00 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74  et to.** point t
13a10 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
13a20 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f  ining the name o
13a30 66 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70  f the file to op
13a40 65 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a  en. It is the .*
13a50 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  * responsibility
13a60 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
13a70 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c  o eventually cal
13a80 6c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29  l sqlite3_free()
13a90 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74   to release.** t
13aa0 68 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a  his buffer..**.*
13ab0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
13ac0 63 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51  curs, then an SQ
13ad0 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
13ae0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
13af0 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79  *pzErrMsg.** may
13b00 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   be set to point
13b10 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
13b20 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69  taining an Engli
13b30 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f  sh language erro
13b40 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49  r .** message. I
13b50 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
13b60 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
13b70 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
13b80 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74  lly release.** t
13b90 68 69 73 20 62 75 66 66 65 72 20 62 79 20 63 61  his buffer by ca
13ba0 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72  lling sqlite3_fr
13bb0 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ee()..*/.int sql
13bc0 69 74 65 33 50 61 72 73 65 55 72 69 28 0a 20 20  ite3ParseUri(.  
13bd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66  const char *zDef
13be0 61 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20  aultVfs,        
13bf0 2f 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69 66  /* VFS to use if
13c00 20 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75   no "vfs=xxx" qu
13c10 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20  ery option */.  
13c20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69  const char *zUri
13c30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13c40 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  /* Nul-terminate
13c50 64 20 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a  d URI to parse *
13c60 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  /.  unsigned int
13c70 20 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20   *pFlags,       
13c80 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53      /* IN/OUT: S
13c90 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66  QLITE_OPEN_XXX f
13ca0 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  lags */.  sqlite
13cb0 33 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20  3_vfs **ppVfs,  
13cc0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
13cd0 3a 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20  : VFS to use */ 
13ce0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65  .  char **pzFile
13cf0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
13d00 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e     /* OUT: Filen
13d10 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66  ame component of
13d20 20 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a   URI */.  char *
13d30 2a 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20  *pzErrMsg       
13d40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
13d50 3a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20  : Error message 
13d60 28 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  (if rc!=SQLITE_O
13d70 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  K) */.){.  int r
13d80 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
13d90 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c   unsigned int fl
13da0 61 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20  ags = *pFlags;. 
13db0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
13dc0 73 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b  s = zDefaultVfs;
13dd0 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a  .  char *zFile;.
13de0 20 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20    char c;.  int 
13df0 6e 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74  nUri = sqlite3St
13e00 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20  rlen30(zUri);.. 
13e10 20 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d   assert( *pzErrM
13e20 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20  sg==0 );..  if( 
13e30 28 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ((flags & SQLITE
13e40 5f 4f 50 45 4e 5f 55 52 49 29 20 20 20 20 20 20  _OPEN_URI)      
13e50 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52         /* IMP: R
13e60 2d 34 38 37 32 35 2d 33 32 32 30 36 20 2a 2f 0a  -48725-32206 */.
13e70 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
13e80 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
13e90 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 2f 2a 20  ig.bOpenUri) /* 
13ea0 49 4d 50 3a 20 52 2d 35 31 36 38 39 2d 34 36 35  IMP: R-51689-465
13eb0 34 38 20 2a 2f 0a 20 20 20 26 26 20 6e 55 72 69  48 */.   && nUri
13ec0 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55  >=5 && memcmp(zU
13ed0 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d  ri, "file:", 5)=
13ee0 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38  =0 /* IMP: R-578
13ef0 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b  84-37496 */.  ){
13f00 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b  .    char *zOpt;
13f10 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b  .    int eState;
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61     /* Parser sta
13f40 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  te when parsing 
13f50 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  URI */.    int i
13f60 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  In;             
13f70 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
13f80 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65  t character inde
13f90 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75  x */.    int iOu
13fa0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
13fb0 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
13fc0 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78   character index
13fd0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
13fe0 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20  e = nUri+2;     
13ff0 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
14000 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  f space to alloc
14010 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d  ate */..    /* M
14020 61 6b 65 20 73 75 72 65 20 74 68 65 20 53 51 4c  ake sure the SQL
14030 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61  ITE_OPEN_URI fla
14040 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69  g is set to indi
14050 63 61 74 65 20 74 6f 20 74 68 65 20 56 46 53 20  cate to the VFS 
14060 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65  xOpen .    ** me
14070 74 68 6f 64 20 74 68 61 74 20 74 68 65 72 65 20  thod that there 
14080 6d 61 79 20 62 65 20 65 78 74 72 61 20 70 61 72  may be extra par
14090 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e  ameters followin
140a0 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e  g the file-name.
140b0 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c    */.    flags |
140c0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  = SQLITE_OPEN_UR
140d0 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d  I;..    for(iIn=
140e0 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e  0; iIn<nUri; iIn
140f0 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55  ++) nByte += (zU
14100 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20  ri[iIn]=='&');. 
14110 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74     zFile = sqlit
14120 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29  e3_malloc(nByte)
14130 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65  ;.    if( !zFile
14140 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
14150 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20 69 49 6e  _NOMEM;..    iIn
14160 20 3d 20 35 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 5;.#ifndef SQ
14170 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41  LITE_ALLOW_URI_A
14180 55 54 48 4f 52 49 54 59 0a 20 20 20 20 2f 2a 20  UTHORITY.    /* 
14190 44 69 73 63 61 72 64 20 74 68 65 20 73 63 68 65  Discard the sche
141a0 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79  me and authority
141b0 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65   segments of the
141c0 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28   URI. */.    if(
141d0 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26   zUri[5]=='/' &&
141e0 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b   zUri[6]=='/' ){
141f0 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a  .      iIn = 7;.
14200 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72        while( zUr
14210 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69  i[iIn] && zUri[i
14220 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b  In]!='/' ) iIn++
14230 3b 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e 21  ;.      if( iIn!
14240 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c  =7 && (iIn!=16 |
14250 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68  | memcmp("localh
14260 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20  ost", &zUri[7], 
14270 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  9)) ){.        *
14280 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
14290 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61  e3_mprintf("inva
142a0 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72 69 74  lid uri authorit
142b0 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20  y: %.*s", .     
142c0 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a         iIn-7, &z
142d0 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20  Uri[7]);.       
142e0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
142f0 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  OR;.        goto
14300 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
14310 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
14320 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70  ndif..    /* Cop
14330 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  y the filename a
14340 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70 61 72  nd any query par
14350 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65  ameters into the
14360 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a   zFile buffer. .
14370 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48      ** Decode %H
14380 48 20 65 73 63 61 70 65 20 63 6f 64 65 73 20 61  H escape codes a
14390 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20  long the way. . 
143a0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74     **.    ** Wit
143b0 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76  hin this loop, v
143c0 61 72 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d  ariable eState m
143d0 61 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20  ay be set to 0, 
143e0 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e  1 or 2, dependin
143f0 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  g.    ** on the 
14400 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e  parsing context.
14410 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   As follows:.   
14420 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20   **.    **   0: 
14430 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d  Parsing file-nam
14440 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50  e..    **   1: P
14450 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74  arsing name sect
14460 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
14470 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
14480 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a  ter..    **   2:
14490 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73   Parsing value s
144a0 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65  ection of a name
144b0 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72  =value query par
144c0 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  ameter..    */. 
144d0 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20     eState = 0;. 
144e0 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
144f0 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
14500 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20  c!='#' ){.      
14510 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  iIn++;.      if(
14520 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20   c=='%' .       
14530 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67  && sqlite3Isxdig
14540 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20  it(zUri[iIn]) . 
14550 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
14560 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49  Isxdigit(zUri[iI
14570 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a  n+1]) .      ){.
14580 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65          int octe
14590 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54  t = (sqlite3HexT
145a0 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d  oInt(zUri[iIn++]
145b0 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20  ) << 4);.       
145c0 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65   octet += sqlite
145d0 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
145e0 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20  In++]);..       
145f0 20 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d   assert( octet>=
14600 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29  0 && octet<256 )
14610 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 63  ;.        if( oc
14620 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tet==0 ){.      
14630 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
14640 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
14650 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20 77   "%00" appears w
14660 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49  ithin the URI. I
14670 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
14680 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f   ** case we igno
14690 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74  re all text in t
146a0 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
146b0 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f  the path, name o
146c0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76  r.          ** v
146d0 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62  alue currently b
146e0 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20  eing parsed. So 
146f0 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65  ignore the curre
14700 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20 20  nt character.   
14710 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b         ** and sk
14720 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22  ip to the next "
14730 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20  ?", "=" or "&", 
14740 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
14750 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
14760 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49  le( (c = zUri[iI
14770 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27  n])!=0 && c!='#'
14780 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
14790 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c  && (eState!=0 ||
147a0 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20   c!='?').       
147b0 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
147c0 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20  e!=1 || (c!='=' 
147d0 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20  && c!='&')).    
147e0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
147f0 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26  tate!=2 || c!='&
14800 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  ').          ){.
14810 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b              iIn+
14820 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
14830 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
14840 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
14850 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a       c = octet;.
14860 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
14870 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d  eState==1 && (c=
14880 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20  ='&' || c=='=') 
14890 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
148a0 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20  File[iOut-1]==0 
148b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
148c0 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20  An empty option 
148d0 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69  name. Ignore thi
148e0 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74  s option altoget
148f0 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  her. */.        
14900 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
14910 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
14920 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e  ='#' && zUri[iIn
14930 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b  -1]!='&' ) iIn++
14940 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
14950 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
14960 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
14970 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  &' ){.          
14980 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
14990 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65  '\0';.        }e
149a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65  lse{.          e
149b0 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20  State = 2;.     
149c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
149d0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
149e0 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26  if( (eState==0 &
149f0 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53  & c=='?') || (eS
14a00 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26  tate==2 && c=='&
14a10 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  ') ){.        c 
14a20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74  = 0;.        eSt
14a30 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ate = 1;.      }
14a40 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  .      zFile[iOu
14a50 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a  t++] = c;.    }.
14a60 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d      if( eState==
14a70 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b  1 ) zFile[iOut++
14a80 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
14a90 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
14aa0 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f  0';.    zFile[iO
14ab0 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  ut++] = '\0';.. 
14ac0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
14ad0 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70  here were any op
14ae0 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20  tions specified 
14af0 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69  that should be i
14b00 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20 20  nterpreted .    
14b10 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73  ** here. Options
14b20 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72 70   that are interp
14b30 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75  reted here inclu
14b40 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f  de "vfs" and tho
14b50 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  se that.    ** c
14b60 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61  orrespond to fla
14b70 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70  gs that may be p
14b80 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c  assed to the sql
14b90 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20  ite3_open_v2(). 
14ba0 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f     ** method. */
14bb0 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69  .    zOpt = &zFi
14bc0 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  le[sqlite3Strlen
14bd0 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20  30(zFile)+1];.  
14be0 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d    while( zOpt[0]
14bf0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
14c00 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  pt = sqlite3Strl
14c10 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20  en30(zOpt);.    
14c20 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26    char *zVal = &
14c30 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20  zOpt[nOpt+1];.  
14c40 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73      int nVal = s
14c50 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
14c60 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  Val);..      if(
14c70 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63   nOpt==3 && memc
14c80 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20  mp("vfs", zOpt, 
14c90 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  3)==0 ){.       
14ca0 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20   zVfs = zVal;.  
14cb0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14cc0 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f     struct OpenMo
14cd0 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63  de {.          c
14ce0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
14cf0 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
14d00 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f  ;.        } *aMo
14d10 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
14d20 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20  char *zModeType 
14d30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
14d40 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20   mask = 0;.     
14d50 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30     int limit = 0
14d60 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ;..        if( n
14d70 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Opt==5 && memcmp
14d80 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20  ("cache", zOpt, 
14d90 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  5)==0 ){.       
14da0 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
14db0 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65   OpenMode aCache
14dc0 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
14dd0 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65 64         { "shared
14de0 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
14df0 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20  SHAREDCACHE },. 
14e00 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70 72             { "pr
14e10 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f  ivate", SQLITE_O
14e20 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
14e30 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
14e40 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
14e50 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
14e60 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
14e70 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c  PEN_SHAREDCACHE|
14e80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
14e90 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20  ATECACHE;.      
14ea0 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63      aMode = aCac
14eb0 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  heMode;.        
14ec0 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a    limit = mask;.
14ed0 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
14ee0 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20  ype = "cache";. 
14ef0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
14f00 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20   if( nOpt==4 && 
14f10 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a  memcmp("mode", z
14f20 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 4)==0 ){.  
14f30 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73          static s
14f40 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61  truct OpenMode a
14f50 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  OpenMode[] = {. 
14f60 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f             { "ro
14f70 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
14f80 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20  READONLY },.    
14f90 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20          { "rw", 
14fa0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
14fb0 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20  DWRITE }, .     
14fc0 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20         { "rwc", 
14fd0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
14fe0 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
14ff0 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20  PEN_CREATE },.  
15000 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d            { "mem
15010 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ory", SQLITE_OPE
15020 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20  N_MEMORY },.    
15030 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
15040 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
15050 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
15060 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
15070 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50  ONLY | SQLITE_OP
15080 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20  EN_READWRITE.   
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150a0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
150b0 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
150c0 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20  EN_MEMORY;.     
150d0 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70       aMode = aOp
150e0 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  enMode;.        
150f0 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26    limit = mask &
15100 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20   flags;.        
15110 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61    zModeType = "a
15120 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20  ccess";.        
15130 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  }..        if( a
15140 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
15150 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
15160 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b     int mode = 0;
15170 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
15180 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20  =0; aMode[i].z; 
15190 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
151a0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
151b0 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20  = aMode[i].z;.  
151c0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 56            if( nV
151d0 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65  al==sqlite3Strle
151e0 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d  n30(z) && 0==mem
151f0 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61  cmp(zVal, z, nVa
15200 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
15210 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65      mode = aMode
15220 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  [i].mode;.      
15230 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
15240 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
15250 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15260 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29     if( mode==0 )
15270 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
15280 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
15290 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
152a0 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c  ch %s mode: %s",
152b0 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c   zModeType, zVal
152c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
152d0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
152e0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
152f0 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
15300 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
15310 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64          if( (mod
15320 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  e & ~SQLITE_OPEN
15330 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29  _MEMORY)>limit )
15340 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
15350 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
15360 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f  3_mprintf("%s mo
15370 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20  de not allowed: 
15380 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
15390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
153a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f               zMo
153b0 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20  deType, zVal);. 
153c0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
153d0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
153e0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
153f0 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
15400 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15410 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67     flags = (flag
15420 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64  s & ~mask) | mod
15430 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
15440 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74     }..      zOpt
15450 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d   = &zVal[nVal+1]
15460 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
15470 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  {.    zFile = sq
15480 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72  lite3_malloc(nUr
15490 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  i+2);.    if( !z
154a0 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
154b0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
154c0 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55  memcpy(zFile, zU
154d0 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a  ri, nUri);.    z
154e0 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30  File[nUri] = '\0
154f0 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72  ';.    zFile[nUr
15500 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  i+1] = '\0';.   
15510 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
15520 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a  E_OPEN_URI;.  }.
15530 0a 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69  .  *ppVfs = sqli
15540 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66  te3_vfs_find(zVf
15550 73 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73  s);.  if( *ppVfs
15560 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  ==0 ){.    *pzEr
15570 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
15580 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20  printf("no such 
15590 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b  vfs: %s", zVfs);
155a0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
155b0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72  _ERROR;.  }. par
155c0 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66  se_uri_out:.  if
155d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
155e0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
155f0 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ree(zFile);.    
15600 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zFile = 0;.  }. 
15610 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73   *pFlags = flags
15620 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46  ;.  *pzFile = zF
15630 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ile;.  return rc
15640 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
15650 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
15660 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e  e work of openin
15670 67 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20  g a database on 
15680 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c  behalf of.** sql
15690 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20  ite3_open() and 
156a0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29  sqlite3_open16()
156b0 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
156c0 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61  ilename "zFilena
156d0 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d  me"  .** is UTF-
156e0 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74  8 encoded..*/.st
156f0 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74  atic int openDat
15700 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63  abase(.  const c
15710 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
15720 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
15730 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64  name UTF-8 encod
15740 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
15750 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f  **ppDb,        /
15760 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20  * OUT: Returned 
15770 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
15780 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
15790 74 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f  t flags,    /* O
157a0 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73  perational flags
157b0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
157c0 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20   *zVfs       /* 
157d0 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  Name of the VFS 
157e0 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73  to use */.){.  s
157f0 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
15800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
15810 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65  * Store allocate
15820 64 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  d handle here */
15830 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
15840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15850 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
15860 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72  e */.  int isThr
15870 65 61 64 73 61 66 65 3b 20 20 20 20 20 20 20 20  eadsafe;        
15880 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
15890 6f 72 20 74 68 72 65 61 64 73 61 66 65 20 63 6f  or threadsafe co
158a0 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63  nnections */.  c
158b0 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20  har *zOpen = 0; 
158c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
158d0 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d  * Filename argum
158e0 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42  ent to pass to B
158f0 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  treeOpen() */.  
15900 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
15910 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
15920 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
15930 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72   from sqlite3Par
15940 73 65 55 72 69 28 29 20 2a 2f 0a 0a 23 69 66 64  seUri() */..#ifd
15950 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15960 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
15970 20 70 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72   ppDb==0 ) retur
15980 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
15990 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a  BKPT;.#endif.  *
159a0 70 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65  ppDb = 0;.#ifnde
159b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
159c0 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71  TOINIT.  rc = sq
159d0 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
159e0 28 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ();.  if( rc ) r
159f0 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
15a00 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f  ..  /* Only allo
15a10 77 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69  w sensible combi
15a20 6e 61 74 69 6f 6e 73 20 6f 66 20 62 69 74 73 20  nations of bits 
15a30 69 6e 20 74 68 65 20 66 6c 61 67 73 20 61 72 67  in the flags arg
15a40 75 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68  ument.  .  ** Th
15a50 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20  row an error if 
15a60 61 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f  any non-sense co
15a70 6d 62 69 6e 61 74 69 6f 6e 20 69 73 20 75 73 65  mbination is use
15a80 64 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 64  d.  If we.  ** d
15a90 6f 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65  o not block ille
15aa0 67 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  gal combinations
15ab0 20 68 65 72 65 2c 20 69 74 20 63 6f 75 6c 64 20   here, it could 
15ac0 74 72 69 67 67 65 72 0a 20 20 2a 2a 20 61 73 73  trigger.  ** ass
15ad0 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
15ae0 20 69 6e 20 64 65 65 70 65 72 20 6c 61 79 65 72   in deeper layer
15af0 73 2e 20 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d  s.  Sensible com
15b00 62 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61  binations.  ** a
15b10 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31  re:.  **.  **  1
15b20 3a 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  :  SQLITE_OPEN_R
15b30 45 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a  EADONLY.  **  2:
15b40 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
15b50 41 44 57 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a  ADWRITE.  **  6:
15b60 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
15b70 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45  ADWRITE | SQLITE
15b80 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a  _OPEN_CREATE.  *
15b90 2f 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  /.  assert( SQLI
15ba0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
15bb0 20 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61    == 0x01 );.  a
15bc0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
15bd0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20  EN_READWRITE == 
15be0 30 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74  0x02 );.  assert
15bf0 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  ( SQLITE_OPEN_CR
15c00 45 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20  EATE    == 0x04 
15c10 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  );.  testcase( (
15c20 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
15c30 78 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e  x02 ); /* READON
15c40 4c 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  LY */.  testcase
15c50 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
15c60 3d 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41  ==0x04 ); /* REA
15c70 44 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74  DWRITE */.  test
15c80 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73  case( (1<<(flags
15c90 26 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a  &7))==0x40 ); /*
15ca0 20 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45   READWRITE | CRE
15cb0 41 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31  ATE */.  if( ((1
15cc0 3c 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20 30  <<(flags&7)) & 0
15cd0 78 34 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  x46)==0 ){.    r
15ce0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
15cf0 55 53 45 5f 42 4b 50 54 3b 20 20 2f 2a 20 49 4d  USE_BKPT;  /* IM
15d00 50 3a 20 52 2d 36 35 34 39 37 2d 34 34 35 39 34  P: R-65497-44594
15d10 20 2a 2f 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73   */.  }..  if( s
15d20 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15d30 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30  ig.bCoreMutex==0
15d40 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
15d50 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  safe = 0;.  }els
15d60 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
15d70 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
15d80 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61  X ){.    isThrea
15d90 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  dsafe = 0;.  }el
15da0 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53  se if( flags & S
15db0 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
15dc0 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68  UTEX ){.    isTh
15dd0 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20  readsafe = 1;.  
15de0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72  }else{.    isThr
15df0 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65  eadsafe = sqlite
15e00 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46  3GlobalConfig.bF
15e10 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20  ullMutex;.  }.  
15e20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49  if( flags & SQLI
15e30 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
15e40 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61 67  ACHE ){.    flag
15e50 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
15e60 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20  N_SHAREDCACHE;. 
15e70 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
15e80 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
15e90 68 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65  haredCacheEnable
15ea0 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  d ){.    flags |
15eb0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  = SQLITE_OPEN_SH
15ec0 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a  AREDCACHE;.  }..
15ed0 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d    /* Remove harm
15ee0 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68  ful bits from th
15ef0 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65  e flags paramete
15f00 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  r.  **.  ** The 
15f10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
15f20 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  TEX and SQLITE_O
15f30 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c  PEN_FULLMUTEX fl
15f40 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64 65  ags were.  ** de
15f50 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65 20  alt with in the 
15f60 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62 6c  previous code bl
15f70 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74 68  ock.  Besides th
15f80 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20  ese, the only.  
15f90 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20 66  ** valid input f
15fa0 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33  lags for sqlite3
15fb0 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20 53  _open_v2() are S
15fc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
15fd0 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  NLY,.  ** SQLITE
15fe0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c  _OPEN_READWRITE,
15ff0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
16000 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ATE, SQLITE_OPEN
16010 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20 20  _SHAREDCACHE,.  
16020 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ** SQLITE_OPEN_P
16030 52 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e 64  RIVATECACHE, and
16040 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20 62   some reserved b
16050 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d  its.  Silently m
16060 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c  ask.  ** off all
16070 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20   other flags..  
16080 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e  */.  flags &=  ~
16090 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  ( SQLITE_OPEN_DE
160a0 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20  LETEONCLOSE |.  
160b0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
160c0 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49  ITE_OPEN_EXCLUSI
160d0 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  VE |.           
160e0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
160f0 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20  MAIN_DB |.      
16100 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
16110 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a  OPEN_TEMP_DB | .
16120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
16130 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53  QLITE_OPEN_TRANS
16140 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20  IENT_DB | .     
16150 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
16160 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
16170 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  AL | .          
16180 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16190 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20  _TEMP_JOURNAL | 
161a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
161b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
161c0 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
161d0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
161e0 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52  OPEN_MASTER_JOUR
161f0 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20  NAL |.          
16200 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
16210 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20  _NOMUTEX |.     
16220 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
16230 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
16240 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
16250 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c   SQLITE_OPEN_WAL
16260 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b  .             );
16270 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
16280 74 68 65 20 73 71 6c 69 74 65 20 64 61 74 61 20  the sqlite data 
16290 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 64  structure */.  d
162a0 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  b = sqlite3Mallo
162b0 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73 71  cZero( sizeof(sq
162c0 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20  lite3) );.  if( 
162d0 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65  db==0 ) goto ope
162e0 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69  ndb_out;.  if( i
162f0 73 54 68 72 65 61 64 73 61 66 65 20 29 7b 0a 20  sThreadsafe ){. 
16300 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73     db->mutex = s
16310 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
16320 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45  (SQLITE_MUTEX_RE
16330 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66  CURSIVE);.    if
16340 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29  ( db->mutex==0 )
16350 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
16360 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20  free(db);.      
16370 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f  db = 0;.      go
16380 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
16390 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
163a0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
163b0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
163c0 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b  >errMask = 0xff;
163d0 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a  .  db->nDb = 2;.
163e0 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
163f0 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b  LITE_MAGIC_BUSY;
16400 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d  .  db->aDb = db-
16410 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61  >aDbStatic;..  a
16420 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62  ssert( sizeof(db
16430 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f  ->aLimit)==sizeo
16440 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b  f(aHardLimit) );
16450 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c  .  memcpy(db->aL
16460 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74  imit, aHardLimit
16470 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69  , sizeof(db->aLi
16480 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69  mit));.  db->aLi
16490 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
164a0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d  _WORKER_THREADS]
164b0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
164c0 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
164d0 3b 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d  ;.  db->autoComm
164e0 69 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65  it = 1;.  db->ne
164f0 78 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a  xtAutovac = -1;.
16500 20 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73    db->szMmap = s
16510 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16520 69 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d  ig.szMmap;.  db-
16530 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20  >nextPagesize = 
16540 30 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72  0;.  db->nMaxSor
16550 74 65 72 4d 6d 61 70 20 3d 20 30 78 37 46 46 46  terMmap = 0x7FFF
16560 46 46 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67  FFFF;.  db->flag
16570 73 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72  s |= SQLITE_Shor
16580 74 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49  tColNames | SQLI
16590 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
165a0 20 7c 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53   | SQLITE_CacheS
165b0 70 69 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e 65  pill.#if !define
165c0 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  d(SQLITE_DEFAULT
165d0 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58  _AUTOMATIC_INDEX
165e0 29 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46 41  ) || SQLITE_DEFA
165f0 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e  ULT_AUTOMATIC_IN
16600 44 45 58 0a 20 20 20 20 20 20 20 20 20 20 20 20  DEX.            
16610 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 75       | SQLITE_Au
16620 74 6f 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23  toIndex.#endif.#
16630 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  if SQLITE_DEFAUL
16640 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a  T_FILE_FORMAT<4.
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16660 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79   | SQLITE_Legacy
16670 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23  FileFmt.#endif.#
16680 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
16690 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  BLE_LOAD_EXTENSI
166a0 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ON.             
166b0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61      | SQLITE_Loa
166c0 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69  dExtension.#endi
166d0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46  f.#if SQLITE_DEF
166e0 41 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54  AULT_RECURSIVE_T
166f0 52 49 47 47 45 52 53 0a 20 20 20 20 20 20 20 20  RIGGERS.        
16700 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
16710 45 5f 52 65 63 54 72 69 67 67 65 72 73 0a 23 65  E_RecTriggers.#e
16720 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
16730 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
16740 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26  FOREIGN_KEYS) &&
16750 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
16760 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20  FOREIGN_KEYS.   
16770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
16780 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65  SQLITE_ForeignKe
16790 79 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  ys.#endif.#if de
167a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 52 45 56  fined(SQLITE_REV
167b0 45 52 53 45 5f 55 4e 4f 52 44 45 52 45 44 5f 53  ERSE_UNORDERED_S
167c0 45 4c 45 43 54 53 29 0a 20 20 20 20 20 20 20 20  ELECTS).        
167d0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
167e0 45 5f 52 65 76 65 72 73 65 4f 72 64 65 72 0a 23  E_ReverseOrder.#
167f0 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20  endif.      ;.  
16800 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
16810 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a  &db->aCollSeq);.
16820 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
16830 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
16840 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
16850 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  it(&db->aModule)
16860 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
16870 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  dd the default c
16880 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
16890 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59  e BINARY. BINARY
168a0 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20   works for both 
168b0 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55  UTF-8.  ** and U
168c0 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20  TF-16, so add a 
168d0 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68  version for each
168e0 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e   to avoid any un
168f0 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63  necessary.  ** c
16900 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20  onversions. The 
16910 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20  only error that 
16920 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69  can occur here i
16930 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  s a malloc() fai
16940 6c 75 72 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lure..  **.  ** 
16950 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35  EVIDENCE-OF: R-5
16960 32 37 38 36 2d 34 34 38 37 38 20 53 51 4c 69 74  2786-44878 SQLit
16970 65 20 64 65 66 69 6e 65 73 20 74 68 72 65 65 20  e defines three 
16980 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
16990 6e 67 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  ng.  ** function
169a0 73 3a 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65  s:.  */.  create
169b0 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
169c0 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
169d0 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  TF8, 0, binCollF
169e0 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
169f0 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
16a00 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
16a10 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43  UTF16BE, 0, binC
16a20 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
16a30 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
16a40 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c  b, "BINARY", SQL
16a50 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20  ITE_UTF16LE, 0, 
16a60 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
16a70 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
16a80 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c  on(db, "NOCASE",
16a90 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
16aa0 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67   nocaseCollating
16ab0 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
16ac0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
16ad0 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f  "RTRIM", SQLITE_
16ae0 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20  UTF8, (void*)1, 
16af0 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
16b00 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
16b10 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
16b20 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
16b30 20 20 7d 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43    }.  /* EVIDENC
16b40 45 2d 4f 46 3a 20 52 2d 30 38 33 30 38 2d 31 37  E-OF: R-08308-17
16b50 32 32 34 20 54 68 65 20 64 65 66 61 75 6c 74 20  224 The default 
16b60 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69  collating functi
16b70 6f 6e 20 66 6f 72 20 61 6c 6c 0a 20 20 2a 2a 20  on for all.  ** 
16b80 73 74 72 69 6e 67 73 20 69 73 20 42 49 4e 41 52  strings is BINAR
16b90 59 2e 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 70  Y. .  */.  db->p
16ba0 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  DfltColl = sqlit
16bb0 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
16bc0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22  , SQLITE_UTF8, "
16bd0 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20 61  BINARY", 0);.  a
16be0 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74  ssert( db->pDflt
16bf0 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a  Coll!=0 );..  /*
16c00 20 50 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e   Parse the filen
16c10 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74  ame/URI argument
16c20 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46  . */.  db->openF
16c30 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
16c40 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  rc = sqlite3Pars
16c50 65 55 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65  eUri(zVfs, zFile
16c60 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64  name, &flags, &d
16c70 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c  b->pVfs, &zOpen,
16c80 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   &zErrMsg);.  if
16c90 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
16ca0 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
16cb0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62  QLITE_NOMEM ) db
16cc0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
16cd0 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   1;.    sqlite3E
16ce0 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
16cf0 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25  rc, zErrMsg ? "%
16d00 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29  s" : 0, zErrMsg)
16d10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
16d20 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
16d30 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
16d40 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
16d50 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74   the backend dat
16d60 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a  abase driver */.
16d70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
16d80 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73  reeOpen(db->pVfs
16d90 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62  , zOpen, db, &db
16da0 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c  ->aDb[0].pBt, 0,
16db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16dc0 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
16dd0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
16de0 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21  N_DB);.  if( rc!
16df0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16e00 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16e10 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
16e20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
16e30 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
16e40 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
16e50 64 62 2c 20 72 63 29 3b 0a 20 20 20 20 67 6f 74  db, rc);.    got
16e60 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
16e70 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
16e80 45 6e 74 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Enter(db->aDb[0]
16e90 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62  .pBt);.  db->aDb
16ea0 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [0].pSchema = sq
16eb0 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
16ec0 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  b, db->aDb[0].pB
16ed0 74 29 3b 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  t);.  if( !db->m
16ee0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 45 4e  allocFailed ) EN
16ef0 43 28 64 62 29 20 3d 20 53 43 48 45 4d 41 5f 45  C(db) = SCHEMA_E
16f00 4e 43 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65  NC(db);.  sqlite
16f10 33 42 74 72 65 65 4c 65 61 76 65 28 64 62 2d 3e  3BtreeLeave(db->
16f20 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64  aDb[0].pBt);.  d
16f30 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d  b->aDb[1].pSchem
16f40 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d  a = sqlite3Schem
16f50 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20  aGet(db, 0);..  
16f60 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73  /* The default s
16f70 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20  afety_level for 
16f80 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
16f90 65 20 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72  e is 'full'; for
16fa0 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64   the temp.  ** d
16fb0 61 74 61 62 61 73 65 20 69 74 20 69 73 20 27 4e  atabase it is 'N
16fc0 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61 74 63 68  ONE'. This match
16fd0 65 73 20 74 68 65 20 70 61 67 65 72 20 6c 61 79  es the pager lay
16fe0 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20  er defaults.  . 
16ff0 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d   */.  db->aDb[0]
17000 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b  .zName = "main";
17010 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61  .  db->aDb[0].sa
17020 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a  fety_level = 3;.
17030 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61    db->aDb[1].zNa
17040 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64  me = "temp";.  d
17050 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79  b->aDb[1].safety
17060 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64  _level = 1;..  d
17070 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
17080 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20  E_MAGIC_OPEN;.  
17090 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
170a0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
170b0 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
170c0 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20  ..  /* Register 
170d0 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e  all built-in fun
170e0 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e  ctions, but do n
170f0 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65  ot attempt to re
17100 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  ad the.  ** data
17110 62 61 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e  base schema yet.
17120 20 54 68 69 73 20 69 73 20 64 65 6c 61 79 65 64   This is delayed
17130 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74   until the first
17140 20 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61   time the databa
17150 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73  se.  ** is acces
17160 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  sed..  */.  sqli
17170 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
17180 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74  ITE_OK);.  sqlit
17190 65 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69  e3RegisterBuilti
171a0 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a  nFunctions(db);.
171b0 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d  .  /* Load autom
171c0 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20  atic extensions 
171d0 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61  - extensions tha
171e0 74 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69  t have been regi
171f0 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e  stered.  ** usin
17200 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75  g the sqlite3_au
17210 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f  tomatic_extensio
17220 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20  n() API..  */.  
17230 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
17240 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20  code(db);.  if( 
17250 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17260 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f  .    sqlite3Auto
17270 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64  LoadExtensions(d
17280 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  b);.    rc = sql
17290 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
172a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
172b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
172c0 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
172d0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66  ;.    }.  }..#if
172e0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
172f0 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62  E_FTS1.  if( !db
17300 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17310 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74  {.    extern int
17320 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
17330 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20  (sqlite3*);.    
17340 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31  rc = sqlite3Fts1
17350 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
17360 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
17370 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a  ITE_ENABLE_FTS2.
17380 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
17390 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
173a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
173b0 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74  extern int sqlit
173c0 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74  e3Fts2Init(sqlit
173d0 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  e3*);.    rc = s
173e0 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64  qlite3Fts2Init(d
173f0 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
17400 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17410 41 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20  ABLE_FTS3.  if( 
17420 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
17430 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  d && rc==SQLITE_
17440 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
17450 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28 64  qlite3Fts3Init(d
17460 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
17470 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
17480 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21  ABLE_ICU.  if( !
17490 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
174a0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
174b0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
174c0 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29  lite3IcuInit(db)
174d0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
174e0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
174f0 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21  LE_RTREE.  if( !
17500 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
17510 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
17520 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  K){.    rc = sql
17530 69 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62  ite3RtreeInit(db
17540 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
17550 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46   /* -DSQLITE_DEF
17560 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
17570 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53  E=1 makes EXCLUS
17580 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74 20  IVE the default 
17590 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64  locking.  ** mod
175a0 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46  e.  -DSQLITE_DEF
175b0 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
175c0 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20  E=0 make NORMAL 
175d0 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
175e0 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
175f0 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74  Doing nothing at
17600 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20   all also makes 
17610 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75  NORMAL the defau
17620 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20  lt..  */.#ifdef 
17630 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
17640 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62  OCKING_MODE.  db
17650 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d  ->dfltLockMode =
17660 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
17670 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20  LOCKING_MODE;.  
17680 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b  sqlite3PagerLock
17690 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42  ingMode(sqlite3B
176a0 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44  treePager(db->aD
176b0 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20  b[0].pBt),.     
176c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176d0 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41       SQLITE_DEFA
176e0 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
176f0 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28  );.#endif..  if(
17700 20 72 63 20 29 20 73 71 6c 69 74 65 33 45 72 72   rc ) sqlite3Err
17710 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f  or(db, rc);..  /
17720 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f  * Enable the loo
17730 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75  kaside-malloc su
17740 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74  bsystem */.  set
17750 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20  upLookaside(db, 
17760 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  0, sqlite3Global
17770 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69  Config.szLookasi
17780 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  de,.            
17790 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
177a0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
177b0 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20  nLookaside);..  
177c0 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
177d0 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53  checkpoint(db, S
177e0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41  QLITE_DEFAULT_WA
177f0 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54  L_AUTOCHECKPOINT
17800 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a  );..opendb_out:.
17810 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
17820 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20 64 62 20  Open);.  if( db 
17830 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64  ){.    assert( d
17840 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69  b->mutex!=0 || i
17850 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20 7c  sThreadsafe==0 |
17860 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  | sqlite3GlobalC
17870 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
17880 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ==0 );.    sqlit
17890 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
178a0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20  b->mutex);.  }. 
178b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72   rc = sqlite3_er
178c0 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73 73  rcode(db);.  ass
178d0 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72 63  ert( db!=0 || rc
178e0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
178f0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
17900 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
17910 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
17920 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  );.    db = 0;. 
17930 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53   }else if( rc!=S
17940 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17950 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
17960 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20  TE_MAGIC_SICK;. 
17970 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b   }.  *ppDb = db;
17980 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
17990 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69  NABLE_SQLLOG.  i
179a0 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
179b0 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29  Config.xSqllog )
179c0 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67  {.    /* Opening
179d0 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f   a db handle. Fo
179e0 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69  urth parameter i
179f0 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20  s passed 0. */. 
17a00 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20     void *pArg = 
17a10 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17a20 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a  fig.pSqllogArg;.
17a30 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
17a40 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28  lConfig.xSqllog(
17a50 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e  pArg, db, zFilen
17a60 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  ame, 0);.  }.#en
17a70 64 69 66 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  dif.  return sql
17a80 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20 72  ite3ApiExit(0, r
17a90 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  c);.}../*.** Ope
17aa0 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
17ab0 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   handle..*/.int 
17ac0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20  sqlite3_open(.  
17ad0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
17ae0 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65  ename, .  sqlite
17af0 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72  3 **ppDb .){.  r
17b00 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61  eturn openDataba
17b10 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70  se(zFilename, pp
17b20 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
17b30 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
17b40 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
17b50 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
17b60 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20  EATE, 0);.}.int 
17b70 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
17b80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66  .  const char *f
17b90 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61  ilename,   /* Da
17ba0 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
17bb0 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c  (UTF-8) */.  sql
17bc0 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20  ite3 **ppDb,    
17bd0 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c       /* OUT: SQL
17be0 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f  ite db handle */
17bf0 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20  .  int flags,   
17c00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c             /* Fl
17c10 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ags */.  const c
17c20 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20  har *zVfs       
17c30 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20   /* Name of VFS 
17c40 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f  module to use */
17c50 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65  .){.  return ope
17c60 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61  nDatabase(filena
17c70 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e 73 69 67  me, ppDb, (unsig
17c80 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 20 7a  ned int)flags, z
17c90 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  Vfs);.}..#ifndef
17ca0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
17cb0 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  16./*.** Open a 
17cc0 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
17cd0 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
17ce0 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f  te3_open16(.  co
17cf0 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e  nst void *zFilen
17d00 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20  ame, .  sqlite3 
17d10 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61 72  **ppDb.){.  char
17d20 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d   const *zFilenam
17d30 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61  e8;   /* zFilena
17d40 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54  me encoded in UT
17d50 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20 55  F-8 instead of U
17d60 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74  TF-16 */.  sqlit
17d70 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a  e3_value *pVal;.
17d80 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65    int rc;..#ifde
17d90 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
17da0 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
17db0 70 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e  ppDb==0 ) return
17dc0 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
17dd0 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70  KPT;.#endif.  *p
17de0 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  pDb = 0;.#ifndef
17df0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
17e00 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c  OINIT.  rc = sql
17e10 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
17e20 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
17e30 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
17e40 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d    if( zFilename=
17e50 3d 30 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  =0 ) zFilename =
17e60 20 22 5c 30 30 30 5c 30 30 30 22 3b 0a 20 20 70   "\000\000";.  p
17e70 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
17e80 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69  ueNew(0);.  sqli
17e90 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
17ea0 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  Val, -1, zFilena
17eb0 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  me, SQLITE_UTF16
17ec0 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53  NATIVE, SQLITE_S
17ed0 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e  TATIC);.  zFilen
17ee0 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61  ame8 = sqlite3Va
17ef0 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
17f00 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66  LITE_UTF8);.  if
17f10 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a  ( zFilename8 ){.
17f20 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74      rc = openDat
17f30 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38  abase(zFilename8
17f40 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
17f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
17f60 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
17f70 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
17f80 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20  N_CREATE, 0);.  
17f90 20 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20    assert( *ppDb 
17fa0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
17fb0 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72  MEM );.    if( r
17fc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
17fd0 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a  !DbHasProperty(*
17fe0 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65  ppDb, 0, DB_Sche
17ff0 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20  maLoaded) ){.   
18000 20 20 20 53 43 48 45 4d 41 5f 45 4e 43 28 2a 70     SCHEMA_ENC(*p
18010 70 44 62 29 20 3d 20 45 4e 43 28 2a 70 70 44 62  pDb) = ENC(*ppDb
18020 29 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ) = SQLITE_UTF16
18030 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d 0a 20 20  NATIVE;.    }.  
18040 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
18050 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
18060 7d 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65  }.  sqlite3Value
18070 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a 20 20 72  Free(pVal);..  r
18080 65 74 75 72 6e 20 73 71 6c 69 74 65 33 41 70 69  eturn sqlite3Api
18090 45 78 69 74 28 30 2c 20 72 63 29 3b 0a 7d 0a 23  Exit(0, rc);.}.#
180a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
180b0 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f  OMIT_UTF16 */../
180c0 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
180d0 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  new collation se
180e0 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20  quence with the 
180f0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
18100 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  db..*/.int sqlit
18110 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
18120 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  ion(.  sqlite3* 
18130 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
18140 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
18150 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
18160 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
18170 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
18180 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
18190 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
181a0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
181b0 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f  _create_collatio
181c0 6e 5f 76 32 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  n_v2(db, zName, 
181d0 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
181e0 61 72 65 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  are, 0);.}../*.*
181f0 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77  * Register a new
18200 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
18210 6e 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74  nce with the dat
18220 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e  abase handle db.
18230 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
18240 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e  create_collation
18250 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  _v2(.  sqlite3* 
18260 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  db, .  const cha
18270 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69 6e 74  r *zName, .  int
18280 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
18290 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
182a0 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
182b0 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
182c0 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20  const void*),.  
182d0 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64  void(*xDel)(void
182e0 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
182f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
18300 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
18310 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
18320 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
18330 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65  || zName==0 ) re
18340 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
18350 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
18360 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
18370 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
18380 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
18390 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
183a0 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f  .  rc = createCo
183b0 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
183c0 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78  e, (u8)enc, pCtx
183d0 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44 65 6c  , xCompare, xDel
183e0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
183f0 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
18400 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
18410 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
18420 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
18430 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
18440 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
18450 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
18460 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
18470 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
18480 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
18490 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
184a0 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
184b0 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 2a  on16(.  sqlite3*
184c0 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f   db, .  const vo
184d0 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74  id *zName,.  int
184e0 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a 20 70   enc, .  void* p
184f0 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d  Ctx,.  int(*xCom
18500 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  pare)(void*,int,
18510 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c  const void*,int,
18520 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a  const void*).){.
18530 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
18540 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 4e  E_OK;.  char *zN
18550 61 6d 65 38 3b 0a 0a 23 69 66 64 65 66 20 53 51  ame8;..#ifdef SQ
18560 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
18570 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
18580 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
18590 6b 28 64 62 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d  k(db) || zName==
185a0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
185b0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
185c0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
185d0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
185e0 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
185f0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
18600 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65 38 20  led );.  zName8 
18610 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f  = sqlite3Utf16to
18620 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d 31 2c  8(db, zName, -1,
18630 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
18640 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e 61 6d  IVE);.  if( zNam
18650 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 63  e8 ){.    rc = c
18660 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
18670 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38 29 65  b, zName8, (u8)e
18680 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
18690 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  re, 0);.    sqli
186a0 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 4e  te3DbFree(db, zN
186b0 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ame8);.  }.  rc 
186c0 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
186d0 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
186e0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
186f0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
18700 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69  turn rc;.}.#endi
18710 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
18720 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
18730 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c   Register a coll
18740 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
18750 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20  actory callback 
18760 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
18770 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20  e handle.** db. 
18780 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76  Replace any prev
18790 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64  iously installed
187a0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
187b0 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a  nce factory..*/.
187c0 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c  int sqlite3_coll
187d0 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a 20 20  ation_needed(.  
187e0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
187f0 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
18800 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
18810 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f 69 64  CollNeeded)(void
18820 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
18830 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 63 68  TextRep,const ch
18840 61 72 2a 29 0a 29 7b 0a 23 69 66 64 65 66 20 53  ar*).){.#ifdef S
18850 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
18860 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71  _ARMOR.  if( !sq
18870 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
18880 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e 20  Ok(db) ) return 
18890 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
188a0 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
188b0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
188c0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
188d0 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d  b->xCollNeeded =
188e0 20 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20   xCollNeeded;.  
188f0 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
18900 36 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f  6 = 0;.  db->pCo
18910 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43  llNeededArg = pC
18920 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20  ollNeededArg;.  
18930 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
18940 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
18950 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18960 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
18970 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
18980 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
18990 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  a collation sequ
189a0 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c  ence factory cal
189b0 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64  lback with the d
189c0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a  atabase handle.*
189d0 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e  * db. Replace an
189e0 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73  y previously ins
189f0 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e  talled collation
18a00 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
18a10 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
18a20 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64  3_collation_need
18a30 65 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  ed16(.  sqlite3 
18a40 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
18a50 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
18a60 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
18a70 65 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69  ed16)(void*,sqli
18a80 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65  te3*,int eTextRe
18a90 70 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  p,const void*).)
18aa0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
18ab0 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
18ac0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
18ad0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
18ae0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
18af0 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65  _MISUSE_BKPT;.#e
18b00 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
18b10 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
18b20 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f  utex);.  db->xCo
18b30 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20 20  llNeeded = 0;.  
18b40 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31  db->xCollNeeded1
18b50 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64 31  6 = xCollNeeded1
18b60 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65  6;.  db->pCollNe
18b70 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e  ededArg = pCollN
18b80 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69  eededArg;.  sqli
18b90 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
18ba0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
18bb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18bc0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
18bd0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
18be0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
18bf0 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
18c00 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
18c10 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20 61  tion is now an a
18c20 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20 75  nachronism. It u
18c30 73 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 74  sed to be used t
18c40 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20 61  o recover from a
18c50 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  .** malloc() fai
18c60 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74 65  lure, but SQLite
18c70 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20 61   now does this a
18c80 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f  utomatically..*/
18c90 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c 6f  .int sqlite3_glo
18ca0 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69 64  bal_recover(void
18cb0 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  ){.  return SQLI
18cc0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
18cd0 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73  ./*.** Test to s
18ce0 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ee whether or no
18cf0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  t the database c
18d00 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e 20  onnection is in 
18d10 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f  autocommit.** mo
18d20 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  de.  Return TRUE
18d30 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46 41   if it is and FA
18d40 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75 74  LSE if not.  Aut
18d50 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73 20  ocommit mode is 
18d60 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c 74  on.** by default
18d70 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69 73  .  Autocommit is
18d80 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20 42   disabled by a B
18d90 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20 61  EGIN statement a
18da0 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a 20  nd reenabled.** 
18db0 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d 4d  by the next COMM
18dc0 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a  IT or ROLLBACK..
18dd0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67  */.int sqlite3_g
18de0 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73 71  et_autocommit(sq
18df0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64  lite3 *db){.#ifd
18e00 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
18e10 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
18e20 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
18e30 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20  heckOk(db) ){.  
18e40 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d    (void)SQLITE_M
18e50 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20  ISUSE_BKPT;.    
18e60 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65  return 0;.  }.#e
18e70 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62  ndif.  return db
18e80 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a  ->autoCommit;.}.
18e90 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
18ea0 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 20 61 72  wing routines ar
18eb0 65 20 73 75 62 73 74 69 74 75 74 65 73 20 66 6f  e substitutes fo
18ec0 72 20 63 6f 6e 73 74 61 6e 74 73 20 53 51 4c 49  r constants SQLI
18ed0 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a 2a 20 53  TE_CORRUPT,.** S
18ee0 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 53 51  QLITE_MISUSE, SQ
18ef0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 53  LITE_CANTOPEN, S
18f00 51 4c 49 54 45 5f 49 4f 45 52 52 20 61 6e 64 20  QLITE_IOERR and 
18f10 70 6f 73 73 69 62 6c 79 20 6f 74 68 65 72 20 65  possibly other e
18f20 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74 61 6e 74  rror.** constant
18f30 73 2e 20 20 54 68 65 79 20 73 65 72 76 65 20 74  s.  They serve t
18f40 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a  wo purposes:.**.
18f50 2a 2a 20 20 20 31 2e 20 20 53 65 72 76 65 20 61  **   1.  Serve a
18f60 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 74 20 70  s a convenient p
18f70 6c 61 63 65 20 74 6f 20 73 65 74 20 61 20 62 72  lace to set a br
18f80 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61 20 64 65  eakpoint in a de
18f90 62 75 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20  bugger.**       
18fa0 74 6f 20 64 65 74 65 63 74 20 77 68 65 6e 20 76  to detect when v
18fb0 65 72 73 69 6f 6e 20 65 72 72 6f 72 20 63 6f 6e  ersion error con
18fc0 64 69 74 69 6f 6e 73 20 6f 63 63 75 72 73 2e 0a  ditions occurs..
18fd0 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49 6e 76 6f  **.**   2.  Invo
18fe0 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  ke sqlite3_log()
18ff0 20 74 6f 20 70 72 6f 76 69 64 65 20 74 68 65 20   to provide the 
19000 73 6f 75 72 63 65 20 63 6f 64 65 20 6c 6f 63 61  source code loca
19010 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a 20 20 20  tion where.**   
19020 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76 65 6c 20      a low-level 
19030 65 72 72 6f 72 20 69 73 20 66 69 72 73 74 20 64  error is first d
19040 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20  etected..*/.int 
19050 73 71 6c 69 74 65 33 43 6f 72 72 75 70 74 45 72  sqlite3CorruptEr
19060 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
19070 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
19080 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
19090 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
190a0 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
190b0 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20 20 20 20  _CORRUPT,.      
190c0 20 20 20 20 20 20 20 20 22 64 61 74 61 62 61 73          "databas
190d0 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 61 74 20  e corruption at 
190e0 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
190f0 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
19100 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
19110 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
19120 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
19130 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e  TE_CORRUPT;.}.in
19140 74 20 73 71 6c 69 74 65 33 4d 69 73 75 73 65 45  t sqlite3MisuseE
19150 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
19160 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
19170 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
19180 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
19190 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
191a0 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20 20 20 20  E_MISUSE, .     
191b0 20 20 20 20 20 20 20 20 20 22 6d 69 73 75 73 65           "misuse
191c0 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b   at line %d of [
191d0 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20  %.10s]",.       
191e0 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32         lineno, 2
191f0 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65  0+sqlite3_source
19200 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20  id());.  return 
19210 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 7d  SQLITE_MISUSE;.}
19220 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 61 6e 74  .int sqlite3Cant
19230 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74 20 6c 69  openError(int li
19240 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73  neno){.  testcas
19250 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  e( sqlite3Global
19260 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29  Config.xLog!=0 )
19270 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28  ;.  sqlite3_log(
19280 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 2c  SQLITE_CANTOPEN,
19290 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
192a0 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 66 69 6c  "cannot open fil
192b0 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20  e at line %d of 
192c0 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20  [%.10s]",.      
192d0 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20          lineno, 
192e0 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63  20+sqlite3_sourc
192f0 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e  eid());.  return
19300 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
19310 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51  ;.}...#ifndef SQ
19320 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43  LITE_OMIT_DEPREC
19330 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ATED./*.** This 
19340 69 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e 63 65  is a convenience
19350 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61   routine that ma
19360 6b 65 73 20 73 75 72 65 20 74 68 61 74 20 61 6c  kes sure that al
19370 6c 20 74 68 72 65 61 64 2d 73 70 65 63 69 66 69  l thread-specifi
19380 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72 20 74 68  c.** data for th
19390 69 73 20 74 68 72 65 61 64 20 68 61 73 20 62 65  is thread has be
193a0 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65 64 2e 0a  en deallocated..
193b0 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20 6e 6f 20  **.** SQLite no 
193c0 6c 6f 6e 67 65 72 20 75 73 65 73 20 74 68 72 65  longer uses thre
193d0 61 64 2d 73 70 65 63 69 66 69 63 20 64 61 74 61  ad-specific data
193e0 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   so this routine
193f0 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d   is now a.** no-
19400 6f 70 2e 20 20 49 74 20 69 73 20 72 65 74 61 69  op.  It is retai
19410 6e 65 64 20 66 6f 72 20 68 69 73 74 6f 72 69 63  ned for historic
19420 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  al compatibility
19430 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
19440 33 5f 74 68 72 65 61 64 5f 63 6c 65 61 6e 75 70  3_thread_cleanup
19450 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e 64 69 66  (void){.}.#endif
19460 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 6d  ../*.** Return m
19470 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
19480 61 62 6f 75 74 20 61 20 73 70 65 63 69 66 69 63  about a specific
19490 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20 64 61 74   column of a dat
194a0 61 62 61 73 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  abase table..** 
194b0 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73  See comment in s
194c0 71 6c 69 74 65 33 2e 68 20 28 73 71 6c 69 74 65  qlite3.h (sqlite
194d0 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65 74 61 69  .h.in) for detai
194e0 6c 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ls..*/.int sqlit
194f0 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
19500 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69  metadata(.  sqli
19510 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
19520 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
19530 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a  ction handle */.
19540 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
19550 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  bName,        /*
19560 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f   Database name o
19570 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
19580 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61  t char *zTableNa
19590 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  me,     /* Table
195a0 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   name */.  const
195b0 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61   char *zColumnNa
195c0 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  me,    /* Column
195d0 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20   name */.  char 
195e0 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79  const **pzDataTy
195f0 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  pe,    /* OUTPUT
19600 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20  : Declared data 
19610 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  type */.  char c
19620 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71  onst **pzCollSeq
19630 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  ,     /* OUTPUT:
19640 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
19650 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nce name */.  in
19660 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20  t *pNotNull,    
19670 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
19680 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54  PUT: True if NOT
19690 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
196a0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74   exists */.  int
196b0 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20   *pPrimaryKey,  
196c0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
196d0 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
196e0 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f  mn part of PK */
196f0 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63  .  int *pAutoinc
19700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
19710 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
19720 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f  f column is auto
19730 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b  -increment */.){
19740 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
19750 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
19760 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
19770 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  0;.  Column *pCo
19780 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  l = 0;.  int iCo
19790 6c 20 3d 20 30 3b 0a 0a 20 20 63 68 61 72 20 63  l = 0;..  char c
197a0 6f 6e 73 74 20 2a 7a 44 61 74 61 54 79 70 65 20  onst *zDataType 
197b0 3d 20 30 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73  = 0;.  char cons
197c0 74 20 2a 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b  t *zCollSeq = 0;
197d0 0a 20 20 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d  .  int notnull =
197e0 20 30 3b 0a 20 20 69 6e 74 20 70 72 69 6d 61 72   0;.  int primar
197f0 79 6b 65 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  ykey = 0;.  int 
19800 61 75 74 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20 20  autoinc = 0;..  
19810 2f 2a 20 45 6e 73 75 72 65 20 74 68 65 20 64 61  /* Ensure the da
19820 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61  tabase schema ha
19830 73 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f  s been loaded */
19840 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
19850 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
19860 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
19870 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
19880 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 6e 69   rc = sqlite3Ini
19890 74 28 64 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b  t(db, &zErrMsg);
198a0 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
198b0 21 3d 72 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f  !=rc ){.    goto
198c0 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a   error_out;.  }.
198d0 0a 20 20 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65  .  /* Locate the
198e0 20 74 61 62 6c 65 20 69 6e 20 71 75 65 73 74 69   table in questi
198f0 6f 6e 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73  on */.  pTab = s
19900 71 6c 69 74 65 33 46 69 6e 64 54 61 62 6c 65 28  qlite3FindTable(
19910 64 62 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20  db, zTableName, 
19920 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zDbName);.  if( 
19930 21 70 54 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70  !pTab || pTab->p
19940 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 70 54  Select ){.    pT
19950 61 62 20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f  ab = 0;.    goto
19960 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a   error_out;.  }.
19970 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20 63  .  /* Find the c
19980 6f 6c 75 6d 6e 20 66 6f 72 20 77 68 69 63 68 20  olumn for which 
19990 69 6e 66 6f 20 69 73 20 72 65 71 75 65 73 74 65  info is requeste
199a0 64 20 2a 2f 0a 20 20 69 66 28 20 7a 43 6f 6c 75  d */.  if( zColu
199b0 6d 6e 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  mnName==0 ){.   
199c0 20 2f 2a 20 51 75 65 72 79 20 66 6f 72 20 65 78   /* Query for ex
199d0 69 73 74 61 6e 63 65 20 6f 66 20 74 61 62 6c 65  istance of table
199e0 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 65 6c 73 65   only */.  }else
199f0 7b 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30  {.    for(iCol=0
19a00 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f  ; iCol<pTab->nCo
19a10 6c 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  l; iCol++){.    
19a20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e    pCol = &pTab->
19a30 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20  aCol[iCol];.    
19a40 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33    if( 0==sqlite3
19a50 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  StrICmp(pCol->zN
19a60 61 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  ame, zColumnName
19a70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
19a80 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
19a90 7d 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d  }.    if( iCol==
19aa0 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20  pTab->nCol ){.  
19ab0 20 20 20 20 69 66 28 20 48 61 73 52 6f 77 69 64      if( HasRowid
19ac0 28 70 54 61 62 29 20 26 26 20 73 71 6c 69 74 65  (pTab) && sqlite
19ad0 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e  3IsRowid(zColumn
19ae0 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20 20 20  Name) ){.       
19af0 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69 50   iCol = pTab->iP
19b00 4b 65 79 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  Key;.        pCo
19b10 6c 20 3d 20 69 43 6f 6c 3e 3d 30 20 3f 20 26 70  l = iCol>=0 ? &p
19b20 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 20  Tab->aCol[iCol] 
19b30 3a 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  : 0;.      }else
19b40 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20 3d  {.        pTab =
19b50 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   0;.        goto
19b60 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20   error_out;.    
19b70 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
19b80 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
19b90 67 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74  g block stores t
19ba0 68 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  he meta informat
19bb0 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65  ion that will be
19bc0 20 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74   returned.  ** t
19bd0 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20  o the caller in 
19be0 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20  local variables 
19bf0 7a 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c  zDataType, zColl
19c00 53 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72  Seq, notnull, pr
19c10 69 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e  imarykey.  ** an
19c20 64 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68  d autoinc. At th
19c30 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61  is point there a
19c40 72 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69  re two possibili
19c50 74 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a  ties:.  ** .  **
19c60 20 20 20 20 20 31 2e 20 54 68 65 20 73 70 65 63       1. The spec
19c70 69 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ified column nam
19c80 65 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f  e was rowid", "o
19c90 69 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22  id" or "_rowid_"
19ca0 20 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e   .  **        an
19cb0 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78  d there is no ex
19cc0 70 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65  plicitly declare
19cd0 64 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20  d IPK column. . 
19ce0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20   **.  **     2. 
19cf0 54 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74  The table is not
19d00 20 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20   a view and the 
19d10 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e  column name iden
19d20 74 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20  tified an .  ** 
19d30 20 20 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c         explicitl
19d40 79 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d  y declared colum
19d50 6e 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66  n. Copy meta inf
19d60 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70  ormation from *p
19d70 43 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28  Col..  */ .  if(
19d80 20 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61   pCol ){.    zDa
19d90 74 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a  taType = pCol->z
19da0 54 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53  Type;.    zCollS
19db0 65 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c  eq = pCol->zColl
19dc0 3b 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20  ;.    notnull = 
19dd0 70 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30  pCol->notNull!=0
19de0 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79  ;.    primarykey
19df0 20 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c    = (pCol->colFl
19e00 61 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52  ags & COLFLAG_PR
19e10 49 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61  IMKEY)!=0;.    a
19e20 75 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69  utoinc = pTab->i
19e30 50 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70  PKey==iCol && (p
19e40 54 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20  Tab->tabFlags & 
19e50 54 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74  TF_Autoincrement
19e60 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )!=0;.  }else{. 
19e70 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22     zDataType = "
19e80 49 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72  INTEGER";.    pr
19e90 69 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20  imarykey = 1;.  
19ea0 7d 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65  }.  if( !zCollSe
19eb0 71 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65  q ){.    zCollSe
19ec0 71 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20  q = "BINARY";.  
19ed0 7d 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20  }..error_out:.  
19ee0 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76  sqlite3BtreeLeav
19ef0 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20  eAll(db);..  /* 
19f00 57 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63  Whether the func
19f10 74 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65  tion call succee
19f20 64 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73  ded or failed, s
19f30 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61  et the output pa
19f40 72 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f  rameters.  ** to
19f50 20 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20   whatever their 
19f60 6c 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72  local counterpar
19f70 74 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61  ts contain. If a
19f80 6e 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75  n error did occu
19f90 72 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73  r,.  ** this has
19fa0 20 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a   the effect of z
19fb0 65 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75  eroing all outpu
19fc0 74 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20  t parameters..  
19fd0 2a 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54  */.  if( pzDataT
19fe0 79 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70  ype ) *pzDataTyp
19ff0 65 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20  e = zDataType;. 
1a000 20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29   if( pzCollSeq )
1a010 20 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43   *pzCollSeq = zC
1a020 6f 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e  ollSeq;.  if( pN
1a030 6f 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75  otNull ) *pNotNu
1a040 6c 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20  ll = notnull;.  
1a050 69 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20  if( pPrimaryKey 
1a060 29 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d  ) *pPrimaryKey =
1a070 20 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69   primarykey;.  i
1a080 66 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70  f( pAutoinc ) *p
1a090 41 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e  Autoinc = autoin
1a0a0 63 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  c;..  if( SQLITE
1a0b0 5f 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62  _OK==rc && !pTab
1a0c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44   ){.    sqlite3D
1a0d0 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73  bFree(db, zErrMs
1a0e0 67 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20  g);.    zErrMsg 
1a0f0 3d 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66  = sqlite3MPrintf
1a100 28 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61  (db, "no such ta
1a110 62 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25  ble column: %s.%
1a120 73 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a  s", zTableName,.
1a130 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e          zColumnN
1a140 61 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  ame);.    rc = S
1a150 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
1a160 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57  .  sqlite3ErrorW
1a170 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 28  ithMsg(db, rc, (
1a180 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c  zErrMsg?"%s":0),
1a190 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c   zErrMsg);.  sql
1a1a0 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a  ite3DbFree(db, z
1a1b0 45 72 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20  ErrMsg);.  rc = 
1a1c0 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
1a1d0 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
1a1e0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1a1f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
1a200 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a210 53 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74  Sleep for a litt
1a220 6c 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72  le while.  Retur
1a230 6e 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20  n the amount of 
1a240 74 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69  time slept..*/.i
1a250 6e 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70  nt sqlite3_sleep
1a260 28 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69  (int ms){.  sqli
1a270 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20  te3_vfs *pVfs;. 
1a280 20 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20   int rc;.  pVfs 
1a290 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
1a2a0 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66  nd(0);.  if( pVf
1a2b0 73 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  s==0 ) return 0;
1a2c0 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63  ..  /* This func
1a2d0 74 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69  tion works in mi
1a2e0 6c 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20  lliseconds, but 
1a2f0 74 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f  the underlying O
1a300 73 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41  sSleep() .  ** A
1a310 50 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63  PI uses microsec
1a320 6f 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20  onds. Hence the 
1a330 31 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72  1000's..  */.  r
1a340 63 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c  c = (sqlite3OsSl
1a350 65 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d  eep(pVfs, 1000*m
1a360 73 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75  s)/1000);.  retu
1a370 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1a380 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c  Enable or disabl
1a390 65 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72  e the extended r
1a3a0 65 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a  esult codes..*/.
1a3b0 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65  int sqlite3_exte
1a3c0 6e 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65  nded_result_code
1a3d0 73 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69  s(sqlite3 *db, i
1a3e0 6e 74 20 6f 6e 6f 66 66 29 7b 0a 23 69 66 64 65  nt onoff){.#ifde
1a3f0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1a400 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1a410 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1a420 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75  eckOk(db) ) retu
1a430 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
1a440 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20  _BKPT;.#endif.  
1a450 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1a460 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
1a470 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20    db->errMask = 
1a480 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66 66  onoff ? 0xffffff
1a490 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71 6c  ff : 0xff;.  sql
1a4a0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
1a4b0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
1a4c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1a4d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
1a4e0 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72 6f   the xFileContro
1a4f0 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70 61  l method on a pa
1a500 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61 73  rticular databas
1a510 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
1a520 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73  3_file_control(s
1a530 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73  qlite3 *db, cons
1a540 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c  t char *zDbName,
1a550 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70   int op, void *p
1a560 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  Arg){.  int rc =
1a570 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
1a580 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b 0a   Btree *pBtree;.
1a590 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1a5a0 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
1a5b0 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
1a5c0 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
1a5d0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
1a5e0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e  MISUSE_BKPT;.#en
1a5f0 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  dif.  sqlite3_mu
1a600 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
1a610 74 65 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d  tex);.  pBtree =
1a620 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f   sqlite3DbNameTo
1a630 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d  Btree(db, zDbNam
1a640 65 29 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65  e);.  if( pBtree
1a650 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
1a660 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
1a670 65 33 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20  e3_file *fd;.   
1a680 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
1a690 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20  er(pBtree);.    
1a6a0 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33  pPager = sqlite3
1a6b0 42 74 72 65 65 50 61 67 65 72 28 70 42 74 72 65  BtreePager(pBtre
1a6c0 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  e);.    assert( 
1a6d0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20  pPager!=0 );.   
1a6e0 20 66 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67   fd = sqlite3Pag
1a6f0 65 72 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a  erFile(pPager);.
1a700 20 20 20 20 61 73 73 65 72 74 28 20 66 64 21 3d      assert( fd!=
1a710 30 20 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d  0 );.    if( op=
1a720 3d 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49  =SQLITE_FCNTL_FI
1a730 4c 45 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20  LE_POINTER ){.  
1a740 20 20 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69      *(sqlite3_fi
1a750 6c 65 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a  le**)pArg = fd;.
1a760 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1a770 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20  E_OK;.    }else 
1a780 69 66 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73  if( fd->pMethods
1a790 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1a7a0 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
1a7b0 72 6f 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67  rol(fd, op, pArg
1a7c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1a7d0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1a7e0 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a  NOTFOUND;.    }.
1a7f0 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
1a800 4c 65 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20  Leave(pBtree);. 
1a810 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1a820 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1a830 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
1a840 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  ;   .}../*.** In
1a850 74 65 72 66 61 63 65 20 74 6f 20 74 68 65 20 74  terface to the t
1a860 65 73 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f  esting logic..*/
1a870 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73  .int sqlite3_tes
1a880 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70  t_control(int op
1a890 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63  , ...){.  int rc
1a8a0 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
1a8b0 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49  LITE_OMIT_BUILTI
1a8c0 4e 5f 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74  N_TEST.  va_list
1a8d0 20 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28   ap;.  va_start(
1a8e0 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63  ap, op);.  switc
1a8f0 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a  h( op ){..    /*
1a900 0a 20 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65  .    ** Save the
1a910 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f   current state o
1a920 66 20 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20  f the PRNG..    
1a930 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1a940 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
1a950 5f 53 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73  _SAVE: {.      s
1a960 71 6c 69 74 65 33 50 72 6e 67 53 61 76 65 53 74  qlite3PrngSaveSt
1a970 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
1a980 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1a990 2a 0a 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65  *.    ** Restore
1a9a0 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
1a9b0 65 20 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61  e PRNG to the la
1a9c0 73 74 20 73 74 61 74 65 20 73 61 76 65 64 20 75  st state saved u
1a9d0 73 69 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47  sing.    ** PRNG
1a9e0 5f 53 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f  _SAVE.  If PRNG_
1a9f0 53 41 56 45 20 68 61 73 20 6e 65 76 65 72 20 62  SAVE has never b
1aa00 65 66 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65  efore been calle
1aa10 64 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74  d, then.    ** t
1aa20 68 69 73 20 76 65 72 62 20 61 63 74 73 20 6c 69  his verb acts li
1aa30 6b 65 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20  ke PRNG_RESET.. 
1aa40 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1aa50 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
1aa60 52 4e 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20  RNG_RESTORE: {. 
1aa70 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67       sqlite3Prng
1aa80 52 65 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a  RestoreState();.
1aa90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1aaa0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
1aab0 2a 20 52 65 73 65 74 20 74 68 65 20 50 52 4e 47  * Reset the PRNG
1aac0 20 62 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69   back to its uni
1aad0 6e 69 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65  nitialized state
1aae0 2e 20 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c  .  The next call
1aaf0 0a 20 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  .    ** to sqlit
1ab00 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20  e3_randomness() 
1ab10 77 69 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20  will reseed the 
1ab20 50 52 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e  PRNG using a sin
1ab30 67 6c 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20  gle call.    ** 
1ab40 74 6f 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65  to the xRandomne
1ab50 73 73 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65  ss method of the
1ab60 20 64 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20   default VFS..  
1ab70 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1ab80 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
1ab90 4e 47 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20  NG_RESET: {.    
1aba0 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d    sqlite3_random
1abb0 6e 65 73 73 28 30 2c 30 29 3b 0a 20 20 20 20 20  ness(0,0);.     
1abc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1abd0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
1abe0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1abf0 6f 6c 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20  ol(BITVEC_TEST, 
1ac00 73 69 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20  size, program). 
1ac10 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e     **.    ** Run
1ac20 20 61 20 74 65 73 74 20 61 67 61 69 6e 73 74 20   a test against 
1ac30 61 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20  a Bitvec object 
1ac40 6f 66 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72  of size.  The pr
1ac50 6f 67 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20  ogram argument. 
1ac60 20 20 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61     ** is an arra
1ac70 79 20 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68  y of integers th
1ac80 61 74 20 64 65 66 69 6e 65 73 20 74 68 65 20 74  at defines the t
1ac90 65 73 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  est.  Return -1 
1aca0 6f 6e 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f  on a.    ** memo
1acb0 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72  ry allocation er
1acc0 72 6f 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73  ror, 0 on succes
1acd0 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66  s, or non-zero f
1ace0 6f 72 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20  or an error..   
1acf0 20 2a 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69   ** See the sqli
1ad00 74 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e  te3BitvecBuiltin
1ad10 54 65 73 74 28 29 20 66 6f 72 20 61 64 64 69 74  Test() for addit
1ad20 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
1ad30 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
1ad40 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1ad50 52 4c 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20  RL_BITVEC_TEST: 
1ad60 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  {.      int sz =
1ad70 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1ad80 3b 0a 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72  ;.      int *aPr
1ad90 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  og = va_arg(ap, 
1ada0 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20  int*);.      rc 
1adb0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42  = sqlite3BitvecB
1adc0 75 69 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61  uiltinTest(sz, a
1add0 50 72 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65  Prog);.      bre
1ade0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1adf0 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1ae00 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46  3_test_control(F
1ae10 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43  AULT_INSTALL, xC
1ae20 61 6c 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a  allback).    **.
1ae30 20 20 20 20 2a 2a 20 41 72 72 61 6e 67 65 20 74      ** Arrange t
1ae40 6f 20 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61  o invoke xCallba
1ae50 63 6b 28 29 20 77 68 65 6e 65 76 65 72 20 73 71  ck() whenever sq
1ae60 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20  lite3FaultSim() 
1ae70 69 73 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a  is called,.    *
1ae80 2a 20 69 66 20 78 43 61 6c 6c 62 61 63 6b 20 69  * if xCallback i
1ae90 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20  s not NULL..    
1aea0 2a 2a 0a 20 20 20 20 2a 2a 20 41 73 20 61 20 74  **.    ** As a t
1aeb0 65 73 74 20 6f 66 20 74 68 65 20 66 61 75 6c 74  est of the fault
1aec0 20 73 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61   simulator mecha
1aed0 6e 69 73 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c  nism itself, sql
1aee0 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29 0a  ite3FaultSim(0).
1aef0 20 20 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64      ** is called
1af00 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   immediately aft
1af10 65 72 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68  er installing th
1af20 65 20 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20 61  e new callback a
1af30 6e 64 20 74 68 65 20 72 65 74 75 72 6e 0a 20 20  nd the return.  
1af40 20 20 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20    ** value from 
1af50 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
1af60 30 29 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72  0) becomes the r
1af70 65 74 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a  eturn from.    *
1af80 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
1af90 6f 6e 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f  ontrol()..    */
1afa0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1afb0 5f 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f  _TESTCTRL_FAULT_
1afc0 49 4e 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20  INSTALL: {.     
1afd0 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b   /* MSVC is pick
1afe0 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20  y about pulling 
1aff0 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76  func ptrs from v
1b000 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a  a lists..      *
1b010 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74  * http://support
1b020 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b  .microsoft.com/k
1b030 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a  b/47961.      **
1b040 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1b050 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61  nfig.xTestCallba
1b060 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ck = va_arg(ap, 
1b070 69 6e 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20 20  int(*)(int));.  
1b080 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70      */.      typ
1b090 65 64 65 66 20 69 6e 74 28 2a 54 45 53 54 43 41  edef int(*TESTCA
1b0a0 4c 4c 42 41 43 4b 46 55 4e 43 5f 74 29 28 69 6e  LLBACKFUNC_t)(in
1b0b0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
1b0c0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54  3GlobalConfig.xT
1b0d0 65 73 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61  estCallback = va
1b0e0 5f 61 72 67 28 61 70 2c 20 54 45 53 54 43 41 4c  _arg(ap, TESTCAL
1b0f0 4c 42 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20 20  LBACKFUNC_t);.  
1b100 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b110 46 61 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20 20  FaultSim(0);.   
1b120 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1b130 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1b140 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1b150 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c  trol(BENIGN_MALL
1b160 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e  OC_HOOKS, xBegin
1b170 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20  , xEnd).    **. 
1b180 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68     ** Register h
1b190 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20  ooks to call to 
1b1a0 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 6d  indicate which m
1b1b0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73  alloc() failures
1b1c0 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e   .    ** are ben
1b1d0 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ign..    */.    
1b1e0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1b1f0 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c  CTRL_BENIGN_MALL
1b200 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20  OC_HOOKS: {.    
1b210 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28    typedef void (
1b220 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28  *void_function)(
1b230 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69  void);.      voi
1b240 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69  d_function xBeni
1b250 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76  gnBegin;.      v
1b260 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65  oid_function xBe
1b270 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78  nignEnd;.      x
1b280 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61  BenignBegin = va
1b290 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75  _arg(ap, void_fu
1b2a0 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78  nction);.      x
1b2b0 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61  BenignEnd = va_a
1b2c0 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63  rg(ap, void_func
1b2d0 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  tion);.      sql
1b2e0 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  ite3BenignMalloc
1b2f0 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67  Hooks(xBenignBeg
1b300 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b  in, xBenignEnd);
1b310 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b320 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1b330 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
1b340 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1b350 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
1b360 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20  _BYTE, unsigned 
1b370 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
1b380 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e    ** Set the PEN
1b390 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65  DING byte to the
1b3a0 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72   value in the ar
1b3b0 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a  gument, if X>0..
1b3c0 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63      ** Make no c
1b3d0 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20  hanges if X==0. 
1b3e0 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
1b3f0 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  e of the pending
1b400 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20   byte.    ** as 
1b410 69 74 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f  it existing befo
1b420 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
1b430 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20  was called..    
1b440 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54  **.    ** IMPORT
1b450 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74  ANT:  Changing t
1b460 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20  he PENDING byte 
1b470 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20  from 0x40000000 
1b480 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a  results in.    *
1b490 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  * an incompatibl
1b4a0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b4b0 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e  format.  Changin
1b4c0 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
1b4d0 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  te.    ** while 
1b4e0 61 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e  any database con
1b4f0 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  nection is open 
1b500 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66  results in undef
1b510 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ined and.    ** 
1b520 64 65 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61  deleterious beha
1b530 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  vior..    */.   
1b540 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1b550 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59  TCTRL_PENDING_BY
1b560 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  TE: {.      rc =
1b570 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23   PENDING_BYTE;.#
1b580 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1b590 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20  IT_WSD.      {. 
1b5a0 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
1b5b0 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f  int newVal = va_
1b5c0 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64  arg(ap, unsigned
1b5d0 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69   int);.        i
1b5e0 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69  f( newVal ) sqli
1b5f0 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d  te3PendingByte =
1b600 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d   newVal;.      }
1b610 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
1b620 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1b630 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
1b640 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1b650 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1b660 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20  ASSERT, int X). 
1b670 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
1b680 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  s action provide
1b690 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  s a run-time tes
1b6a0 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72  t to see whether
1b6b0 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61   or not.    ** a
1b6c0 73 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62  ssert() was enab
1b6d0 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
1b6e0 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  ime.  If X is tr
1b6f0 75 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a  ue and assert().
1b700 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65      ** is enable
1b710 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
1b720 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65  rn value is true
1b730 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20  .  If X is true 
1b740 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72  and.    ** asser
1b750 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c  t() is disabled,
1b760 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
1b770 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20   value is zero. 
1b780 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20   If X is.    ** 
1b790 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74  false and assert
1b7a0 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  () is enabled, t
1b7b0 68 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f  hen the assertio
1b7c0 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a  n fires and the.
1b7d0 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
1b7e0 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20  borts.  If X is 
1b7f0 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74  false and assert
1b800 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
1b810 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
1b820 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1b830 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  zero..    */.   
1b840 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1b850 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a  TCTRL_ASSERT: {.
1b860 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69        volatile i
1b870 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt x = 0;.      
1b880 61 73 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f  assert( (x = va_
1b890 61 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20  arg(ap,int))!=0 
1b8a0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b  );.      rc = x;
1b8b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b8c0 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20    }...    /*.   
1b8d0 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
1b8e0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1b8f0 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
1b900 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  , int X).    **.
1b910 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69      ** This acti
1b920 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75  on provides a ru
1b930 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73  n-time test to s
1b940 65 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59  ee how the ALWAY
1b950 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56  S and.    ** NEV
1b960 45 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64  ER macros were d
1b970 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c  efined at compil
1b980 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20  e-time..    **. 
1b990 20 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e     ** The return
1b9a0 20 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53   value is ALWAYS
1b9b0 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  (X).  .    **.  
1b9c0 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65    ** The recomme
1b9d0 6e 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d  nded test is X==
1b9e0 32 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  2.  If the retur
1b9f0 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68  n value is 2, th
1ba00 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  at means.    ** 
1ba10 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
1ba20 45 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f  ER() are both no
1ba30 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
1ba40 20 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69   macros, which i
1ba50 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  s the.    ** def
1ba60 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49  ault setting.  I
1ba70 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
1ba80 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c  ue is 1, then AL
1ba90 57 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72  WAYS() is either
1baa0 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64  .    ** hard-cod
1bab0 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c  ed to true or el
1bac0 73 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66  se it asserts if
1bad0 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73   its argument is
1bae0 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54   false..    ** T
1baf0 68 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f  he first behavio
1bb00 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f  r (hard-coded to
1bb10 20 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61   true) is the ca
1bb20 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c  se if.    ** SQL
1bb30 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
1bb40 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61  ERT shows that a
1bb50 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
1bb60 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f  led and the seco
1bb70 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69  nd.    ** behavi
1bb80 6f 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68  or (assert if th
1bb90 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c  e argument to AL
1bba0 57 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29  WAYS() is false)
1bbb0 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a   is the case if.
1bbc0 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45      ** SQLITE_TE
1bbd0 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68  STCTRL_ASSERT sh
1bbe0 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28  ows that assert(
1bbf0 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20  ) is enabled..  
1bc00 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1bc10 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72  run-time test pr
1bc20 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f  ocedure might lo
1bc30 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ok something lik
1bc40 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
1bc50 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c     **    if( sql
1bc60 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1bc70 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1bc80 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20  L_ALWAYS, 2)==2 
1bc90 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  ){.    **      /
1bca0 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e  / ALWAYS() and N
1bcb0 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70  EVER() are no-op
1bcc0 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61   pass-through ma
1bcd0 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d  cros.    **    }
1bce0 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
1bcf0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1bd00 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
1bd10 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20  SERT, 1) ){.    
1bd20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
1bd30 53 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61  S(x) asserts tha
1bd40 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56  t x is true. NEV
1bd50 45 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20  ER(x) asserts x 
1bd60 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
1bd70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a      }else{.    *
1bd80 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
1bd90 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  (x) is a constan
1bda0 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69  t 1.  NEVER(x) i
1bdb0 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a  s a constant 0..
1bdc0 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20      **    }.    
1bdd0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1bde0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
1bdf0 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  YS: {.      int 
1be00 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
1be10 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41  t);.      rc = A
1be20 4c 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20  LWAYS(x);.      
1be30 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1be40 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71    /*.    **   sq
1be50 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1be60 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1be70 52 4c 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a 20  RL_BYTEORDER);. 
1be80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
1be90 20 69 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65   integer returne
1bea0 64 20 72 65 76 65 61 6c 73 20 74 68 65 20 62 79  d reveals the by
1beb0 74 65 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20  te-order of the 
1bec0 63 6f 6d 70 75 74 65 72 20 6f 6e 20 77 68 69 63  computer on whic
1bed0 68 0a 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20  h.    ** SQLite 
1bee0 69 73 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20  is running:.    
1bef0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20  **.    **       
1bf00 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e  1     big-endian
1bf10 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20  ,    determined 
1bf20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20  at run-time.    
1bf30 2a 2a 20 20 20 20 20 20 31 30 20 20 20 20 20 6c  **      10     l
1bf40 69 74 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65  ittle-endian, de
1bf50 74 65 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d  termined at run-
1bf60 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33 32  time.    **  432
1bf70 31 30 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69  101     big-endi
1bf80 61 6e 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65  an,    determine
1bf90 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
1bfa0 65 0a 20 20 20 20 2a 2a 20 20 31 32 33 34 31 30  e.    **  123410
1bfb0 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69       little-endi
1bfc0 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61  an, determined a
1bfd0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20  t compile-time. 
1bfe0 20 20 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20     */ .    case 
1bff0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1c000 42 59 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20  BYTEORDER: {.   
1c010 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
1c020 59 54 45 4f 52 44 45 52 2a 31 30 30 20 2b 20 53  YTEORDER*100 + S
1c030 51 4c 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49  QLITE_LITTLEENDI
1c040 41 4e 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f 42  AN*10 + SQLITE_B
1c050 49 47 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20  IGENDIAN;.      
1c060 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1c070 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1c080 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1c090 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
1c0a0 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  RVE, sqlite3 *db
1c0b0 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a  , int N).    **.
1c0c0 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e      ** Set the n
1c0d0 52 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20  Reserve size to 
1c0e0 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  N for the main d
1c0f0 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64  atabase on the d
1c100 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63  atabase.    ** c
1c110 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20  onnection db..  
1c120 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1c130 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
1c140 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73  SERVE: {.      s
1c150 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
1c160 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
1c170 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  );.      int x =
1c180 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
1c190 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
1c1a0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
1c1b0 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c  utex);.      sql
1c1c0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
1c1d0 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  Size(db->aDb[0].
1c1e0 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20  pBt, 0, x, 0);. 
1c1f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
1c200 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
1c210 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
1c220 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
1c230 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1c240 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1c250 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
1c260 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  ONS, sqlite3 *db
1c270 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a  , int N).    **.
1c280 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72      ** Enable or
1c290 20 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73   disable various
1c2a0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66   optimizations f
1c2b0 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
1c2c0 73 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a  ses.  The .    *
1c2d0 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20  * argument N is 
1c2e0 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74  a bitmask of opt
1c2f0 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65  imizations to be
1c300 20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20   disabled.  For 
1c310 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70  normal.    ** op
1c320 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64  eration N should
1c330 20 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61   be 0.  The idea
1c340 20 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20   is that a test 
1c350 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68  program (like th
1c360 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67  e.    ** SQL Log
1c370 69 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74  ic Test or SLT t
1c380 65 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20  est module) can 
1c390 72 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c  run the same SQL
1c3a0 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a   multiple times.
1c3b0 20 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69      ** with vari
1c3c0 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
1c3d0 73 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65  s disabled to ve
1c3e0 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61  rify that the sa
1c3f0 6d 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a  me answer.    **
1c400 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20   is obtained in 
1c410 65 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20  every case..    
1c420 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1c430 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
1c440 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20  MIZATIONS: {.   
1c450 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
1c460 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
1c470 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d  te3*);.      db-
1c480 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75  >dbOptFlags = (u
1c490 31 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69  16)(va_arg(ap, i
1c4a0 6e 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20  nt) & 0xffff);. 
1c4b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c4c0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1c4d0 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f  _N_KEYWORD.    /
1c4e0 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
1c4f0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1c500 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44  STCTRL_ISKEYWORD
1c510 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57  , const char *zW
1c520 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ord).    **.    
1c530 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61  ** If zWord is a
1c540 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69   keyword recogni
1c550 7a 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  zed by the parse
1c560 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  r, then return t
1c570 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
1c580 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f   of keywords.  O
1c590 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f  r if zWord is no
1c5a0 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74  t a keyword, ret
1c5b0 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20  urn 0..    ** . 
1c5c0 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20     ** This test 
1c5d0 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20  feature is only 
1c5e0 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65  available in the
1c5f0 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69   amalgamation si
1c600 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53  nce.    ** the S
1c610 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20  QLITE_N_KEYWORD 
1c620 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66  macro is not def
1c630 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c  ined in this fil
1c640 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20  e if SQLite.    
1c650 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e  ** is built usin
1c660 67 20 73 65 70 61 72 61 74 65 20 73 6f 75 72 63  g separate sourc
1c670 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a  e files..    */.
1c680 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1c690 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
1c6a0 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  RD: {.      cons
1c6b0 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20  t char *zWord = 
1c6c0 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74  va_arg(ap, const
1c6d0 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69   char*);.      i
1c6e0 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
1c6f0 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20  rlen30(zWord);. 
1c700 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74       rc = (sqlit
1c710 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75  e3KeywordCode((u
1c720 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b  8*)zWord, n)!=TK
1c730 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f  _ID) ? SQLITE_N_
1c740 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20  KEYWORD : 0;.   
1c750 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1c760 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20  #endif ..    /* 
1c770 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1c780 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1c790 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c  CTRL_SCRATCHMALL
1c7a0 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70  OC, sz, &pNew, p
1c7b0 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  Free);.    **.  
1c7c0 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20    ** Pass pFree 
1c7d0 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61  into sqlite3Scra
1c7e0 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20  tchFree(). .    
1c7f0 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20  ** If sz>0 then 
1c800 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74  allocate a scrat
1c810 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70  ch buffer into p
1c820 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20  New.  .    */.  
1c830 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1c840 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41  STCTRL_SCRATCHMA
1c850 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f  LLOC: {.      vo
1c860 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e  id *pFree, **ppN
1c870 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  ew;.      int sz
1c880 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f  ;.      sz = va_
1c890 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1c8a0 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61      ppNew = va_a
1c8b0 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a  rg(ap, void**);.
1c8c0 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 76 61        pFree = va
1c8d0 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
1c8e0 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20 29 20  .      if( sz ) 
1c8f0 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33  *ppNew = sqlite3
1c900 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a  ScratchMalloc(sz
1c910 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1c920 53 63 72 61 74 63 68 46 72 65 65 28 70 46 72 65  ScratchFree(pFre
1c930 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
1c940 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1c950 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1c960 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1c970 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
1c980 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66  FAULT, int onoff
1c990 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1c9a0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e   If parameter on
1c9b0 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  off is non-zero,
1c9c0 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77   configure the w
1c9d0 72 61 70 70 65 72 73 20 73 6f 20 74 68 61 74 20  rappers so that 
1c9e0 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65  all.    ** subse
1c9f0 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c  quent calls to l
1ca00 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76  ocaltime() and v
1ca10 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66  ariants fail. If
1ca20 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a   onoff is zero,.
1ca30 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73      ** undo this
1ca40 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f   setting..    */
1ca50 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1ca60 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54  _TESTCTRL_LOCALT
1ca70 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20  IME_FAULT: {.   
1ca80 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1ca90 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d  Config.bLocaltim
1caa0 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28  eFault = va_arg(
1cab0 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
1cac0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1cad0 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1cae0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1caf0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
1cb00 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e 74 29 3b  R_CORRUPT, int);
1cb10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
1cb20 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20 66 6c  et or clear a fl
1cb30 61 67 20 74 68 61 74 20 69 6e 64 69 63 61 74 65  ag that indicate
1cb40 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
1cb50 61 73 65 20 66 69 6c 65 20 69 73 20 61 6c 77 61  ase file is alwa
1cb60 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20  ys well-.    ** 
1cb70 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65 76 65 72  formed and never
1cb80 20 63 6f 72 72 75 70 74 2e 20 20 54 68 69 73 20   corrupt.  This 
1cb90 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20 62 79  flag is clear by
1cba0 20 64 65 66 61 75 6c 74 2c 20 69 6e 64 69 63 61   default, indica
1cbb0 74 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a  ting that.    **
1cbc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 20   database files 
1cbd0 6d 69 67 68 74 20 68 61 76 65 20 61 72 62 69 74  might have arbit
1cbe0 72 61 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e  rary corruption.
1cbf0 20 20 53 65 74 74 69 6e 67 20 74 68 65 20 66 6c    Setting the fl
1cc00 61 67 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a  ag during.    **
1cc10 20 74 65 73 74 69 6e 67 20 63 61 75 73 65 73 20   testing causes 
1cc20 63 65 72 74 61 69 6e 20 61 73 73 65 72 74 28 29  certain assert()
1cc30 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74   statements in t
1cc40 68 65 20 63 6f 64 65 20 74 6f 20 62 65 20 61 63  he code to be ac
1cc50 74 69 76 61 74 65 64 0a 20 20 20 20 2a 2a 20 74  tivated.    ** t
1cc60 68 61 74 20 64 65 6d 6f 6e 73 74 72 61 74 20 69  hat demonstrat i
1cc70 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20 77 65 6c  nvariants on wel
1cc80 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73  l-formed databas
1cc90 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a  e files..    */.
1cca0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ccb0 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43  TESTCTRL_NEVER_C
1ccc0 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20 20 20 20  ORRUPT: {.      
1ccd0 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1cce0 66 69 67 2e 6e 65 76 65 72 43 6f 72 72 75 70 74  fig.neverCorrupt
1ccf0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1cd00 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1cd10 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20  .    }...    /* 
1cd20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
1cd30 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1cd40 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45  STCTRL_VDBE_COVE
1cd50 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c  RAGE, xCallback,
1cd60 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20   ptr);.    **.  
1cd70 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56 44 42    ** Set the VDB
1cd80 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c 6c 62  E coverage callb
1cd90 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  ack function to 
1cda0 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 63  xCallback with c
1cdb0 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a 20 70  ontext .    ** p
1cdc0 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20 20 20  ointer ptr..    
1cdd0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1cde0 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45  TE_TESTCTRL_VDBE
1cdf0 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69 66  _COVERAGE: {.#if
1ce00 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f  def SQLITE_VDBE_
1ce10 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20 74  COVERAGE.      t
1ce20 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 62 72  ypedef void (*br
1ce30 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76  anch_callback)(v
1ce40 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38 29 3b  oid*,int,u8,u8);
1ce50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1ce60 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65  obalConfig.xVdbe
1ce70 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72 67 28  Branch = va_arg(
1ce80 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61  ap,branch_callba
1ce90 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ck);.      sqlit
1cea0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
1ceb0 56 64 62 65 42 72 61 6e 63 68 41 72 67 20 3d 20  VdbeBranchArg = 
1cec0 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a 29  va_arg(ap,void*)
1ced0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62  ;.#endif.      b
1cee0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1cef0 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1cf00 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1cf10 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45  E_TESTCTRL_SORTE
1cf20 52 5f 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78  R_MMAP, db, nMax
1cf30 29 3b 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53  ); */.    case S
1cf40 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53  QLITE_TESTCTRL_S
1cf50 4f 52 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20  ORTER_MMAP: {.  
1cf60 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
1cf70 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
1cf80 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62  ite3*);.      db
1cf90 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70  ->nMaxSorterMmap
1cfa0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1cfb0 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1cfc0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
1cfd0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1cfe0 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1cff0 54 43 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20  TCTRL_ISINIT);. 
1d000 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74     **.    ** Ret
1d010 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66  urn SQLITE_OK if
1d020 20 53 51 4c 69 74 65 20 68 61 73 20 62 65 65 6e   SQLite has been
1d030 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64   initialized and
1d040 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66   SQLITE_ERROR if
1d050 0a 20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20  .    ** not..   
1d060 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1d070 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49  ITE_TESTCTRL_ISI
1d080 4e 49 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  NIT: {.      if(
1d090 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1d0a0 6e 66 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29  nfig.isInit==0 )
1d0b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
1d0c0 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  OR;.      break;
1d0d0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f  .    }.  }.  va_
1d0e0 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66 20  end(ap);.#endif 
1d0f0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  /* SQLITE_OMIT_B
1d100 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20  UILTIN_TEST */. 
1d110 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
1d120 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75  *.** This is a u
1d130 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c 20  tility routine, 
1d140 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69 6d  useful to VFS im
1d150 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74  plementations, t
1d160 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f  hat checks.** to
1d170 20 73 65 65 20 69 66 20 61 20 64 61 74 61 62 61   see if a databa
1d180 73 65 20 66 69 6c 65 20 77 61 73 20 61 20 55 52  se file was a UR
1d190 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65 64  I that contained
1d1a0 20 61 20 73 70 65 63 69 66 69 63 20 71 75 65 72   a specific quer
1d1b0 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c  y .** parameter,
1d1c0 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61 69   and if so obtai
1d1d0 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ns the value of 
1d1e0 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  the query parame
1d1f0 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a  ter..**.** The z
1d200 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
1d210 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61 6d  t is the filenam
1d220 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64  e pointer passed
1d230 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e 28   into the xOpen(
1d240 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61  ).** method of a
1d250 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74   VFS implementat
1d260 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61 6d  ion.  The zParam
1d270 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1d280 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20   name of the.** 
1d290 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 20  query parameter 
1d2a0 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20 72  we seek.  This r
1d2b0 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74  outine returns t
1d2c0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
1d2d0 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65  zParam.** parame
1d2e0 74 65 72 20 69 66 20 69 74 20 65 78 69 73 74 73  ter if it exists
1d2f0 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  .  If the parame
1d300 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ter does not exi
1d310 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
1d320 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e 55  .** returns a NU
1d330 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63  LL pointer..*/.c
1d340 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
1d350 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
1d360 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1d370 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
1d380 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69  ar *zParam){.  i
1d390 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20  f( zFilename==0 
1d3a0 7c 7c 20 7a 50 61 72 61 6d 3d 3d 30 20 29 20 72  || zParam==0 ) r
1d3b0 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65  eturn 0;.  zFile
1d3c0 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
1d3d0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
1d3e0 65 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28  e) + 1;.  while(
1d3f0 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
1d400 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72  .    int x = str
1d410 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  cmp(zFilename, z
1d420 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c  Param);.    zFil
1d430 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
1d440 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
1d450 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28  me) + 1;.    if(
1d460 20 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a   x==0 ) return z
1d470 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46  Filename;.    zF
1d480 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
1d490 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
1d4a0 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20  name) + 1;.  }. 
1d4b0 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1d4c0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f  .** Return a boo
1d4d0 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61  lean value for a
1d4e0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
1d4f0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1d500 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e  _uri_boolean(con
1d510 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
1d520 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
1d530 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c  zParam, int bDfl
1d540 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
1d550 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
1d560 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c  i_parameter(zFil
1d570 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
1d580 20 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21    bDflt = bDflt!
1d590 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f  =0;.  return z ?
1d5a0 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65   sqlite3GetBoole
1d5b0 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62  an(z, bDflt) : b
1d5c0 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
1d5d0 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69  eturn a 64-bit i
1d5e0 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72  nteger value for
1d5f0 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74   a query paramet
1d600 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  er..*/.sqlite3_i
1d610 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69  nt64 sqlite3_uri
1d620 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20  _int64(.  const 
1d630 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1d640 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
1d650 61 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70  as passed to xOp
1d660 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  en */.  const ch
1d670 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20  ar *zParam,     
1d680 20 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74    /* URI paramet
1d690 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73  er sought */.  s
1d6a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66  qlite3_int64 bDf
1d6b0 6c 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75  lt       /* retu
1d6c0 72 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72 20  rn if parameter 
1d6d0 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b  is missing */.){
1d6e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1d6f0 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
1d700 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61  arameter(zFilena
1d710 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73  me, zParam);.  s
1d720 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a  qlite3_int64 v;.
1d730 20 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74    if( z && sqlit
1d740 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34 28  e3DecOrHexToI64(
1d750 7a 2c 20 26 76 29 3d 3d 53 51 4c 49 54 45 5f 4f  z, &v)==SQLITE_O
1d760 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d  K ){.    bDflt =
1d770 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   v;.  }.  return
1d780 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   bDflt;.}../*.**
1d790 20 52 65 74 75 72 6e 20 74 68 65 20 42 74 72 65   Return the Btre
1d7a0 65 20 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69  e pointer identi
1d7b0 66 69 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e  fied by zDbName.
1d7c0 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66    Return NULL if
1d7d0 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42   not found..*/.B
1d7e0 74 72 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e  tree *sqlite3DbN
1d7f0 61 6d 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74  ameToBtree(sqlit
1d800 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
1d810 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20  ar *zDbName){.  
1d820 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30  int i;.  for(i=0
1d830 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
1d840 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61  ){.    if( db->a
1d850 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20 20 20 26  Db[i].pBt.     &
1d860 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c 7c  & (zDbName==0 ||
1d870 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
1d880 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62  zDbName, db->aDb
1d890 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a 20  [i].zName)==0). 
1d8a0 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
1d8b0 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  rn db->aDb[i].pB
1d8c0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  t;.    }.  }.  r
1d8d0 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
1d8e0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c  * Return the fil
1d8f0 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74  ename of the dat
1d900 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65 64  abase associated
1d910 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73 65   with a database
1d920 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  .** connection..
1d930 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
1d940 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61  qlite3_db_filena
1d950 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  me(sqlite3 *db, 
1d960 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
1d970 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70  ame){.  Btree *p
1d980 42 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  Bt;.#ifdef SQLIT
1d990 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
1d9a0 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
1d9b0 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
1d9c0 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
1d9d0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
1d9e0 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
1d9f0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 70  ;.  }.#endif.  p
1da00 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61  Bt = sqlite3DbNa
1da10 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44  meToBtree(db, zD
1da20 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e  bName);.  return
1da30 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74   pBt ? sqlite3Bt
1da40 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 70  reeGetFilename(p
1da50 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Bt) : 0;.}../*.*
1da60 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 64 61  * Return 1 if da
1da70 74 61 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f  tabase is read-o
1da80 6e 6c 79 20 6f 72 20 30 20 69 66 20 72 65 61 64  nly or 0 if read
1da90 2f 77 72 69 74 65 2e 20 20 52 65 74 75 72 6e 20  /write.  Return 
1daa0 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68  -1 if.** no such
1dab0 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74 73   database exists
1dac0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1dad0 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c  _db_readonly(sql
1dae0 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1daf0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
1db00 20 20 42 74 72 65 65 20 2a 70 42 74 3b 0a 23 69    Btree *pBt;.#i
1db10 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1db20 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1db30 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1db40 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
1db50 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
1db60 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
1db70 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
1db80 0a 23 65 6e 64 69 66 0a 20 20 70 42 74 20 3d 20  .#endif.  pBt = 
1db90 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1dba0 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
1dbb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20  );.  return pBt 
1dbc0 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ? sqlite3BtreeIs
1dbd0 52 65 61 64 6f 6e 6c 79 28 70 42 74 29 20 3a 20  Readonly(pBt) : 
1dbe0 2d 31 3b 0a 7d 0a                                -1;.}.