/ Hex Artifact Content
Login

Artifact 2b882f64580ea72e2d972a5296f9eaa75a353161:


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 76 6f 69 64 20 28 2a 73 71 6c 69 74  .*/.void (*sqlit
08d0: 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74  e3IoTrace)(const
08e0: 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30   char*, ...) = 0
08f0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
0900: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0910: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0920: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0930: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0940: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0950: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0960: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0970: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0980: 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  re.** temporary 
0990: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  files..**.** See
09a0: 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d   also the "PRAGM
09b0: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
09c0: 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d  ectory" SQL comm
09d0: 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  and..*/.char *sq
09e0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
09f0: 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  tory = 0;../*.**
0a00: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
0a10: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
0a20: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
0a30: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
0a40: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
0a50: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
0a60: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
0a70: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
0a80: 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62  ore.** all datab
0a90: 61 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66  ase files specif
0aa0: 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74  ied with a relat
0ab0: 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a  ive pathname..**
0ac0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
0ad0: 20 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74   "PRAGMA data_st
0ae0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
0af0: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
0b00: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74  har *sqlite3_dat
0b10: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
0b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0b30: 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a  ze SQLite.  .**.
0b40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0b50: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74  must be called t
0b60: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
0b70: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0b80: 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20  on,.** VFS, and 
0b90: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73  mutex subsystems
0ba0: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
0bb0: 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b  any serious work
0bc0: 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e   with.** SQLite.
0bd0: 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73    But as long as
0be0: 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70   you do not comp
0bf0: 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ile with SQLITE_
0c00: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a  OMIT_AUTOINIT.**
0c10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
0c20: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74  ll be called aut
0c30: 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65  omatically by ke
0c40: 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20  y routines such 
0c50: 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70  as.** sqlite3_op
0c60: 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  en().  .**.** Th
0c70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
0c80: 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20  no-op except on 
0c90: 69 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63  its very first c
0ca0: 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63  all for the proc
0cb0: 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74  ess,.** or for t
0cc0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66  he first call af
0cd0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
0ce0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a  lite3_shutdown..
0cf0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
0d00: 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74  thread to call t
0d10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
0d20: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0d30: 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65  ion to.** comple
0d40: 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71  tion.  If subseq
0d50: 75 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c  uent threads cal
0d60: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  l this routine b
0d70: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
0d80: 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69  ** thread has fi
0d90: 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69  nished the initi
0da0: 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73  alization proces
0db0: 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73  s, then the subs
0dc0: 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64  equent.** thread
0dd0: 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74  s must block unt
0de0: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72  il the first thr
0df0: 65 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74  ead finishes wit
0e00: 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  h the initializa
0e10: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
0e20: 66 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67  first thread mig
0e30: 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ht call this rou
0e40: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
0e50: 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20  .  Recursive.** 
0e60: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f  calls to this ro
0e70: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
0e80: 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73   block, of cours
0e90: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
0ea0: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  e.** initializat
0eb0: 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c  ion process woul
0ec0: 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65  d never complete
0ed0: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65  ..**.** Let X be
0ee0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61   the first threa
0ef0: 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20  d to enter this 
0f00: 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20  routine.  Let Y 
0f10: 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  be some other.**
0f20: 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77   thread.  Then w
0f30: 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c  hile the initial
0f40: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
0f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58  his routine by X
0f60: 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74   is.** incomplet
0f70: 65 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65  e, it is require
0f80: 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  d that:.**.**   
0f90: 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69   *  Calls to thi
0fa0: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59  s routine from Y
0fb0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fc0: 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74  l the outer-most
0fd0: 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62  .**       call b
0fe0: 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a  y X completes..*
0ff0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72  *.**    *  Recur
1000: 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68  sive calls to th
1010: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  is routine from 
1020: 74 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20  thread X return 
1030: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
1040: 20 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f       without blo
1050: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
1060: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1070: 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f  (void){.  MUTEX_
1080: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
1090: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
10a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
10b0: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
10c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1100: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1110: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69  E_EXTRA_INIT.  i
1120: 6e 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74  nt bRunExtraInit
1130: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1150: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
1160: 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65  ion needed */.#e
1170: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1180: 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72  ITE_OMIT_WSD.  r
1190: 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f  c = sqlite3_wsd_
11a0: 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a  init(4096, 24);.
11b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
11d0: 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
11e0: 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65  ..  /* If SQLite
11f0: 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70   is already comp
1200: 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a  letely initializ
1210: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  ed, then this ca
1220: 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  ll.  ** to sqlit
1230: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
1240: 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f  should be a no-o
1250: 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74  p.  But the init
1260: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
1270: 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  must be complete
1280: 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73  .  So isInit mus
1290: 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74  t not be set unt
12a0: 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a  il the very end.
12b0: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75    ** of this rou
12c0: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tine..  */.  if(
12d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
12e0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
12f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1300: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1310: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1320: 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  tem is initializ
1330: 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74  ed.  If unable t
1340: 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  o .  ** initiali
1350: 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62  ze the mutex sub
1360: 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20 65  system, return e
1370: 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65 72  arly with the er
1380: 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ror..  ** If the
1390: 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73 69   system is so si
13a0: 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20 75  ck that we are u
13b0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
13c0: 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20  e a mutex,.  ** 
13d0: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63  there is not muc
13e0: 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69 6e  h SQLite is goin
13f0: 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  g to be able to 
1400: 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  do..  **.  ** Th
1410: 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  e mutex subsyste
1420: 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72 65  m must take care
1430: 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67 20   of serializing 
1440: 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69  its own.  ** ini
1450: 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a  tialization..  *
1460: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1470: 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20 69  MutexInit();.  i
1480: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1490: 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  c;..  /* Initial
14a0: 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29  ize the malloc()
14b0: 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65 20   system and the 
14c0: 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74 4d  recursive pInitM
14d0: 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a  utex mutex..  **
14e0: 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   This operation 
14f0: 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
1500: 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54 45  the STATIC_MASTE
1510: 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20 74  R mutex.  Note t
1520: 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c  hat.  ** MutexAl
1530: 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64 20  loc() is called 
1540: 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75 74  for a static mut
1550: 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69 74  ex prior to init
1560: 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a  ializing the.  *
1570: 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74  * malloc subsyst
1580: 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69 65  em - this implie
1590: 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  s that the alloc
15a0: 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74 69  ation of a stati
15b0: 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73  c.  ** mutex mus
15c0: 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73 75  t not require su
15d0: 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20 6d  pport from the m
15e0: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 2e  alloc subsystem.
15f0: 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f  .  */.  MUTEX_LO
1600: 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
1610: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1620: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1630: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a  ATIC_MASTER); ).
1640: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1650: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
1660: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1670: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
1680: 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73 71  t = 1;.  if( !sq
1690: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16a0: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29  g.isMallocInit )
16b0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
16c0: 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a  e3MallocInit();.
16d0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
16e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
16f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1700: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1710: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73 71  = 1;.    if( !sq
1720: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1730: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a  g.pInitMutex ){.
1740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1750: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1760: 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20 20  utex =.         
1770: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c    sqlite3MutexAl
1780: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1790: 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20  _RECURSIVE);.   
17a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
17b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
17c0: 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74 65  Mutex && !sqlite
17d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
17e0: 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  nitMutex ){.    
17f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1800: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
1810: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
1820: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1830: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1840: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
1850: 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73  Mutex++;.  }.  s
1860: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1870: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20  ve(pMaster);..  
1880: 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74 20  /* If rc is not 
1890: 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68 69  SQLITE_OK at thi
18a0: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69  s point, then ei
18b0: 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a  ther the malloc.
18c0: 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20 63    ** subsystem c
18d0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69 74  ould not be init
18e0: 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20 73  ialized or the s
18f0: 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f 20  ystem failed to 
1900: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68  allocate.  ** th
1910: 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74  e pInitMutex mut
1920: 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  ex. Return an er
1930: 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63 61  ror in either ca
1940: 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  se.  */.  if( rc
1950: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1960: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1970: 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 72  }..  /* Do the r
1980: 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74 69  est of the initi
1990: 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20  alization under 
19a0: 74 68 65 20 72 65 63 75 72 73 69 76 65 20 6d 75  the recursive mu
19b0: 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  tex so.  ** that
19c0: 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c 65   we will be able
19d0: 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75 72   to handle recur
19e0: 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a  sive calls into.
19f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69    ** sqlite3_ini
1a00: 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65 20  tialize().  The 
1a10: 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20  recursive calls 
1a20: 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68  normally come th
1a30: 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74  rough.  ** sqlit
1a40: 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68 65  e3_os_init() whe
1a50: 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c  n it invokes sql
1a60: 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1a70: 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a 20  r(), but other. 
1a80: 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63 61   ** recursive ca
1a90: 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  lls might also b
1aa0: 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a  e possible..  **
1ab0: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
1ac0: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30  TION-OF: R-00140
1ad0: 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20 61 75  -37445 SQLite au
1ae0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 72 69  tomatically seri
1af0: 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a  alizes calls.  *
1b00: 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20 6d  * to the xInit m
1b10: 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20 78 49  ethod, so the xI
1b20: 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65 64 20  nit method need 
1b30: 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73 61 66  not be threadsaf
1b40: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  e..  **.  ** The
1b50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78   following mutex
1b60: 20 69 73 20 77 68 61 74 20 73 65 72 69 61 6c 69   is what seriali
1b70: 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20 74 68  zes access to th
1b80: 65 20 61 70 70 64 65 66 20 70 63 61 63 68 65 20  e appdef pcache 
1b90: 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f  xInit.  ** metho
1ba0: 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ds.  The sqlite3
1bb0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e  _pcache_methods.
1bc0: 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73 20 65  xInit() all is e
1bd0: 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65 0a 20  mbedded in the. 
1be0: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69   ** call to sqli
1bf0: 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c  te3PcacheInitial
1c00: 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71  ize()..  */.  sq
1c10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c20: 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  r(sqlite3GlobalC
1c30: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1c40: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1c50: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1c60: 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  nit==0 && sqlite
1c70: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e  3GlobalConfig.in
1c80: 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20  Progress==0 ){. 
1c90: 20 20 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a     FuncDefHash *
1ca0: 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28  pHash = &GLOBAL(
1cb0: 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c  FuncDefHash, sql
1cc0: 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69  ite3GlobalFuncti
1cd0: 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ons);.    sqlite
1ce0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e  3GlobalConfig.in
1cf0: 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20  Progress = 1;.  
1d00: 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68 2c 20    memset(pHash, 
1d10: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
1d20: 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  3GlobalFunctions
1d30: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  ));.    sqlite3R
1d40: 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e  egisterGlobalFun
1d50: 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66  ctions();.    if
1d60: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1d70: 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e  onfig.isPCacheIn
1d80: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
1d90: 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
1da0: 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  eInitialize();. 
1db0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1dc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dd0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1de0: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
1df0: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Init = 1;.      
1e00: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e  rc = sqlite3OsIn
1e10: 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  it();.    }.    
1e20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e30: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1e40: 65 33 50 43 61 63 68 65 42 75 66 66 65 72 53 65  e3PCacheBufferSe
1e50: 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  tup( sqlite3Glob
1e60: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20  alConfig.pPage, 
1e70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1e80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
1e90: 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47 6c  zPage, sqlite3Gl
1ea0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65  obalConfig.nPage
1eb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ec0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1ed0: 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  nit = 1;.#ifdef 
1ee0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
1ef0: 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78 74 72  T.      bRunExtr
1f00: 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e 64 69  aInit = 1;.#endi
1f10: 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  f.    }.    sqli
1f20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f30: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  inProgress = 0;.
1f40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1f50: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
1f60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
1f70: 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  nitMutex);..  /*
1f80: 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72 20 74   Go back under t
1f90: 68 65 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  he static mutex 
1fa0: 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65  and clean up the
1fb0: 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20   recursive.  ** 
1fc0: 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65 6e 74  mutex to prevent
1fd0: 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65 61 6b   a resource leak
1fe0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1ff0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
2000: 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ster);.  sqlite3
2010: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65  GlobalConfig.nRe
2020: 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20  fInitMutex--;.  
2030: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2040: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
2050: 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20  Mutex<=0 ){.    
2060: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47  assert( sqlite3G
2070: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
2080: 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  InitMutex==0 );.
2090: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
20a0: 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33 47 6c  x_free(sqlite3Gl
20b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
20c0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Mutex);.    sqli
20d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
20e0: 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a  pInitMutex = 0;.
20f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
2100: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
2110: 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  r);..  /* The fo
2120: 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73 74 20  llowing is just 
2130: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 74  a sanity check t
2140: 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69  o make sure SQLi
2150: 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e  te has.  ** been
2160: 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65 63   compiled correc
2170: 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d 70 6f  tly.  It is impo
2180: 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 69  rtant to run thi
2190: 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a  s code, but.  **
21a0: 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
21b0: 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74  o run it too oft
21c0: 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70 20 43  en and soak up C
21d0: 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f  PU cycles for no
21e0: 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53  .  ** reason.  S
21f0: 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e 63 65  o we run it once
2200: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
2210: 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  zation..  */.#if
2220: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69 66 6e  ndef NDEBUG.#ifn
2230: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2240: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
2250: 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   /* This section
2260: 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20   of code's only 
2270: 22 6f 75 74 70 75 74 22 20 69 73 20 76 69 61 20  "output" is via 
2280: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
2290: 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72  nts. */.  if ( r
22a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22b0: 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 75      u64 x = (((u
22c0: 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20  64)1)<<63)-1;.  
22d0: 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
22e0: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
22f0: 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ==8);.    assert
2300: 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65  (sizeof(x)==size
2310: 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63  of(y));.    memc
2320: 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20  py(&y, &x, 8);. 
2330: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2340: 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20  e3IsNaN(y) );.  
2350: 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  }.#endif.#endif.
2360: 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 69  .  /* Do extra i
2370: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74  nitialization st
2380: 65 70 73 20 72 65 71 75 65 73 74 65 64 20 62 79  eps requested by
2390: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58 54 52   the SQLITE_EXTR
23a0: 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70  A_INIT.  ** comp
23b0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e  ile-time option.
23c0: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
23d0: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
23e0: 20 69 66 28 20 62 52 75 6e 45 78 74 72 61 49 6e   if( bRunExtraIn
23f0: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 53 51  it ){.    int SQ
2400: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28  LITE_EXTRA_INIT(
2410: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20  const char*);.  
2420: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 58    rc = SQLITE_EX
2430: 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20 20 7d  TRA_INIT(0);.  }
2440: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
2450: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
2460: 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74 73 20  ndo the effects 
2470: 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  of sqlite3_initi
2480: 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e  alize().  Must n
2490: 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69  ot be called whi
24a0: 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  le.** there are 
24b0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61 74 61  outstanding data
24c0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
24d0: 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   or memory alloc
24e0: 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69  ations or.** whi
24f0: 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66 20 53  le any part of S
2500: 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72 77 69  QLite is otherwi
2510: 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61 6e 79  se in use in any
2520: 20 74 68 72 65 61 64 2e 20 20 54 68 69 73 0a 2a   thread.  This.*
2530: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  * routine is not
2540: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 42 75   threadsafe.  Bu
2550: 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
2560: 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
2570: 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53  ine.** on when S
2580: 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64 79  QLite is already
2590: 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49 66 20   shut down.  If 
25a0: 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64  SQLite is alread
25b0: 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77  y shut down.** w
25c0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
25d0: 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65   is invoked, the
25e0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
25f0: 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
2600: 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
2610: 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f 69 64  e3_shutdown(void
2620: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
2630: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2640: 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51  nit ){.#ifdef SQ
2650: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
2660: 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53 51 4c  OWN.    void SQL
2670: 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f  ITE_EXTRA_SHUTDO
2680: 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20 53 51  WN(void);.    SQ
2690: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
26a0: 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  OWN();.#endif.  
26b0: 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64    sqlite3_os_end
26c0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
26d0: 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e  reset_auto_exten
26e0: 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69  sion();.    sqli
26f0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2700: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
2710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2720: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
2730: 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  heInit ){.    sq
2740: 6c 69 74 65 33 50 63 61 63 68 65 53 68 75 74 64  lite3PcacheShutd
2750: 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  own();.    sqlit
2760: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2770: 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 30 3b  sPCacheInit = 0;
2780: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2790: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
27a0: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
27b0: 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63     sqlite3Malloc
27c0: 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  End();.    sqlit
27d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
27e0: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b  sMallocInit = 0;
27f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2800: 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e 5f 44  _OMIT_SHUTDOWN_D
2810: 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20 20 2f  IRECTORIES.    /
2820: 2a 20 54 68 65 20 68 65 61 70 20 73 75 62 73 79  * The heap subsy
2830: 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62 65 65  stem has now bee
2840: 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64 20 74  n shutdown and t
2850: 68 65 73 65 20 76 61 6c 75 65 73 20 61 72 65 20  hese values are 
2860: 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a 2a 20  supposed.    ** 
2870: 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20 70 6f  to be NULL or po
2880: 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20 74 68  int to memory th
2890: 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  at was obtained 
28a0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
28b0: 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20 77 68  loc(),.    ** wh
28c0: 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79 20 6f  ich would rely o
28d0: 6e 20 74 68 61 74 20 68 65 61 70 20 73 75 62 73  n that heap subs
28e0: 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f 72 65  ystem; therefore
28f0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 73  , make sure thes
2900: 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
2910: 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  cannot refer to 
2920: 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68 61 74  heap memory that
2930: 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61 6c 69   was just invali
2940: 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 0a 20  dated when the. 
2950: 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62 73 79     ** heap subsy
2960: 73 74 65 6d 20 77 61 73 20 73 68 75 74 64 6f 77  stem was shutdow
2970: 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  n.  This is only
2980: 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72   done if the cur
2990: 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  rent call to.   
29a0: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
29b0: 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20 74 68  n resulted in th
29c0: 65 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d  e heap subsystem
29d0: 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
29e0: 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20 2a 2f  shutdown..    */
29f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74  .    sqlite3_dat
2a00: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
2a10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d  .    sqlite3_tem
2a20: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
2a30: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
2a40: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2a50: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2a60: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2a70: 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20 20 20  MutexEnd();.    
2a80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2a90: 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20  fig.isMutexInit 
2aa0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
2ab0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ac0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50 49 20  ./*.** This API 
2ad0: 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61 74 69  allows applicati
2ae0: 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ons to modify th
2af0: 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75  e global configu
2b00: 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  ration of.** the
2b10: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
2b20: 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a  at run-time..**.
2b30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b40: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2b50: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
2b60: 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
2b70: 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
2b80: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d  connections or m
2b90: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2ba0: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
2bb0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61   is not.** threa
2bc0: 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72 65 20  dsafe.  Failure 
2bd0: 74 6f 20 68 65 65 64 20 74 68 65 73 65 20 77 61  to heed these wa
2be0: 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61 64 20  rnings can lead 
2bf0: 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62 6c 65  to unpredictable
2c00: 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  .** behavior..*/
2c10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e  .int sqlite3_con
2c20: 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  fig(int op, ...)
2c30: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
2c40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2c50: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  E_OK;..  /* sqli
2c60: 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73 68 61  te3_config() sha
2c70: 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ll return SQLITE
2c80: 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20 69 73  _MISUSE if it is
2c90: 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20   invoked while. 
2ca0: 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c   ** the SQLite l
2cb0: 69 62 72 61 72 79 20 69 73 20 69 6e 20 75 73 65  ibrary is in use
2cc0: 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  . */.  if( sqlit
2cd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2ce0: 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53  sInit ) return S
2cf0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
2d00: 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61  T;..  va_start(a
2d10: 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
2d20: 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  ( op ){..    /* 
2d30: 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72 61 74  Mutex configurat
2d40: 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72 65 20  ion options are 
2d50: 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69  only available i
2d60: 6e 20 61 20 74 68 72 65 61 64 73 61 66 65 0a 20  n a threadsafe. 
2d70: 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e 20 0a     ** compile. .
2d80: 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e      */.#if defin
2d90: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
2da0: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
2db0: 54 48 52 45 41 44 53 41 46 45 3e 30 0a 20 20 20  THREADSAFE>0.   
2dc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2dd0: 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44  FIG_SINGLETHREAD
2de0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73  : {.      /* Dis
2df0: 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e  able all mutexin
2e00: 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  g */.      sqlit
2e10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2e20: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 0a 20  CoreMutex = 0;. 
2e30: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2e40: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
2e50: 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  tex = 0;.      b
2e60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2e70: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2e80: 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20  IG_MULTITHREAD: 
2e90: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62  {.      /* Disab
2ea0: 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 64  le mutexing of d
2eb0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2ec0: 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ons */.      /* 
2ed0: 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20  Enable mutexing 
2ee0: 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73 74 72  of core data str
2ef0: 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 20  uctures */.     
2f00: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2f10: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2f20: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
2f30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2f40: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20  FullMutex = 0;. 
2f50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f60: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2f70: 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49  E_CONFIG_SERIALI
2f80: 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ZED: {.      /* 
2f90: 45 6e 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78  Enable all mutex
2fa0: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ing */.      sql
2fb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2fc0: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
2fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2fe0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
2ff0: 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Mutex = 1;.     
3000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3010: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3020: 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20  NFIG_MUTEX: {.  
3030: 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61      /* Specify a
3040: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 75  n alternative mu
3050: 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tex implementati
3060: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
3070: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3080: 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67 28  mutex = *va_arg(
3090: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ap, sqlite3_mute
30a0: 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20  x_methods*);.   
30b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
30c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
30d0: 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a  CONFIG_GETMUTEX:
30e0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72   {.      /* Retr
30f0: 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  ieve the current
3100: 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74   mutex implement
3110: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a  ation */.      *
3120: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
3130: 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73  e3_mutex_methods
3140: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
3150: 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a  alConfig.mutex;.
3160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3170: 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20   }.#endif...    
3180: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3190: 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20  IG_MALLOC: {.   
31a0: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
31b0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 61 6c   alternative mal
31c0: 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  loc implementati
31d0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
31e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
31f0: 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  m = *va_arg(ap, 
3200: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3210: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
3220: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3230: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3240: 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  _GETMALLOC: {.  
3250: 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20      /* Retrieve 
3260: 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 6c 6c  the current mall
3270: 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74  oc() implementat
3280: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ion */.      if(
3290: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
32a0: 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d  nfig.m.xMalloc==
32b0: 30 20 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65  0 ) sqlite3MemSe
32c0: 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20  tDefault();.    
32d0: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
32e0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
32f0: 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  s*) = sqlite3Glo
3300: 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20  balConfig.m;.   
3310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3320: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3330: 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53  CONFIG_MEMSTATUS
3340: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61  : {.      /* Ena
3350: 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74  ble or disable t
3360: 68 65 20 6d 61 6c 6c 6f 63 20 73 74 61 74 75 73  he malloc status
3370: 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20   collection */. 
3380: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3390: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
33a0: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
33b0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
33c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
33d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
33e0: 43 52 41 54 43 48 3a 20 7b 0a 20 20 20 20 20 20  CRATCH: {.      
33f0: 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62  /* Designate a b
3400: 75 66 66 65 72 20 66 6f 72 20 73 63 72 61 74 63  uffer for scratc
3410: 68 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a  h memory space *
3420: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3430: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72  lobalConfig.pScr
3440: 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  atch = va_arg(ap
3450: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
3460: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3470: 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20  fig.szScratch = 
3480: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
34a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61  obalConfig.nScra
34b0: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
34c0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
34d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
34e0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
34f0: 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20  _PAGECACHE: {.  
3500: 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65      /* Designate
3510: 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 70 61   a buffer for pa
3520: 67 65 20 63 61 63 68 65 20 6d 65 6d 6f 72 79 20  ge cache memory 
3530: 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73  space */.      s
3540: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3550: 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.pPage = va_ar
3560: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
3570: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3580: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d  lConfig.szPage =
3590: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
35a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
35b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
35c0: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
35d0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
35e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
35f0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3600: 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20  PCACHE: {.      
3610: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
3620: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3630: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3640: 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a  ONFIG_GETPCACHE:
3650: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20   {.      /* now 
3660: 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
3670: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
3680: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
3690: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
36a0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
36b0: 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20  PCACHE2: {.     
36c0: 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61   /* Specify an a
36d0: 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20  lternative page 
36e0: 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  cache implementa
36f0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
3700: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3710: 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61 5f  g.pcache2 = *va_
3720: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
3730: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a  pcache_methods2*
3740: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3750: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
3760: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3770: 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20  PCACHE2: {.     
3780: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
3790: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32  alConfig.pcache2
37a0: 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  .xInit==0 ){.   
37b0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63       sqlite3PCac
37c0: 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  heSetDefault();.
37d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 76        }.      *v
37e0: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
37f0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
3800: 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  2*) = sqlite3Glo
3810: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
3820: 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  2;.      break;.
3830: 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e      }..#if defin
3840: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
3850: 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66  _MEMSYS3) || def
3860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
3870: 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20  LE_MEMSYS5).    
3880: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3890: 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20  IG_HEAP: {.     
38a0: 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20   /* Designate a 
38b0: 62 75 66 66 65 72 20 66 6f 72 20 68 65 61 70 20  buffer for heap 
38c0: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a  memory space */.
38d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
38e0: 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20  balConfig.pHeap 
38f0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3900: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
3910: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3920: 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Heap = va_arg(ap
3930: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
3940: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3950: 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67  g.mnReq = va_arg
3960: 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20  (ap, int);..    
3970: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
3980: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c  balConfig.mnReq<
3990: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
39a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
39b0: 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20 20 20  .mnReq = 1;.    
39c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
39d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
39e0: 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b  mnReq>(1<<12) ){
39f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61 70 20  .        /* cap 
3a00: 6d 69 6e 20 72 65 71 75 65 73 74 20 73 69 7a 65  min request size
3a10: 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20   at 2^12 */.    
3a20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3a30: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
3a40: 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d  (1<<12);.      }
3a50: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
3a60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3a70: 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  pHeap==0 ){.    
3a80: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 65      /* If the he
3a90: 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 4e 55  ap pointer is NU
3aa0: 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65  LL, then restore
3ab0: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c   the malloc impl
3ac0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20  ementation.     
3ad0: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55     ** back to NU
3ae0: 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e  LL pointers too.
3af0: 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
3b00: 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20  e the malloc to 
3b10: 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61  go.        ** ba
3b20: 63 6b 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c  ck to its defaul
3b30: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
3b40: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e   when sqlite3_in
3b50: 69 74 69 61 6c 69 7a 65 28 29 20 69 73 0a 20 20  itialize() is.  
3b60: 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20        ** run..  
3b70: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
3b80: 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33   memset(&sqlite3
3b90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20  GlobalConfig.m, 
3ba0: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
3bb0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29  3GlobalConfig.m)
3bc0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3bd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 68          /* The h
3be0: 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 6e  eap pointer is n
3bf0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e  ot NULL, then in
3c00: 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74 68 65  stall one of the
3c10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 35  .        ** mem5
3c20: 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68 6f 64  .c/mem3.c method
3c30: 73 2e 20 20 54 68 65 20 65 6e 63 6c 6f 73 69 6e  s.  The enclosin
3c40: 67 20 23 69 66 20 67 75 61 72 61 6e 74 65 65 73  g #if guarantees
3c50: 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c   at.        ** l
3c60: 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 73  east one of thes
3c70: 65 20 6d 65 74 68 6f 64 73 20 69 73 20 63 75 72  e methods is cur
3c80: 72 65 6e 74 6c 79 20 65 6e 61 62 6c 65 64 2e 0a  rently enabled..
3c90: 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65          */.#ifde
3ca0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3cb0: 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20  MEMSYS3.        
3cc0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3cd0: 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33  fig.m = *sqlite3
3ce0: 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b  MemGetMemsys3();
3cf0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
3d00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
3d10: 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c  SYS5.        sql
3d20: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3d30: 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d  .m = *sqlite3Mem
3d40: 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65  GetMemsys5();.#e
3d50: 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
3d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3d70: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
3d80: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c   SQLITE_CONFIG_L
3d90: 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20  OOKASIDE: {.    
3da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3db0: 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64  onfig.szLookasid
3dc0: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
3dd0: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
3de0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3df0: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61  Lookaside = va_a
3e00: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3e10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3e20: 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f      .    /* Reco
3e30: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
3e40: 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 74  the logger funct
3e50: 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73  ion and its firs
3e60: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  t argument..    
3e70: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  ** The default i
3e80: 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67  s NULL.  Logging
3e90: 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 66 20   is disabled if 
3ea0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  the function poi
3eb0: 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e  nter is.    ** N
3ec0: 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ULL..    */.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20  IG_LOG: {.      
3ef0: 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79  /* MSVC is picky
3f00: 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66   about pulling f
3f10: 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61  unc ptrs from va
3f20: 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a   lists..      **
3f30: 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e   http://support.
3f40: 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62  microsoft.com/kb
3f50: 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20  /47961.      ** 
3f60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3f70: 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72  fig.xLog = va_ar
3f80: 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f  g(ap, void(*)(vo
3f90: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
3fa0: 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a  ar*));.      */.
3fb0: 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
3fc0: 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76  id(*LOGFUNC_t)(v
3fd0: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
3fe0: 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  har*);.      sql
3ff0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4000: 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  .xLog = va_arg(a
4010: 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20  p, LOGFUNC_t);. 
4020: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4030: 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67  alConfig.pLogArg
4040: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
4050: 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61  id*);.      brea
4060: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
4070: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
4080: 35 35 35 34 38 2d 33 33 38 31 37 20 54 68 65 20  55548-33817 The 
4090: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 73 65 74  compile-time set
40a0: 74 69 6e 67 20 66 6f 72 20 55 52 49 20 66 69 6c  ting for URI fil
40b0: 65 6e 61 6d 65 73 0a 20 20 20 20 2a 2a 20 63 61  enames.    ** ca
40c0: 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 74 20  n be changed at 
40d0: 73 74 61 72 74 2d 74 69 6d 65 20 75 73 69 6e 67  start-time using
40e0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69   the.    ** sqli
40f0: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
4100: 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 31 29 20  E_CONFIG_URI,1) 
4110: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
4120: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
4130: 43 4f 4e 46 49 47 5f 55 52 49 2c 30 29 20 63 6f  CONFIG_URI,0) co
4140: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 61 6c 6c  nfiguration call
4150: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
4160: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4170: 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 73 71  _URI: {.      sq
4180: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4190: 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f  g.bOpenUri = va_
41a0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
41b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
41c0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
41d0: 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e  E_CONFIG_COVERIN
41e0: 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a  G_INDEX_SCAN: {.
41f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4200: 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
4210: 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  s = va_arg(ap, i
4220: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
4230: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
4240: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
4250: 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51  LLOG.    case SQ
4260: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
4270: 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  OG: {.      type
4280: 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47  def void(*SQLLOG
4290: 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73  FUNC_t)(void*, s
42a0: 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
42b0: 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20  har*, int);.    
42c0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
42d0: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20  onfig.xSqllog = 
42e0: 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f  va_arg(ap, SQLLO
42f0: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
4300: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4310: 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d  fig.pSqllogArg =
4320: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
4330: 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   *);.      break
4340: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
4350: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4360: 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45  CONFIG_MMAP_SIZE
4370: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4380: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d  3_int64 szMmap =
4390: 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
43a0: 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20  te3_int64);.    
43b0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
43c0: 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  mxMmap = va_arg(
43d0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ap, sqlite3_int6
43e0: 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  4);.      if( mx
43f0: 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70  Mmap<0 || mxMmap
4400: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50  >SQLITE_MAX_MMAP
4410: 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
4420: 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45   mxMmap = SQLITE
4430: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a  _MAX_MMAP_SIZE;.
4440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
4450: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4460: 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61  g.mxMmap = mxMma
4470: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d  p;.      if( szM
4480: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
4490: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
44a0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
44b0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
44c0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
44d0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
44e0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
44f0: 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
4500: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4510: 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   }..#if SQLITE_O
4520: 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e 65 64  S_WIN && defined
4530: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
4540: 4c 4c 4f 43 29 0a 20 20 20 20 63 61 73 65 20 53  LLOC).    case S
4550: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e  QLITE_CONFIG_WIN
4560: 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20  32_HEAPSIZE: {. 
4570: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4580: 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d  alConfig.nHeap =
4590: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
45a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
45b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
45c0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
45d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
45e0: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
45f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
4600: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
4610: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4620: 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61  Set up the looka
4630: 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f 72  side buffers for
4640: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
4650: 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72  ection..** Retur
4660: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
4670: 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20  uccess.  .** If 
4680: 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72  lookaside is alr
4690: 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65 74  eady active, ret
46a0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
46b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61  .**.** The sz pa
46c0: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e  rameter is the n
46d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
46e0: 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65  n each lookaside
46f0: 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e   slot..** The cn
4700: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
4710: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  he number of slo
4720: 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20 69  ts.  If pStart i
4730: 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70  s NULL the.** sp
4740: 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b  ace for the look
4750: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20  aside memory is 
4760: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4770: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
4780: 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73 20  ** If pStart is 
4790: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
47a0: 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73   is sz*cnt bytes
47b0: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73   of memory to us
47c0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f  e for.** the loo
47d0: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a  kaside memory..*
47e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
47f0: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69  upLookaside(sqli
4800: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  te3 *db, void *p
4810: 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  Buf, int sz, int
4820: 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20 2a 70   cnt){.  void *p
4830: 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64 62 2d  Start;.  if( db-
4840: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
4850: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4860: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
4870: 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65 78 69   /* Free any exi
4880: 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  sting lookaside 
4890: 62 75 66 66 65 72 20 66 6f 72 20 74 68 69 73 20  buffer for this 
48a0: 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20 20  handle before.  
48b0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** allocating a 
48c0: 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20 64 6f  new one so we do
48d0: 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61 76 65  n't have to have
48e0: 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20 2a 2a   space for .  **
48f0: 20 62 6f 74 68 20 61 74 20 74 68 65 20 73 61 6d   both at the sam
4900: 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  e time..  */.  i
4910: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
4920: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
4930: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
4940: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
4950: 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  art);.  }.  /* T
4960: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c 6f 6f  he size of a loo
4970: 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66 74 65  kaside slot afte
4980: 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e 65 65  r ROUNDDOWN8 nee
4990: 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65 72 0a  ds to be larger.
49a0: 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f 69 6e    ** than a poin
49b0: 74 65 72 20 74 6f 20 62 65 20 75 73 65 66 75 6c  ter to be useful
49c0: 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f  ..  */.  sz = RO
49d0: 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20 20 2f  UNDDOWN8(sz);  /
49e0: 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d 30  * IMP: R-33038-0
49f0: 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20 73 7a  9382 */.  if( sz
4a00: 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f  <=(int)sizeof(Lo
4a10: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 20  okasideSlot*) ) 
4a20: 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 6e  sz = 0;.  if( cn
4a30: 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a 20  t<0 ) cnt = 0;. 
4a40: 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e   if( sz==0 || cn
4a50: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d  t==0 ){.    sz =
4a60: 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d   0;.    pStart =
4a70: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
4a80: 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pBuf==0 ){.    s
4a90: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
4aa0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 70  nMalloc();.    p
4ab0: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 4d  Start = sqlite3M
4ac0: 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20 29 3b  alloc( sz*cnt );
4ad0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 34    /* IMP: R-6194
4ae0: 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20 20 73  9-35727 */.    s
4af0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
4b00: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28  alloc();.    if(
4b10: 20 70 53 74 61 72 74 20 29 20 63 6e 74 20 3d 20   pStart ) cnt = 
4b20: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a  sqlite3MallocSiz
4b30: 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a 20 20  e(pStart)/sz;.  
4b40: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 61 72  }else{.    pStar
4b50: 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20 20  t = pBuf;.  }.  
4b60: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
4b70: 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20  tart = pStart;. 
4b80: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4b90: 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Free = 0;.  db->
4ba0: 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28  lookaside.sz = (
4bb0: 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53  u16)sz;.  if( pS
4bc0: 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tart ){.    int 
4bd0: 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  i;.    Lookaside
4be0: 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73  Slot *p;.    ass
4bf0: 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73  ert( sz > (int)s
4c00: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
4c10: 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20 3d  lot*) );.    p =
4c20: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
4c30: 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72  )pStart;.    for
4c40: 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20  (i=cnt-1; i>=0; 
4c50: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  i--){.      p->p
4c60: 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  Next = db->looka
4c70: 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20 20  side.pFree;.    
4c80: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4c90: 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20  pFree = p;.     
4ca0: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
4cb0: 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73  lot*)&((u8*)p)[s
4cc0: 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  z];.    }.    db
4cd0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
4ce0: 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = p;.    db->lo
4cf0: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
4d00: 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 1;.    db->lo
4d10: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
4d20: 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30  d = pBuf==0 ?1:0
4d30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
4d40: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
4d50: 61 72 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62  art = db;.    db
4d60: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
4d70: 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c   = db;.    db->l
4d80: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
4d90: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
4da0: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
4db0: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ed = 0;.  }.  re
4dc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4de0: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
4df0: 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
4e00: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
4e10: 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65  .*/.sqlite3_mute
4e20: 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75  x *sqlite3_db_mu
4e30: 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29  tex(sqlite3 *db)
4e40: 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
4e50: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
4e60: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
4e70: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
4e80: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
4e90: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
4ea0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
4eb0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74    }.#endif.  ret
4ec0: 75 72 6e 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d  urn db->mutex;.}
4ed0: 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20  ../*.** Free up 
4ee0: 61 73 20 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61  as much memory a
4ef0: 73 20 77 65 20 63 61 6e 20 66 72 6f 6d 20 74 68  s we can from th
4f00: 65 20 67 69 76 65 6e 20 64 61 74 61 62 61 73 65  e given database
4f10: 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  .** connection..
4f20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
4f30: 62 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  b_release_memory
4f40: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
4f50: 20 69 6e 74 20 69 3b 0a 0a 23 69 66 64 65 66 20   int i;..#ifdef 
4f60: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
4f70: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
4f80: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
4f90: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
4fa0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
4fb0: 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71  KPT;.#endif.  sq
4fc0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
4fd0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
4fe0: 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
4ff0: 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28  rAll(db);.  for(
5000: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
5010: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
5020: 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44 62 5b 69  *pBt = db->aDb[i
5030: 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70  ].pBt;.    if( p
5040: 42 74 20 29 7b 0a 20 20 20 20 20 20 50 61 67 65  Bt ){.      Page
5050: 72 20 2a 70 50 61 67 65 72 20 3d 20 73 71 6c 69  r *pPager = sqli
5060: 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42  te3BtreePager(pB
5070: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
5080: 33 50 61 67 65 72 53 68 72 69 6e 6b 28 70 50 61  3PagerShrink(pPa
5090: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
50a0: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
50b0: 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20 20 73 71  aveAll(db);.  sq
50c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
50d0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
50e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
50f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69  ;.}../*.** Confi
5100: 67 75 72 61 74 69 6f 6e 20 73 65 74 74 69 6e 67  guration setting
5110: 73 20 66 6f 72 20 61 6e 20 69 6e 64 69 76 69 64  s for an individ
5120: 75 61 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  ual database con
5130: 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e 74 20 73  nection.*/.int s
5140: 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
5150: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
5160: 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61  t op, ...){.  va
5170: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20  _list ap;.  int 
5180: 72 63 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  rc;.  va_start(a
5190: 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
51a0: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
51b0: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
51c0: 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20  _LOOKASIDE: {.  
51d0: 20 20 20 20 76 6f 69 64 20 2a 70 42 75 66 20 3d      void *pBuf =
51e0: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
51f0: 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 32 36  *); /* IMP: R-26
5200: 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a 20 20 20  835-10964 */.   
5210: 20 20 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61     int sz = va_a
5220: 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20  rg(ap, int);    
5230: 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 37 38     /* IMP: R-478
5240: 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20 20 20 20  71-25994 */.    
5250: 20 20 69 6e 74 20 63 6e 74 20 3d 20 76 61 5f 61    int cnt = va_a
5260: 72 67 28 61 70 2c 20 69 6e 74 29 3b 20 20 20 20  rg(ap, int);    
5270: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30 34 34 36    /* IMP: R-0446
5280: 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20 20 20 20  0-53386 */.     
5290: 20 72 63 20 3d 20 73 65 74 75 70 4c 6f 6f 6b 61   rc = setupLooka
52a0: 73 69 64 65 28 64 62 2c 20 70 42 75 66 2c 20 73  side(db, pBuf, s
52b0: 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20 20 20 62  z, cnt);.      b
52c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
52d0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
52e0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
52f0: 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20 20 69  ruct {.        i
5300: 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f 2a 20 54  nt op;      /* T
5310: 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 20  he opcode */.   
5320: 20 20 20 20 20 75 33 32 20 6d 61 73 6b 3b 20 20       u32 mask;  
5330: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 74 68 65    /* Mask of the
5340: 20 62 69 74 20 69 6e 20 73 71 6c 69 74 65 33 2e   bit in sqlite3.
5350: 66 6c 61 67 73 20 74 6f 20 73 65 74 2f 63 6c 65  flags to set/cle
5360: 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d 20 61 46  ar */.      } aF
5370: 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20 20 20 20  lagOp[] = {.    
5380: 20 20 20 20 7b 20 53 51 4c 49 54 45 5f 44 42 43      { SQLITE_DBC
5390: 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 46 4b 45  ONFIG_ENABLE_FKE
53a0: 59 2c 20 20 20 20 53 51 4c 49 54 45 5f 46 6f 72  Y,    SQLITE_For
53b0: 65 69 67 6e 4b 65 79 73 20 20 20 20 7d 2c 0a 20  eignKeys    },. 
53c0: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
53d0: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
53e0: 54 52 49 47 47 45 52 2c 20 53 51 4c 49 54 45 5f  TRIGGER, SQLITE_
53f0: 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20 20 7d  EnableTrigger  }
5400: 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20  ,.      };.     
5410: 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 69 3b   unsigned int i;
5420: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
5430: 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20 49 4d 50  TE_ERROR; /* IMP
5440: 3a 20 52 2d 34 32 37 39 30 2d 32 33 33 37 32 20  : R-42790-23372 
5450: 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  */.      for(i=0
5460: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46  ; i<ArraySize(aF
5470: 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b 0a 20 20  lagOp); i++){.  
5480: 20 20 20 20 20 20 69 66 28 20 61 46 6c 61 67 4f        if( aFlagO
5490: 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29 7b 0a 20  p[i].op==op ){. 
54a0: 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6e 6f           int ono
54b0: 66 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ff = va_arg(ap, 
54c0: 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  int);.          
54d0: 69 6e 74 20 2a 70 52 65 73 20 3d 20 76 61 5f 61  int *pRes = va_a
54e0: 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20  rg(ap, int*);.  
54f0: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 6c 64 46          int oldF
5500: 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c 61 67 73  lags = db->flags
5510: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
5520: 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20 20 20 20  onoff>0 ){.     
5530: 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73         db->flags
5540: 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d   |= aFlagOp[i].m
5550: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
5560: 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66 66 3d 3d  else if( onoff==
5570: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
5580: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 61   db->flags &= ~a
5590: 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a  FlagOp[i].mask;.
55a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
55b0: 20 20 20 20 20 20 69 66 28 20 6f 6c 64 46 6c 61        if( oldFla
55c0: 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73 20 29 7b  gs!=db->flags ){
55d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
55e0: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
55f0: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
5600: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
5610: 20 20 20 20 20 20 20 20 69 66 28 20 70 52 65 73          if( pRes
5620: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5630: 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e 66 6c 61  *pRes = (db->fla
5640: 67 73 20 26 20 61 46 6c 61 67 4f 70 5b 69 5d 2e  gs & aFlagOp[i].
5650: 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20 20 20 20  mask)!=0;.      
5660: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5670: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
5680: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
5690: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
56a0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
56b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65      }.  }.  va_e
56c0: 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75 72 6e  nd(ap);.  return
56d0: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52   rc;.}.../*.** R
56e0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68  eturn true if th
56f0: 65 20 62 75 66 66 65 72 20 7a 5b 30 2e 2e 6e 2d  e buffer z[0..n-
5700: 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61 6c 6c 20  1] contains all 
5710: 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  spaces..*/.stati
5720: 63 20 69 6e 74 20 61 6c 6c 53 70 61 63 65 73 28  c int allSpaces(
5730: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
5740: 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c 65 28 20  nt n){.  while( 
5750: 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27  n>0 && z[n-1]=='
5760: 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a 20 20 72   ' ){ n--; }.  r
5770: 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d 0a 0a 2f  eturn n==0;.}../
5780: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
5790: 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69   default collati
57a0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ng function name
57b0: 64 20 22 42 49 4e 41 52 59 22 20 77 68 69 63 68  d "BINARY" which
57c0: 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 61 76   is always.** av
57d0: 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  ailable..**.** I
57e0: 66 20 74 68 65 20 70 61 64 46 6c 61 67 20 61 72  f the padFlag ar
57f0: 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74 20 4e 55  gument is not NU
5800: 4c 4c 20 74 68 65 6e 20 73 70 61 63 65 20 70 61  LL then space pa
5810: 64 64 69 6e 67 20 61 74 20 74 68 65 20 65 6e 64  dding at the end
5820: 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67 73 20 69  .** of strings i
5830: 73 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73  s ignored.  This
5840: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20   implements the 
5850: 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69 6f 6e 2e  RTRIM collation.
5860: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
5870: 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20 20 76 6f  inCollFunc(.  vo
5880: 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a 20 20 69  id *padFlag,.  i
5890: 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20  nt nKey1, const 
58a0: 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69  void *pKey1,.  i
58b0: 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20  nt nKey2, const 
58c0: 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20  void *pKey2.){. 
58d0: 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20 20 6e 20   int rc, n;.  n 
58e0: 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32 20 3f 20  = nKey1<nKey2 ? 
58f0: 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32 3b 0a 20  nKey1 : nKey2;. 
5900: 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28 70 4b 65   rc = memcmp(pKe
5910: 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29 3b 0a 20  y1, pKey2, n);. 
5920: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
5930: 20 20 69 66 28 20 70 61 64 46 6c 61 67 0a 20 20    if( padFlag.  
5940: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
5950: 28 28 63 68 61 72 2a 29 70 4b 65 79 31 29 2b 6e  ((char*)pKey1)+n
5960: 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20 20 20 20  , nKey1-n).     
5970: 26 26 20 61 6c 6c 53 70 61 63 65 73 28 28 28 63  && allSpaces(((c
5980: 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e 2c 20 6e  har*)pKey2)+n, n
5990: 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29 7b 0a 20  Key2-n).    ){. 
59a0: 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20 72 63       /* Leave rc
59b0: 20 75 6e 63 68 61 6e 67 65 64 20 61 74 20 30 20   unchanged at 0 
59c0: 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  */.    }else{.  
59d0: 20 20 20 20 72 63 20 3d 20 6e 4b 65 79 31 20 2d      rc = nKey1 -
59e0: 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d 0a 20 20   nKey2;.    }.  
59f0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
5a00: 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68 65 72 20  ../*.** Another 
5a10: 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c 61 74 69  built-in collati
5a20: 6e 67 20 73 65 71 75 65 6e 63 65 3a 20 4e 4f 43  ng sequence: NOC
5a30: 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ASE. .**.** This
5a40: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
5a50: 6e 63 65 20 69 73 20 69 6e 74 65 6e 64 65 64 20  nce is intended 
5a60: 74 6f 20 62 65 20 75 73 65 64 20 66 6f 72 20 22  to be used for "
5a70: 63 61 73 65 20 69 6e 64 65 70 65 6e 64 65 6e 74  case independent
5a80: 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e 22 2e  .** comparison".
5a90: 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f 77 6c 65   SQLite's knowle
5aa0: 64 67 65 20 6f 66 20 75 70 70 65 72 20 61 6e 64  dge of upper and
5ab0: 20 6c 6f 77 65 72 20 63 61 73 65 20 65 71 75 69   lower case equi
5ac0: 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78 74 65 6e  valents.** exten
5ad0: 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68 65 20 32  ds only to the 2
5ae0: 36 20 63 68 61 72 61 63 74 65 72 73 20 75 73 65  6 characters use
5af0: 64 20 69 6e 20 74 68 65 20 45 6e 67 6c 69 73 68  d in the English
5b00: 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a 0a 2a 2a   language..**.**
5b10: 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e 74 20 74   At the moment t
5b20: 68 65 72 65 20 69 73 20 6f 6e 6c 79 20 61 20 55  here is only a U
5b30: 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e 74 61 74  TF-8 implementat
5b40: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
5b50: 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69  nt nocaseCollati
5b60: 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a  ngFunc(.  void *
5b70: 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e 74 20 6e  NotUsed,.  int n
5b80: 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key1, const void
5b90: 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e   *pKey1,.  int n
5ba0: 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64  Key2, const void
5bb0: 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74   *pKey2.){.  int
5bc0: 20 72 20 3d 20 73 71 6c 69 74 65 33 53 74 72 4e   r = sqlite3StrN
5bd0: 49 43 6d 70 28 0a 20 20 20 20 20 20 28 63 6f 6e  ICmp(.      (con
5be0: 73 74 20 63 68 61 72 20 2a 29 70 4b 65 79 31 2c  st char *)pKey1,
5bf0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
5c00: 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c 6e 4b 65  Key2, (nKey1<nKe
5c10: 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65 79 32 29  y2)?nKey1:nKey2)
5c20: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
5c30: 45 54 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20  ETER(NotUsed);. 
5c40: 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a 20 20 20   if( 0==r ){.   
5c50: 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b 65 79 32   r = nKey1-nKey2
5c60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5c80: 6e 20 74 68 65 20 52 4f 57 49 44 20 6f 66 20 74  n the ROWID of t
5c90: 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 69  he most recent i
5ca0: 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69 74 65 5f  nsert.*/.sqlite_
5cb0: 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 6c 61  int64 sqlite3_la
5cc0: 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77 69 64 28  st_insert_rowid(
5cd0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69  sqlite3 *db){.#i
5ce0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
5cf0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
5d00: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
5d10: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
5d20: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
5d30: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
5d40: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
5d50: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
5d60: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d  db->lastRowid;.}
5d70: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5d80: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
5d90: 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74  nges in the most
5da0: 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
5db0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
5dc0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
5dd0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
5de0: 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  db){.#ifdef SQLI
5df0: 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52  TE_ENABLE_API_AR
5e00: 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74  MOR.  if( !sqlit
5e10: 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28  e3SafetyCheckOk(
5e20: 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64  db) ){.    (void
5e30: 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42  )SQLITE_MISUSE_B
5e40: 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  KPT;.    return 
5e50: 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  0;.  }.#endif.  
5e60: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61 6e  return db->nChan
5e70: 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ge;.}../*.** Ret
5e80: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
5e90: 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65 20  f changes since 
5ea0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
5eb0: 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a  dle was opened..
5ec0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 74  */.int sqlite3_t
5ed0: 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71 6c  otal_changes(sql
5ee0: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65  ite3 *db){.#ifde
5ef0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
5f00: 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
5f10: 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
5f20: 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
5f30: 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
5f40: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
5f50: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
5f60: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  dif.  return db-
5f70: 3e 6e 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d  >nTotalChange;.}
5f80: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c  ../*.** Close al
5f90: 6c 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  l open savepoint
5fa0: 73 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  s. This function
5fb0: 20 6f 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65   only manipulate
5fc0: 73 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a  s fields of the.
5fd0: 2a 2a 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ** database hand
5fe0: 6c 65 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f  le object, it do
5ff0: 65 73 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79  es not close any
6000: 20 73 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74   savepoints that
6010: 20 6d 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20   may be open.** 
6020: 61 74 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61  at the b-tree/pa
6030: 67 65 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f  ger level..*/.vo
6040: 69 64 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53  id sqlite3CloseS
6050: 61 76 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65  avepoints(sqlite
6060: 33 20 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28  3 *db){.  while(
6070: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20   db->pSavepoint 
6080: 29 7b 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74  ){.    Savepoint
6090: 20 2a 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61   *pTmp = db->pSa
60a0: 76 65 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d  vepoint;.    db-
60b0: 3e 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54  >pSavepoint = pT
60c0: 6d 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73  mp->pNext;.    s
60d0: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
60e0: 20 70 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62   pTmp);.  }.  db
60f0: 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->nSavepoint = 0
6100: 3b 0a 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65  ;.  db->nStateme
6110: 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73  nt = 0;.  db->is
6120: 54 72 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70  TransactionSavep
6130: 6f 69 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  oint = 0;.}../*.
6140: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65  ** Invoke the de
6150: 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f  structor functio
6160: 6e 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  n associated wit
6170: 68 20 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20  h FuncDef p, if 
6180: 61 6e 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20  any. Except,.** 
6190: 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74  if this is not t
61a0: 68 65 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20  he last copy of 
61b0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f  the function, do
61c0: 20 6e 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20   not invoke it. 
61d0: 4d 75 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69  Multiple.** copi
61e0: 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66  es of a single f
61f0: 75 6e 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61  unction are crea
6200: 74 65 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f  ted when create_
6210: 66 75 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61  function() is ca
6220: 6c 6c 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c  lled.** with SQL
6230: 49 54 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65  ITE_ANY as the e
6240: 6e 63 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  ncoding..*/.stat
6250: 69 63 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e  ic void function
6260: 44 65 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20  Destroy(sqlite3 
6270: 2a 64 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29  *db, FuncDef *p)
6280: 7b 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  {.  FuncDestruct
6290: 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20  or *pDestructor 
62a0: 3d 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72  = p->pDestructor
62b0: 3b 0a 20 20 69 66 28 20 70 44 65 73 74 72 75 63  ;.  if( pDestruc
62c0: 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74  tor ){.    pDest
62d0: 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  ructor->nRef--;.
62e0: 20 20 20 20 69 66 28 20 70 44 65 73 74 72 75 63      if( pDestruc
62f0: 74 6f 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  tor->nRef==0 ){.
6300: 20 20 20 20 20 20 70 44 65 73 74 72 75 63 74 6f        pDestructo
6310: 72 2d 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73  r->xDestroy(pDes
6320: 74 72 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61  tructor->pUserDa
6330: 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ta);.      sqlit
6340: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 65  e3DbFree(db, pDe
6350: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
6360: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69  .  }.}../*.** Di
6370: 73 63 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c  sconnect all sql
6380: 69 74 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74  ite3_vtab object
6390: 73 20 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f  s that belong to
63a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
63b0: 74 69 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73  tion.** db. This
63c0: 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20   is called when 
63d0: 64 62 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73  db is being clos
63e0: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
63f0: 69 64 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c  id disconnectAll
6400: 56 74 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62  Vtab(sqlite3 *db
6410: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
6420: 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
6430: 42 4c 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73  BLE.  int i;.  s
6440: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
6450: 41 6c 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69  All(db);.  for(i
6460: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
6470: 2b 2b 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20  ++){.    Schema 
6480: 2a 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61  *pSchema = db->a
6490: 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[i].pSchema;. 
64a0: 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69     if( db->aDb[i
64b0: 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ].pSchema ){.   
64c0: 20 20 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a     HashElem *p;.
64d0: 20 20 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69        for(p=sqli
64e0: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 53 63  teHashFirst(&pSc
64f0: 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20  hema->tblHash); 
6500: 70 3b 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e  p; p=sqliteHashN
6510: 65 78 74 28 70 29 29 7b 0a 20 20 20 20 20 20 20  ext(p)){.       
6520: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28   Table *pTab = (
6530: 54 61 62 6c 65 20 2a 29 73 71 6c 69 74 65 48 61  Table *)sqliteHa
6540: 73 68 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20  shData(p);.     
6550: 20 20 20 69 66 28 20 49 73 56 69 72 74 75 61 6c     if( IsVirtual
6560: 28 70 54 61 62 29 20 29 20 73 71 6c 69 74 65 33  (pTab) ) sqlite3
6570: 56 74 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64  VtabDisconnect(d
6580: 62 2c 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20  b, pTab);.      
6590: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
65a0: 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c  lite3VtabUnlockL
65b0: 69 73 74 28 64 62 29 3b 0a 20 20 73 71 6c 69 74  ist(db);.  sqlit
65c0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
65d0: 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55  db);.#else.  UNU
65e0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
65f0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  );.#endif.}../*.
6600: 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
6610: 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  f database conne
6620: 63 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e 66  ction db has unf
6630: 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65  inalized prepare
6640: 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20  d.** statements 
6650: 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71  or unfinished sq
6660: 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a  lite3_backup obj
6670: 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69  ects.  .*/.stati
6680: 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e  c int connection
6690: 49 73 42 75 73 79 28 73 71 6c 69 74 65 33 20 2a  IsBusy(sqlite3 *
66a0: 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20  db){.  int j;.  
66b0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
66c0: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
66d0: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 64  utex) );.  if( d
66e0: 62 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75 72  b->pVdbe ) retur
66f0: 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20  n 1;.  for(j=0; 
6700: 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b  j<db->nDb; j++){
6710: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74 20  .    Btree *pBt 
6720: 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74  = db->aDb[j].pBt
6730: 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26 26  ;.    if( pBt &&
6740: 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73 49   sqlite3BtreeIsI
6750: 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29 20 72  nBackup(pBt) ) r
6760: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72  eturn 1;.  }.  r
6770: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
6780: 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73 74  * Close an exist
6790: 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61 62  ing SQLite datab
67a0: 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ase.*/.static in
67b0: 74 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 73  t sqlite3Close(s
67c0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
67d0: 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20  forceZombie){.  
67e0: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 2f  if( !db ){.    /
67f0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
6800: 2d 36 33 32 35 37 2d 31 31 37 34 30 20 43 61 6c  -63257-11740 Cal
6810: 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 63 6c 6f  ling sqlite3_clo
6820: 73 65 28 29 20 6f 72 0a 20 20 20 20 2a 2a 20 73  se() or.    ** s
6830: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28  qlite3_close_v2(
6840: 29 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 70 6f  ) with a NULL po
6850: 69 6e 74 65 72 20 61 72 67 75 6d 65 6e 74 20 69  inter argument i
6860: 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
6870: 6f 70 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  op. */.    retur
6880: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
6890: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
68a0: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
68b0: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
68c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
68d0: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 73  SE_BKPT;.  }.  s
68e0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
68f0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 0a  er(db->mutex);..
6900: 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73 63    /* Force xDisc
6910: 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e 20  onnect calls on 
6920: 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62 6c  all virtual tabl
6930: 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e 65  es */.  disconne
6940: 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a 0a  ctAllVtab(db);..
6950: 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61    /* If a transa
6960: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 74  ction is open, t
6970: 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c  he disconnectAll
6980: 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f 76  Vtab() call abov
6990: 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20  e.  ** will not 
69a0: 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65 20  have called the 
69b0: 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d 65  xDisconnect() me
69c0: 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72 74  thod on any virt
69d0: 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73 20  ual.  ** tables 
69e0: 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72 61  in the db->aVTra
69f0: 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65 20  ns[] array. The 
6a00: 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74 65  following sqlite
6a10: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29 0a  3VtabRollback().
6a20: 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 64    ** call will d
6a30: 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74 6f  o so. We need to
6a40: 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65 20   do this before 
6a50: 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61 63  the check for ac
6a60: 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73 74  tive.  ** SQL st
6a70: 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c 20  atements below, 
6a80: 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20 69  as the v-table i
6a90: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d 61  mplementation ma
6aa0: 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20 2a  y be storing.  *
6ab0: 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64 20  * some prepared 
6ac0: 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65 72  statements inter
6ad0: 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73 71  nally..  */.  sq
6ae0: 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61 63  lite3VtabRollbac
6af0: 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65 67  k(db);..  /* Leg
6b00: 61 63 79 20 62 65 68 61 76 69 6f 72 20 28 73 71  acy behavior (sq
6b10: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62 65  lite3_close() be
6b20: 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72 65  havior) is to re
6b30: 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45  turn.  ** SQLITE
6b40: 5f 42 55 53 59 20 69 66 20 74 68 65 20 63 6f 6e  _BUSY if the con
6b50: 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74 20  nection can not 
6b60: 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64 69  be closed immedi
6b70: 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  ately..  */.  if
6b80: 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20 26  ( !forceZombie &
6b90: 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75  & connectionIsBu
6ba0: 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71  sy(db) ){.    sq
6bb0: 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
6bc0: 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  g(db, SQLITE_BUS
6bd0: 59 2c 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c  Y, "unable to cl
6be0: 6f 73 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e  ose due to unfin
6bf0: 61 6c 69 7a 65 64 20 22 0a 20 20 20 20 20 20 20  alized ".       
6c00: 22 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75  "statements or u
6c10: 6e 66 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70  nfinished backup
6c20: 73 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s");.    sqlite3
6c30: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
6c40: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74  >mutex);.    ret
6c50: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
6c60: 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  .  }..#ifdef SQL
6c70: 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
6c80: 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  G.  if( sqlite3G
6c90: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
6ca0: 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c  log ){.    /* Cl
6cb0: 6f 73 69 6e 67 20 74 68 65 20 68 61 6e 64 6c 65  osing the handle
6cc0: 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74  . Fourth paramet
6cd0: 65 72 20 69 73 20 70 61 73 73 65 64 20 74 68 65  er is passed the
6ce0: 20 76 61 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20   value 2. */.   
6cf0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
6d00: 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c  nfig.xSqllog(sql
6d10: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
6d20: 2e 70 53 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c  .pSqllogArg, db,
6d30: 20 30 2c 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 2);.  }.#end
6d40: 69 66 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74  if..  /* Convert
6d50: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
6d60: 69 6e 74 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e  into a zombie an
6d70: 64 20 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e  d then close it.
6d80: 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69  .  */.  db->magi
6d90: 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
6da0: 5f 5a 4f 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74  _ZOMBIE;.  sqlit
6db0: 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43  e3LeaveMutexAndC
6dc0: 6c 6f 73 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a  loseZombie(db);.
6dd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
6de0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f  OK;.}../*.** Two
6df0: 20 76 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74   variations on t
6e00: 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65 72 66  he public interf
6e10: 61 63 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20  ace for closing 
6e20: 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
6e30: 6e 6e 65 63 74 69 6f 6e 2e 20 54 68 65 20 73 71  nnection. The sq
6e40: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 76 65  lite3_close() ve
6e50: 72 73 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51  rsion returns SQ
6e60: 4c 49 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a  LITE_BUSY and.**
6e70: 20 6c 65 61 76 65 73 20 74 68 65 20 63 6f 6e 6e   leaves the conn
6e80: 65 63 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66  ection option if
6e90: 20 74 68 65 72 65 20 61 72 65 20 75 6e 66 69 6e   there are unfin
6ea0: 61 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a  alized prepared.
6eb0: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72  ** statements or
6ec0: 20 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69   unfinished sqli
6ed0: 74 65 33 5f 62 61 63 6b 75 70 73 2e 20 20 54 68  te3_backups.  Th
6ee0: 65 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f  e sqlite3_close_
6ef0: 76 32 28 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20  v2().** version 
6f00: 66 6f 72 63 65 73 20 74 68 65 20 63 6f 6e 6e 65  forces the conne
6f10: 63 74 69 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20  ction to become 
6f20: 61 20 7a 6f 6d 62 69 65 20 69 66 20 74 68 65 72  a zombie if ther
6f30: 65 20 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65  e are.** unclose
6f40: 64 20 72 65 73 6f 75 72 63 65 73 2c 20 61 6e 64  d resources, and
6f50: 20 61 72 72 61 6e 67 65 73 20 66 6f 72 20 64 65   arranges for de
6f60: 61 6c 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20  allocation when 
6f70: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70  the last.** prep
6f80: 61 72 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  are statement or
6f90: 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
6fa0: 63 6c 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73  closes..*/.int s
6fb0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c  qlite3_close(sql
6fc0: 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72  ite3 *db){ retur
6fd0: 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64  n sqlite3Close(d
6fe0: 62 2c 30 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69  b,0); }.int sqli
6ff0: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c  te3_close_v2(sql
7000: 69 74 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72  ite3 *db){ retur
7010: 6e 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64  n sqlite3Close(d
7020: 62 2c 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  b,1); }.../*.** 
7030: 43 6c 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20  Close the mutex 
7040: 6f 6e 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  on database conn
7050: 65 63 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a  ection db..**.**
7060: 20 46 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66   Furthermore, if
7070: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
7080: 74 69 6f 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d  tion db is a zom
7090: 62 69 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61  bie (meaning tha
70a0: 74 20 74 68 65 72 65 0a 2a 2a 20 68 61 73 20 62  t there.** has b
70b0: 65 65 6e 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  een a prior call
70c0: 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73   to sqlite3_clos
70d0: 65 28 64 62 29 20 6f 72 20 73 71 6c 69 74 65 33  e(db) or sqlite3
70e0: 5f 63 6c 6f 73 65 5f 76 32 28 64 62 29 29 20 61  _close_v2(db)) a
70f0: 6e 64 0a 2a 2a 20 65 76 65 72 79 20 73 71 6c 69  nd.** every sqli
7100: 74 65 33 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77  te3_stmt has now
7110: 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20   been finalized 
7120: 61 6e 64 20 65 76 65 72 79 20 73 71 6c 69 74 65  and every sqlite
7130: 33 5f 62 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20  3_backup has.** 
7140: 66 69 6e 69 73 68 65 64 2c 20 74 68 65 6e 20 66  finished, then f
7150: 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65  ree all resource
7160: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
7170: 65 33 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43  e3LeaveMutexAndC
7180: 6c 6f 73 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74  loseZombie(sqlit
7190: 65 33 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45  e3 *db){.  HashE
71a0: 6c 65 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20  lem *i;         
71b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61             /* Ha
71c0: 73 68 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f  sh table iterato
71d0: 72 20 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20  r */.  int j;.. 
71e0: 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
71f0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 73 71 6c   outstanding sql
7200: 69 74 65 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c  ite3_stmt or sql
7210: 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65  ite3_backup obje
7220: 63 74 73 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74  cts.  ** or if t
7230: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  he connection ha
7240: 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63  s not yet been c
7250: 6c 6f 73 65 64 20 62 79 20 73 71 6c 69 74 65 33  losed by sqlite3
7260: 5f 63 6c 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a  _close_v2(),.  *
7270: 2a 20 74 68 65 6e 20 6a 75 73 74 20 6c 65 61 76  * then just leav
7280: 65 20 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20  e the mutex and 
7290: 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
72a0: 66 28 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51  f( db->magic!=SQ
72b0: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
72c0: 45 20 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49  E || connectionI
72d0: 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20  sBusy(db) ){.   
72e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
72f0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
7300: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
7310: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61  ..  /* If we rea
7320: 63 68 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69  ch this point, i
7330: 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
7340: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
7350: 74 69 6f 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c  tion has.  ** cl
7360: 6f 73 65 64 20 61 6c 6c 20 73 71 6c 69 74 65 33  osed all sqlite3
7370: 5f 73 74 6d 74 20 61 6e 64 20 73 71 6c 69 74 65  _stmt and sqlite
7380: 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73  3_backup objects
7390: 20 61 6e 64 20 68 61 73 20 62 65 65 6e 0a 20 20   and has been.  
73a0: 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c  ** passed to sql
73b0: 69 74 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e  ite3_close (mean
73c0: 69 6e 67 20 74 68 61 74 20 69 74 20 69 73 20 61  ing that it is a
73d0: 20 7a 6f 6d 62 69 65 29 2e 20 20 54 68 65 72 65   zombie).  There
73e0: 66 6f 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68  fore,.  ** go ah
73f0: 65 61 64 20 61 6e 64 20 66 72 65 65 20 61 6c 6c  ead and free all
7400: 20 72 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f   resources..  */
7410: 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e  ..  /* If a tran
7420: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c  saction is open,
7430: 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54   roll it back. T
7440: 68 69 73 20 61 6c 73 6f 20 65 6e 73 75 72 65 73  his also ensures
7450: 20 74 68 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e   that if.  ** an
7460: 79 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  y database schem
7470: 61 73 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64  as have been mod
7480: 69 66 69 65 64 20 62 79 20 61 6e 20 75 6e 63 6f  ified by an unco
7490: 6d 6d 69 74 74 65 64 20 74 72 61 6e 73 61 63 74  mmitted transact
74a0: 69 6f 6e 0a 20 20 2a 2a 20 74 68 65 79 20 61 72  ion.  ** they ar
74b0: 65 20 72 65 73 65 74 2e 20 41 6e 64 20 74 68 61  e reset. And tha
74c0: 74 20 74 68 65 20 72 65 71 75 69 72 65 64 20 62  t the required b
74d0: 2d 74 72 65 65 20 6d 75 74 65 78 20 69 73 20 68  -tree mutex is h
74e0: 65 6c 64 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a  eld to make.  **
74f0: 20 74 68 65 20 70 61 67 65 72 20 72 6f 6c 6c 62   the pager rollb
7500: 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72  ack and schema r
7510: 65 73 65 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f  eset an atomic o
7520: 70 65 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73  peration. */.  s
7530: 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c  qlite3RollbackAl
7540: 6c 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29  l(db, SQLITE_OK)
7550: 3b 0a 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79  ;..  /* Free any
7560: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76   outstanding Sav
7570: 65 70 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65  epoint structure
7580: 73 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43  s. */.  sqlite3C
7590: 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64  loseSavepoints(d
75a0: 62 29 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20  b);..  /* Close 
75b0: 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  all database con
75c0: 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f  nections */.  fo
75d0: 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62  r(j=0; j<db->nDb
75e0: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; j++){.    stru
75f0: 63 74 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62  ct Db *pDb = &db
7600: 2d 3e 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66  ->aDb[j];.    if
7610: 28 20 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20  ( pDb->pBt ){.  
7620: 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
7630: 43 6c 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b  Close(pDb->pBt);
7640: 0a 20 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20  .      pDb->pBt 
7650: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a  = 0;.      if( j
7660: 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70  !=1 ){.        p
7670: 44 62 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b  Db->pSchema = 0;
7680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7690: 20 7d 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68   }.  /* Clear th
76a0: 65 20 54 45 4d 50 20 73 63 68 65 6d 61 20 73 65  e TEMP schema se
76b0: 70 61 72 61 74 65 6c 79 20 61 6e 64 20 6c 61 73  parately and las
76c0: 74 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61  t */.  if( db->a
76d0: 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b  Db[1].pSchema ){
76e0: 0a 20 20 20 20 73 71 6c 69 74 65 33 53 63 68 65  .    sqlite3Sche
76f0: 6d 61 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b  maClear(db->aDb[
7700: 31 5d 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d  1].pSchema);.  }
7710: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e  .  sqlite3VtabUn
7720: 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20  lockList(db);.. 
7730: 20 2f 2a 20 46 72 65 65 20 75 70 20 74 68 65 20   /* Free up the 
7740: 61 72 72 61 79 20 6f 66 20 61 75 78 69 6c 69 61  array of auxilia
7750: 72 79 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a  ry databases */.
7760: 20 20 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73    sqlite3Collaps
7770: 65 44 61 74 61 62 61 73 65 41 72 72 61 79 28 64  eDatabaseArray(d
7780: 62 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62  b);.  assert( db
7790: 2d 3e 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73  ->nDb<=2 );.  as
77a0: 73 65 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64  sert( db->aDb==d
77b0: 62 2d 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a  b->aDbStatic );.
77c0: 0a 20 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63  .  /* Tell the c
77d0: 6f 64 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20  ode in notify.c 
77e0: 74 68 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74  that the connect
77f0: 69 6f 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f  ion no longer ho
7800: 6c 64 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63  lds any.  ** loc
7810: 6b 73 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ks and does not 
7820: 72 65 71 75 69 72 65 20 61 6e 79 20 66 75 72 74  require any furt
7830: 68 65 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66  her unlock-notif
7840: 79 20 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a  y callbacks..  *
7850: 2f 0a 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65  /.  sqlite3Conne
7860: 63 74 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b  ctionClosed(db);
7870: 0a 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41  ..  for(j=0; j<A
7880: 72 72 61 79 53 69 7a 65 28 64 62 2d 3e 61 46 75  rraySize(db->aFu
7890: 6e 63 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nc.a); j++){.   
78a0: 20 46 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c   FuncDef *pNext,
78b0: 20 2a 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20   *pHash, *p;.   
78c0: 20 66 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63   for(p=db->aFunc
78d0: 2e 61 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73  .a[j]; p; p=pHas
78e0: 68 29 7b 0a 20 20 20 20 20 20 70 48 61 73 68 20  h){.      pHash 
78f0: 3d 20 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20  = p->pHash;.    
7900: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
7910: 20 20 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65        functionDe
7920: 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20  stroy(db, p);.  
7930: 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d        pNext = p-
7940: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
7950: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
7960: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20  , p);.        p 
7970: 3d 20 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d  = pNext;.      }
7980: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
7990: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
79a0: 73 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  st(&db->aCollSeq
79b0: 29 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61  ); i; i=sqliteHa
79c0: 73 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20  shNext(i)){.    
79d0: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
79e0: 20 28 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69   (CollSeq *)sqli
79f0: 74 65 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20  teHashData(i);. 
7a00: 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79     /* Invoke any
7a10: 20 64 65 73 74 72 75 63 74 6f 72 73 20 72 65 67   destructors reg
7a20: 69 73 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c  istered for coll
7a30: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75  ation sequence u
7a40: 73 65 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  ser data. */.   
7a50: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a   for(j=0; j<3; j
7a60: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  ++){.      if( p
7a70: 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a  Coll[j].xDel ){.
7a80: 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d          pColl[j]
7a90: 2e 78 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70  .xDel(pColl[j].p
7aa0: 55 73 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  User);.      }. 
7ab0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7ac0: 44 62 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c  DbFree(db, pColl
7ad0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
7ae0: 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61  HashClear(&db->a
7af0: 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65  CollSeq);.#ifnde
7b00: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
7b10: 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72  RTUALTABLE.  for
7b20: 28 69 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72  (i=sqliteHashFir
7b30: 73 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  st(&db->aModule)
7b40: 3b 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73  ; i; i=sqliteHas
7b50: 68 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d  hNext(i)){.    M
7b60: 6f 64 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d  odule *pMod = (M
7b70: 6f 64 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61  odule *)sqliteHa
7b80: 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69  shData(i);.    i
7b90: 66 28 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f  f( pMod->xDestro
7ba0: 79 20 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d  y ){.      pMod-
7bb0: 3e 78 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e  >xDestroy(pMod->
7bc0: 70 41 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20  pAux);.    }.   
7bd0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7be0: 62 2c 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20  b, pMod);.  }.  
7bf0: 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72  sqlite3HashClear
7c00: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a  (&db->aModule);.
7c10: 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65  #endif..  sqlite
7c20: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
7c30: 45 5f 4f 4b 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f  E_OK); /* Deallo
7c40: 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65 64  cates any cached
7c50: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e 20   error strings. 
7c60: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75  */.  sqlite3Valu
7c70: 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29 3b  eFree(db->pErr);
7c80: 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 45  .  sqlite3CloseE
7c90: 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 23  xtensions(db);.#
7ca0: 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
7cb0: 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
7cc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
7cd0: 3e 61 75 74 68 2e 7a 41 75 74 68 55 73 65 72 29  >auth.zAuthUser)
7ce0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
7cf0: 28 64 62 2d 3e 61 75 74 68 2e 7a 41 75 74 68 50  (db->auth.zAuthP
7d00: 57 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 62  W);.#endif..  db
7d10: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
7d20: 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20  _MAGIC_ERROR;.. 
7d30: 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61 74   /* The temp-dat
7d40: 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73 20  abase schema is 
7d50: 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65 72  allocated differ
7d60: 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f  ently from the o
7d70: 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a  ther schema.  **
7d80: 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67 20   objects (using 
7d90: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64  sqliteMalloc() d
7da0: 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
7db0: 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65 65   of sqlite3Btree
7dc0: 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20  Schema())..  ** 
7dd0: 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  So it needs to b
7de0: 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54 6f  e freed here. To
7df0: 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c  do: Why not roll
7e00: 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d 61   the temp schema
7e10: 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73   into.  ** the s
7e20: 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  ame sqliteMalloc
7e30: 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74 68  () as the one th
7e40: 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68 65  at allocates the
7e50: 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a 20   database .  ** 
7e60: 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a  structure?.  */.
7e70: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
7e80: 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70  db, db->aDb[1].p
7e90: 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74  Schema);.  sqlit
7ea0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
7eb0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d  b->mutex);.  db-
7ec0: 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f  >magic = SQLITE_
7ed0: 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20  MAGIC_CLOSED;.  
7ee0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66 72  sqlite3_mutex_fr
7ef0: 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ee(db->mutex);. 
7f00: 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f   assert( db->loo
7f10: 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29  kaside.nOut==0 )
7f20: 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61  ;  /* Fails on a
7f30: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
7f40: 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20  y leak */.  if( 
7f50: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
7f60: 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20 73  alloced ){.    s
7f70: 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d 3e  qlite3_free(db->
7f80: 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72 74  lookaside.pStart
7f90: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
7fa0: 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a  _free(db);.}../*
7fb0: 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
7fc0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
7fd0: 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69 73    If tripCode is
7fe0: 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20   not SQLITE_OK, 
7ff0: 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 6f 70 65 6e  then.** any open
8000: 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e 76   cursors are inv
8010: 61 6c 69 64 61 74 65 64 20 28 22 74 72 69 70 70  alidated ("tripp
8020: 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72 69  ed" - as in "tri
8030: 70 70 69 6e 67 20 61 20 63 69 72 63 75 69 74 0a  pping a circuit.
8040: 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e 64  ** breaker") and
8050: 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e 20   made to return 
8060: 74 72 69 70 43 6f 64 65 20 69 66 20 74 68 65 72  tripCode if ther
8070: 65 20 61 72 65 20 61 6e 79 20 66 75 72 74 68 65  e are any furthe
8080: 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74 6f  r.** attempts to
8090: 20 75 73 65 20 74 68 61 74 20 63 75 72 73 6f 72   use that cursor
80a0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
80b0: 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c  3RollbackAll(sql
80c0: 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 74 72  ite3 *db, int tr
80d0: 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69  ipCode){.  int i
80e0: 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73 20  ;.  int inTrans 
80f0: 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 73  = 0;.  assert( s
8100: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
8110: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
8120: 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65    sqlite3BeginBe
8130: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20  nignMalloc();.. 
8140: 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62   /* Obtain all b
8150: 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 62 65  -tree mutexes be
8160: 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20  fore making any 
8170: 63 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52 6f  calls to BtreeRo
8180: 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20  llback(). .  ** 
8190: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
81a0: 74 20 69 6e 20 63 61 73 65 20 74 68 65 20 74 72  t in case the tr
81b0: 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67 20  ansaction being 
81c0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73 0a  rolled back has.
81d0: 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74 68    ** modified th
81e0: 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
81f0: 61 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65 65  a. If the b-tree
8200: 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f 74   mutexes are not
8210: 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65   taken.  ** here
8220: 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20 73  , then another s
8230: 68 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e  hared-cache conn
8240: 65 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65  ection might sne
8250: 61 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20 20  ak in between.  
8260: 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
8270: 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63 68  rollback and sch
8280: 65 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63 68  ema reset, which
8290: 20 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73 65   can cause false
82a0: 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e  .  ** corruption
82b0: 20 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65   reports in some
82c0: 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71   cases.  */.  sq
82d0: 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
82e0: 6c 6c 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69  ll(db);..  for(i
82f0: 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69  =0; i<db->nDb; i
8300: 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a  ++){.    Btree *
8310: 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  p = db->aDb[i].p
8320: 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b  Bt;.    if( p ){
8330: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
8340: 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73  e3BtreeIsInTrans
8350: 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  (p) ){.        i
8360: 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20  nTrans = 1;.    
8370: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
8380: 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70  3BtreeRollback(p
8390: 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20 20  , tripCode);.   
83a0: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
83b0: 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29  VtabRollback(db)
83c0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65  ;.  sqlite3EndBe
83d0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20  nignMalloc();.. 
83e0: 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73 26   if( (db->flags&
83f0: 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68 61  SQLITE_InternCha
8400: 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d 3e  nges)!=0 && db->
8410: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a  init.busy==0 ){.
8420: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72      sqlite3Expir
8430: 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  ePreparedStateme
8440: 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71 6c  nts(db);.    sql
8450: 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68 65  ite3ResetAllSche
8460: 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28  masOfConnection(
8470: 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  db);.  }.  sqlit
8480: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
8490: 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64  db);..  /* Any d
84a0: 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61 69  eferred constrai
84b0: 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61  nt violations ha
84c0: 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f  ve now been reso
84d0: 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e  lved. */.  db->n
84e0: 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20 30  DeferredCons = 0
84f0: 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  ;.  db->nDeferre
8500: 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  dImmCons = 0;.  
8510: 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51  db->flags &= ~SQ
8520: 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a 0a  LITE_DeferFKs;..
8530: 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73 20    /* If one has 
8540: 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c  been configured,
8550: 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c   invoke the roll
8560: 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61  back-hook callba
8570: 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ck */.  if( db->
8580: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
8590: 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c  k && (inTrans ||
85a0: 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74   !db->autoCommit
85b0: 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f  ) ){.    db->xRo
85c0: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64  llbackCallback(d
85d0: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29  b->pRollbackArg)
85e0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
85f0: 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20 73  eturn a static s
8600: 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67  tring containing
8610: 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65 73   the name corres
8620: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 65  ponding to the e
8630: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65  rror code.** spe
8640: 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61 72  cified in the ar
8650: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 28  gument..*/.#if (
8660: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
8670: 45 42 55 47 29 20 26 26 20 53 51 4c 49 54 45 5f  EBUG) && SQLITE_
8680: 4f 53 5f 57 49 4e 29 20 7c 7c 20 64 65 66 69 6e  OS_WIN) || defin
8690: 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a  ed(SQLITE_TEST).
86a0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
86b0: 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72  te3ErrName(int r
86c0: 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  c){.  const char
86d0: 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69   *zName = 0;.  i
86e0: 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72  nt i, origRc = r
86f0: 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  c;.  for(i=0; i<
8700: 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69  2 && zName==0; i
8710: 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b  ++, rc &= 0xff){
8720: 0a 20 20 20 20 73 77 69 74 63 68 28 20 72 63 20  .    switch( rc 
8730: 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  ){.      case SQ
8740: 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20  LITE_OK:        
8750: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8760: 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20   "SQLITE_OK";   
8770: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
8780: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8790: 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20  QLITE_ERROR:    
87a0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
87b0: 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22  = "SQLITE_ERROR"
87c0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
87d0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
87e0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a  SQLITE_INTERNAL:
87f0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
8800: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52   = "SQLITE_INTER
8810: 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62  NAL";          b
8820: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8830: 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20   SQLITE_PERM:   
8840: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
8850: 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d  e = "SQLITE_PERM
8860: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
8870: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8880: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20  e SQLITE_ABORT: 
8890: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
88a0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f  me = "SQLITE_ABO
88b0: 52 54 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RT";            
88c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
88d0: 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  se SQLITE_ABORT_
88e0: 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e  ROLLBACK:     zN
88f0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42  ame = "SQLITE_AB
8900: 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20  ORT_ROLLBACK";  
8910: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8920: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a  ase SQLITE_BUSY:
8930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
8940: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
8950: 55 53 59 22 3b 20 20 20 20 20 20 20 20 20 20 20  USY";           
8960: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8970: 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59  case SQLITE_BUSY
8980: 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20  _RECOVERY:      
8990: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
89a0: 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20  BUSY_RECOVERY"; 
89b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
89c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53   case SQLITE_BUS
89d0: 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20  Y_SNAPSHOT:     
89e0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
89f0: 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b  _BUSY_SNAPSHOT";
8a00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8a10: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f    case SQLITE_LO
8a20: 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20 20 20  CKED:           
8a30: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8a40: 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20  E_LOCKED";      
8a50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8a60: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c     case SQLITE_L
8a70: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
8a80: 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  E: zName = "SQLI
8a90: 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44  TE_LOCKED_SHARED
8aa0: 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20  CACHE";break;.  
8ab0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8ac0: 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20  NOMEM:          
8ad0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8ae0: 49 54 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20  ITE_NOMEM";     
8af0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8b00: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8b10: 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20  _READONLY:      
8b20: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8b30: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20  LITE_READONLY"; 
8b40: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8b50: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8b60: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56  E_READONLY_RECOV
8b70: 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ERY:  zName = "S
8b80: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
8b90: 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b  ECOVERY"; break;
8ba0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8bb0: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
8bc0: 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  LOCK:  zName = "
8bd0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
8be0: 43 41 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61 6b  CANTLOCK"; break
8bf0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8c00: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
8c10: 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20  LBACK:  zName = 
8c20: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
8c30: 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61  _ROLLBACK"; brea
8c40: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8c50: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
8c60: 4d 4f 56 45 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  MOVED:   zName =
8c70: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
8c80: 59 5f 44 42 4d 4f 56 45 44 22 3b 20 20 62 72 65  Y_DBMOVED";  bre
8c90: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8ca0: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 3a  QLITE_INTERRUPT:
8cb0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
8cc0: 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 52  = "SQLITE_INTERR
8cd0: 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 62 72  UPT";         br
8ce0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8cf0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3a 20 20 20  SQLITE_IOERR:   
8d00: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
8d10: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8d20: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
8d30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8d40: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45   SQLITE_IOERR_RE
8d50: 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  AD:         zNam
8d60: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8d70: 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20 20  R_READ";        
8d80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8d90: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
8da0: 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61  HORT_READ:   zNa
8db0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8dc0: 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b 20  RR_SHORT_READ"; 
8dd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8de0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8df0: 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a 4e  WRITE:        zN
8e00: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8e10: 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20 20  ERR_WRITE";     
8e20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8e30: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8e40: 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20 7a  _FSYNC:        z
8e50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8e60: 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20 20  OERR_FSYNC";    
8e70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8e80: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8e90: 52 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20 20  R_DIR_FSYNC:    
8ea0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8eb0: 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43 22  IOERR_DIR_FSYNC"
8ec0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
8ed0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8ee0: 52 52 5f 54 52 55 4e 43 41 54 45 3a 20 20 20 20  RR_TRUNCATE:    
8ef0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8f00: 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45 22  _IOERR_TRUNCATE"
8f10: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
8f20: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8f30: 45 52 52 5f 46 53 54 41 54 3a 20 20 20 20 20 20  ERR_FSTAT:      
8f40: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8f50: 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 22 3b 20  E_IOERR_FSTAT"; 
8f60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8f70: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8f80: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20  OERR_UNLOCK:    
8f90: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8fa0: 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22  TE_IOERR_UNLOCK"
8fb0: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
8fc0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8fd0: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20  IOERR_RDLOCK:   
8fe0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8ff0: 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b  ITE_IOERR_RDLOCK
9000: 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ";      break;. 
9010: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9020: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 3a 20 20  _IOERR_DELETE:  
9030: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9040: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54  LITE_IOERR_DELET
9050: 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  E";      break;.
9060: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9070: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20  E_IOERR_NOMEM:  
9080: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9090: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
90a0: 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  M";       break;
90b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
90c0: 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3a  TE_IOERR_ACCESS:
90d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
90e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43  SQLITE_IOERR_ACC
90f0: 45 53 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b  ESS";      break
9100: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9110: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
9120: 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20  ESERVEDLOCK:.   
9130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9150: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
9160: 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44  RR_CHECKRESERVED
9170: 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LOCK"; break;.  
9180: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9190: 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20  IOERR_LOCK:     
91a0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
91b0: 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b  ITE_IOERR_LOCK";
91c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
91d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
91e0: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20  _IOERR_CLOSE:   
91f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9200: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45  LITE_IOERR_CLOSE
9210: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
9220: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9230: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
9240: 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  E:    zName = "S
9250: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
9260: 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61 6b 3b  CLOSE";   break;
9270: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9280: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
9290: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
92a0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
92b0: 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65 61 6b  OPEN";     break
92c0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
92d0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
92e0: 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  E:      zName = 
92f0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
9300: 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72 65 61  MSIZE";     brea
9310: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9320: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f  LITE_IOERR_SHMLO
9330: 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  CK:      zName =
9340: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
9350: 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72 65  HMLOCK";     bre
9360: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9370: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
9380: 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  AP:       zName 
9390: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
93a0: 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20 62 72  SHMMAP";      br
93b0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
93c0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
93d0: 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  K:         zName
93e0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
93f0: 5f 53 45 45 4b 22 3b 20 20 20 20 20 20 20 20 62  _SEEK";        b
9400: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9410: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45   SQLITE_IOERR_DE
9420: 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d  LETE_NOENT: zNam
9430: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
9440: 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b  R_DELETE_NOENT";
9450: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9460: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d  e SQLITE_IOERR_M
9470: 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  MAP:         zNa
9480: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
9490: 52 52 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20 20  RR_MMAP";       
94a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
94b0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
94c0: 47 45 54 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e  GETTEMPPATH:  zN
94d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
94e0: 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54 48 22  ERR_GETTEMPPATH"
94f0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
9500: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
9510: 5f 43 4f 4e 56 50 41 54 48 3a 20 20 20 20 20 7a  _CONVPATH:     z
9520: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
9530: 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 22 3b 20  OERR_CONVPATH"; 
9540: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9550: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52  case SQLITE_CORR
9560: 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  UPT:            
9570: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9580: 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20 20  CORRUPT";       
9590: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
95a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
95b0: 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20 20  RUPT_VTAB:      
95c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
95d0: 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b 20  _CORRUPT_VTAB"; 
95e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
95f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
9600: 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20 20  TFOUND:         
9610: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9620: 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20  E_NOTFOUND";    
9630: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9640: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
9650: 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20 20  ULL:            
9660: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9670: 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20 20  TE_FULL";       
9680: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9690: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
96a0: 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20 20  CANTOPEN:       
96b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
96c0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20  ITE_CANTOPEN";  
96d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
96e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
96f0: 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50  _CANTOPEN_NOTEMP
9700: 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  DIR: zName = "SQ
9710: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f  LITE_CANTOPEN_NO
9720: 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a  TEMPDIR";break;.
9730: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9740: 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
9750: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
9760: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49  QLITE_CANTOPEN_I
9770: 53 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b 3b  SDIR";    break;
9780: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9790: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
97a0: 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  PATH:  zName = "
97b0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
97c0: 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61 6b  FULLPATH"; break
97d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
97e0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
97f0: 56 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  VPATH:  zName = 
9800: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
9810: 5f 43 4f 4e 56 50 41 54 48 22 3b 20 62 72 65 61  _CONVPATH"; brea
9820: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9830: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20  LITE_PROTOCOL:  
9840: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9850: 20 22 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f   "SQLITE_PROTOCO
9860: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  L";          bre
9870: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9880: 51 4c 49 54 45 5f 45 4d 50 54 59 3a 20 20 20 20  QLITE_EMPTY:    
9890: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
98a0: 3d 20 22 53 51 4c 49 54 45 5f 45 4d 50 54 59 22  = "SQLITE_EMPTY"
98b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
98c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
98d0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 3a 20 20  SQLITE_SCHEMA:  
98e0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
98f0: 20 3d 20 22 53 51 4c 49 54 45 5f 53 43 48 45 4d   = "SQLITE_SCHEM
9900: 41 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  A";            b
9910: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9920: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 3a 20   SQLITE_TOOBIG: 
9930: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9940: 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42  e = "SQLITE_TOOB
9950: 49 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  IG";            
9960: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9970: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
9980: 49 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  INT:         zNa
9990: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
99a0: 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20  STRAINT";       
99b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
99c0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
99d0: 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e  AINT_UNIQUE:  zN
99e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
99f0: 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22  NSTRAINT_UNIQUE"
9a00: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
9a10: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
9a20: 52 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a  RAINT_TRIGGER: z
9a30: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9a40: 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
9a50: 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  R";break;.      
9a60: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
9a70: 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
9a80: 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:.             
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9aa0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9ab0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
9ac0: 52 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65  REIGNKEY";   bre
9ad0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9ae0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9af0: 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20  _CHECK:   zName 
9b00: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
9b10: 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72  AINT_CHECK";  br
9b20: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9b30: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9b40: 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20  T_PRIMARYKEY:.  
9b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
9b70: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
9b80: 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
9b90: 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  KEY";   break;. 
9ba0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9bb0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e  _CONSTRAINT_NOTN
9bc0: 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  ULL: zName = "SQ
9bd0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9be0: 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a  NOTNULL";break;.
9bf0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9c00: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d  E_CONSTRAINT_COM
9c10: 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20  MITHOOK:.       
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c30: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9c40: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
9c50: 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b  INT_COMMITHOOK";
9c60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9c70: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
9c80: 54 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20  TRAINT_VTAB:    
9c90: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9ca0: 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22  CONSTRAINT_VTAB"
9cb0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
9cc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
9cd0: 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e  STRAINT_FUNCTION
9ce0: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
9cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d00: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9d10: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e  E_CONSTRAINT_FUN
9d20: 43 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61  CTION";     brea
9d30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9d40: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9d50: 52 4f 57 49 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  ROWID:   zName =
9d60: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
9d70: 49 4e 54 5f 52 4f 57 49 44 22 3b 20 20 62 72 65  INT_ROWID";  bre
9d80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9d90: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20  QLITE_MISMATCH: 
9da0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9db0: 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  = "SQLITE_MISMAT
9dc0: 43 48 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  CH";          br
9dd0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9de0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20  SQLITE_MISUSE:  
9df0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9e00: 20 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53   = "SQLITE_MISUS
9e10: 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  E";            b
9e20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9e30: 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20   SQLITE_NOLFS:  
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9e50: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46  e = "SQLITE_NOLF
9e60: 53 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  S";             
9e70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9e80: 65 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20  e SQLITE_AUTH:  
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9ea0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54  me = "SQLITE_AUT
9eb0: 48 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  H";             
9ec0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9ed0: 73 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  se SQLITE_FORMAT
9ee0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
9ef0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f  ame = "SQLITE_FO
9f00: 52 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20 20  RMAT";          
9f10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9f20: 61 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45  ase SQLITE_RANGE
9f30: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
9f40: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
9f50: 41 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20 20  ANGE";          
9f60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9f70: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41  case SQLITE_NOTA
9f80: 44 42 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  DB:             
9f90: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9fa0: 4e 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20 20  NOTADB";        
9fb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9fc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 4f 57   case SQLITE_ROW
9fd0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
9fe0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9ff0: 5f 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20  _ROW";          
a000: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a010: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
a020: 54 49 43 45 3a 20 20 20 20 20 20 20 20 20 20 20  TICE:           
a030: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a040: 45 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20  E_NOTICE";      
a050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a060: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
a070: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41  OTICE_RECOVER_WA
a080: 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  L: zName = "SQLI
a090: 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45  TE_NOTICE_RECOVE
a0a0: 52 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20  R_WAL";break;.  
a0b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
a0c0: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52  NOTICE_RECOVER_R
a0d0: 4f 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20  OLLBACK:.       
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a0f0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
a100: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f   "SQLITE_NOTICE_
a110: 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b  RECOVER_ROLLBACK
a120: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
a130: 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e  case SQLITE_WARN
a140: 49 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20 20  ING:            
a150: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
a160: 57 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20  WARNING";       
a170: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
a180: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52   case SQLITE_WAR
a190: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20  NING_AUTOINDEX: 
a1a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
a1b0: 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44  _WARNING_AUTOIND
a1c0: 45 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  EX"; break;.    
a1d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f    case SQLITE_DO
a1e0: 4e 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  NE:             
a1f0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
a200: 45 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20  E_DONE";        
a210: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a220: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61   }.  }.  if( zNa
a230: 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  me==0 ){.    sta
a240: 74 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35 30  tic char zBuf[50
a250: 5d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  ];.    sqlite3_s
a260: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
a270: 42 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c  Buf), zBuf, "SQL
a280: 49 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22  ITE_UNKNOWN(%d)"
a290: 2c 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20 7a  , origRc);.    z
a2a0: 4e 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d  Name = zBuf;.  }
a2b0: 0a 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b  .  return zName;
a2c0: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
a2d0: 20 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63   Return a static
a2e0: 20 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73   string that des
a2f0: 63 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20  cribes the kind 
a300: 6f 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69  of error specifi
a310: 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67  ed in the.** arg
a320: 75 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ument..*/.const 
a330: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72  char *sqlite3Err
a340: 53 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73  Str(int rc){.  s
a350: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
a360: 2a 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d  * const aMsg[] =
a370: 20 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45   {.    /* SQLITE
a380: 5f 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20  _OK          */ 
a390: 22 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a  "not an error",.
a3a0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52      /* SQLITE_ER
a3b0: 52 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51  ROR       */ "SQ
a3c0: 4c 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72  L logic error or
a3d0: 20 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61 73   missing databas
a3e0: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
a3f0: 45 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f  E_INTERNAL    */
a400: 20 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54   0,.    /* SQLIT
a410: 45 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f  E_PERM        */
a420: 20 22 61 63 63 65 73 73 20 70 65 72 6d 69 73 73   "access permiss
a430: 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20  ion denied",.   
a440: 20 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54   /* SQLITE_ABORT
a450: 20 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62         */ "callb
a460: 61 63 6b 20 72 65 71 75 65 73 74 65 64 20 71 75  ack requested qu
a470: 65 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20 20  ery abort",.    
a480: 2f 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20  /* SQLITE_BUSY  
a490: 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61        */ "databa
a4a0: 73 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20  se is locked",. 
a4b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43     /* SQLITE_LOC
a4c0: 4b 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74  KED      */ "dat
a4d0: 61 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c  abase table is l
a4e0: 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ocked",.    /* S
a4f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20  QLITE_NOMEM     
a500: 20 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d    */ "out of mem
a510: 6f 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ory",.    /* SQL
a520: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20  ITE_READONLY    
a530: 2a 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77  */ "attempt to w
a540: 72 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20  rite a readonly 
a550: 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f  database",.    /
a560: 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55  * SQLITE_INTERRU
a570: 50 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75  PT   */ "interru
a580: 70 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  pted",.    /* SQ
a590: 4c 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20  LITE_IOERR      
a5a0: 20 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72   */ "disk I/O er
a5b0: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
a5c0: 49 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20  ITE_CORRUPT     
a5d0: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73  */ "database dis
a5e0: 6b 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f  k image is malfo
a5f0: 72 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rmed",.    /* SQ
a600: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20  LITE_NOTFOUND   
a610: 20 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65   */ "unknown ope
a620: 72 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20  ration",.    /* 
a630: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20  SQLITE_FULL     
a640: 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20     */ "database 
a650: 6f 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22  or disk is full"
a660: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a670: 43 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22  CANTOPEN    */ "
a680: 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64  unable to open d
a690: 61 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20  atabase file",. 
a6a0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f     /* SQLITE_PRO
a6b0: 54 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63  TOCOL    */ "loc
a6c0: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a  king protocol",.
a6d0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d      /* SQLITE_EM
a6e0: 50 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74 61  PTY       */ "ta
a6f0: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20  ble contains no 
a700: 64 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51  data",.    /* SQ
a710: 4c 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20  LITE_SCHEMA     
a720: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73 63   */ "database sc
a730: 68 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64  hema has changed
a740: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a750: 5f 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20  _TOOBIG      */ 
a760: 22 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20  "string or blob 
a770: 74 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a  too big",.    /*
a780: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
a790: 4e 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69  NT  */ "constrai
a7a0: 6e 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20  nt failed",.    
a7b0: 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54  /* SQLITE_MISMAT
a7c0: 43 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79  CH    */ "dataty
a7d0: 70 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20  pe mismatch",.  
a7e0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55    /* SQLITE_MISU
a7f0: 53 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62 72  SE      */ "libr
a800: 61 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c  ary routine call
a810: 65 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e  ed out of sequen
a820: 63 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ce",.    /* SQLI
a830: 54 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a  TE_NOLFS       *
a840: 2f 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75  / "large file su
a850: 70 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65  pport is disable
a860: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
a870: 45 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f  E_AUTH        */
a880: 20 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20   "authorization 
a890: 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20  denied",.    /* 
a8a0: 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20  SQLITE_FORMAT   
a8b0: 20 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72 79     */ "auxiliary
a8c0: 20 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74   database format
a8d0: 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20   error",.    /* 
a8e0: 53 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20  SQLITE_RANGE    
a8f0: 20 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63     */ "bind or c
a900: 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20  olumn index out 
a910: 6f 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f  of range",.    /
a920: 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20  * SQLITE_NOTADB 
a930: 20 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73       */ "file is
a940: 20 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73   encrypted or is
a950: 20 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 22   not a database"
a960: 2c 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  ,.  };.  const c
a970: 68 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b  har *zErr = "unk
a980: 6e 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73  nown error";.  s
a990: 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20  witch( rc ){.   
a9a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f   case SQLITE_ABO
a9b0: 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20  RT_ROLLBACK: {. 
a9c0: 20 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f       zErr = "abo
a9d0: 72 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41  rt due to ROLLBA
a9e0: 43 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  CK";.      break
a9f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
aa00: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20  ult: {.      rc 
aa10: 26 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20 69  &= 0xff;.      i
aa20: 66 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29  f( ALWAYS(rc>=0)
aa30: 20 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a 65   && rc<ArraySize
aa40: 28 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b 72  (aMsg) && aMsg[r
aa50: 63 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  c]!=0 ){.       
aa60: 20 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d   zErr = aMsg[rc]
aa70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
aa80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
aa90: 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a  .  return zErr;.
aaa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
aab0: 75 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73  utine implements
aac0: 20 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b   a busy callback
aad0: 20 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64   that sleeps and
aae0: 20 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20   tries.** again 
aaf0: 75 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20  until a timeout 
ab00: 76 61 6c 75 65 20 69 73 20 72 65 61 63 68 65 64  value is reached
ab10: 2e 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76  .  The timeout v
ab20: 61 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e  alue is.** an in
ab30: 74 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20  teger number of 
ab40: 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73  milliseconds pas
ab50: 73 65 64 20 69 6e 20 61 73 20 74 68 65 20 66 69  sed in as the fi
ab60: 72 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  rst.** argument.
ab70: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
ab80: 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79  qliteDefaultBusy
ab90: 43 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20  Callback(. void 
aba0: 2a 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20  *ptr,           
abb0: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
abc0: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69  connection */. i
abd0: 6e 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20  nt count        
abe0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
abf0: 72 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65  r of times table
ac00: 20 68 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a   has been busy *
ac10: 2f 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f  /.){.#if SQLITE_
ac20: 4f 53 5f 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e  OS_WIN || (defin
ac30: 65 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20  ed(HAVE_USLEEP) 
ac40: 26 26 20 48 41 56 45 5f 55 53 4c 45 45 50 29 0a  && HAVE_USLEEP).
ac50: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
ac60: 38 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20  8 delays[] =.   
ac70: 20 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c    { 1, 2, 5, 10,
ac80: 20 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c   15, 20, 25, 25,
ac90: 20 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20    25,  50,  50, 
aca0: 31 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  100 };.  static 
acb0: 63 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b  const u8 totals[
acc0: 5d 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c  ] =.     { 0, 1,
acd0: 20 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20   3,  8, 18, 33, 
ace0: 35 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38  53, 78, 103, 128
acf0: 2c 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20  , 178, 228 };.# 
ad00: 64 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72  define NDELAY Ar
ad10: 72 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a  raySize(delays).
ad20: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
ad30: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a  (sqlite3 *)ptr;.
ad40: 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20    int timeout = 
ad50: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b  db->busyTimeout;
ad60: 0a 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72  .  int delay, pr
ad70: 69 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ior;..  assert( 
ad80: 63 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66  count>=0 );.  if
ad90: 28 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59  ( count < NDELAY
ada0: 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20   ){.    delay = 
adb0: 64 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20  delays[count];. 
adc0: 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c     prior = total
add0: 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73  s[count];.  }els
ade0: 65 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64  e{.    delay = d
adf0: 65 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b  elays[NDELAY-1];
ae00: 0a 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74  .    prior = tot
ae10: 61 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20  als[NDELAY-1] + 
ae20: 64 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44  delay*(count-(ND
ae30: 45 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20  ELAY-1));.  }.  
ae40: 69 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61  if( prior + dela
ae50: 79 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  y > timeout ){. 
ae60: 20 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f     delay = timeo
ae70: 75 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20  ut - prior;.    
ae80: 69 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72  if( delay<=0 ) r
ae90: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73  eturn 0;.  }.  s
aea0: 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62  qlite3OsSleep(db
aeb0: 2d 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30  ->pVfs, delay*10
aec0: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
aed0: 0a 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33  .#else.  sqlite3
aee0: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
aef0: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d  *)ptr;.  int tim
af00: 65 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33  eout = ((sqlite3
af10: 20 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d   *)ptr)->busyTim
af20: 65 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75  eout;.  if( (cou
af30: 6e 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d  nt+1)*1000 > tim
af40: 65 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75  eout ){.    retu
af50: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  rn 0;.  }.  sqli
af60: 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70  te3OsSleep(db->p
af70: 56 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20  Vfs, 1000000);. 
af80: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
af90: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  f.}../*.** Invok
afa0: 65 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79  e the given busy
afb0: 20 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20   handler..**.** 
afc0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
afd0: 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f  called when an o
afe0: 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20  peration failed 
aff0: 77 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20  with a lock..** 
b000: 49 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  If this routine 
b010: 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f  returns non-zero
b020: 2c 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65  , the lock is re
b030: 74 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a  tried.  If it.**
b040: 20 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20   returns 0, the 
b050: 6f 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73  operation aborts
b060: 20 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f   with an SQLITE_
b070: 42 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69  BUSY error..*/.i
b080: 6e 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65  nt sqlite3Invoke
b090: 42 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79  BusyHandler(Busy
b0a0: 48 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69  Handler *p){.  i
b0b0: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56  nt rc;.  if( NEV
b0c0: 45 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78  ER(p==0) || p->x
b0d0: 46 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42  Func==0 || p->nB
b0e0: 75 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30  usy<0 ) return 0
b0f0: 3b 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e  ;.  rc = p->xFun
b100: 63 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42  c(p->pArg, p->nB
b110: 75 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  usy);.  if( rc==
b120: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73  0 ){.    p->nBus
b130: 79 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b  y = -1;.  }else{
b140: 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b  .    p->nBusy++;
b150: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
b160: 3b 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ; .}../*.** This
b170: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
b180: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
b190: 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61  for an Sqlite da
b1a0: 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a  tabase to the.**
b1b0: 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20   given callback 
b1c0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
b1d0: 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74  e given argument
b1e0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b1f0: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20  _busy_handler(. 
b200: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
b210: 69 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69  int (*xBusy)(voi
b220: 64 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  d*,int),.  void 
b230: 2a 70 41 72 67 0a 29 7b 0a 23 69 66 64 65 66 20  *pArg.){.#ifdef 
b240: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
b250: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
b260: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
b270: 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72 6e  kOk(db) ) return
b280: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a   SQLITE_MISUSE;.
b290: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
b2a0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
b2b0: 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62  >mutex);.  db->b
b2c0: 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63  usyHandler.xFunc
b2d0: 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e   = xBusy;.  db->
b2e0: 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72 67  busyHandler.pArg
b2f0: 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62   = pArg;.  db->b
b300: 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79  usyHandler.nBusy
b310: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79   = 0;.  db->busy
b320: 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 73  Timeout = 0;.  s
b330: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
b340: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
b350: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b360: 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
b370: 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45  LITE_OMIT_PROGRE
b380: 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a  SS_CALLBACK./*.*
b390: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
b3a0: 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73 73  ets the progress
b3b0: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e   callback for an
b3c0: 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73 65   Sqlite database
b3d0: 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e   to the.** given
b3e0: 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   callback functi
b3f0: 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76 65  on with the give
b400: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20  n argument. The 
b410: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
b420: 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76  k will.** be inv
b430: 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20  oked every nOps 
b440: 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64  opcodes..*/.void
b450: 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73   sqlite3_progres
b460: 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c  s_handler(.  sql
b470: 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74  ite3 *db, .  int
b480: 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78   nOps,.  int (*x
b490: 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29  Progress)(void*)
b4a0: 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  , .  void *pArg.
b4b0: 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
b4c0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
b4d0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
b4e0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
b4f0: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
b500: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
b510: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  T;.    return;. 
b520: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
b530: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
b540: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
b550: 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20 20  ( nOps>0 ){.    
b560: 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20  db->xProgress = 
b570: 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20 64  xProgress;.    d
b580: 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20  b->nProgressOps 
b590: 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70 73  = (unsigned)nOps
b5a0: 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72  ;.    db->pProgr
b5b0: 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  essArg = pArg;. 
b5c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d 3e   }else{.    db->
b5d0: 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a 20  xProgress = 0;. 
b5e0: 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73     db->nProgress
b5f0: 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  Ops = 0;.    db-
b600: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
b610: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
b620: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
b630: 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64 69  >mutex);.}.#endi
b640: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  f.../*.** This r
b650: 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73 20  outine installs 
b660: 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20 68  a default busy h
b670: 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69 74  andler that wait
b680: 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70 65  s for the.** spe
b690: 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f 66  cified number of
b6a0: 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62 65   milliseconds be
b6b0: 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 30  fore returning 0
b6c0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
b6d0: 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73 71  _busy_timeout(sq
b6e0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6d  lite3 *db, int m
b6f0: 73 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  s){.#ifdef SQLIT
b700: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
b710: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
b720: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
b730: 62 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  b) ) return SQLI
b740: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
b750: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 6d 73 3e  #endif.  if( ms>
b760: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
b770: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
b780: 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42  , sqliteDefaultB
b790: 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  usyCallback, (vo
b7a0: 69 64 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d  id*)db);.    db-
b7b0: 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d  >busyTimeout = m
b7c0: 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
b7d0: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
b7e0: 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a  dler(db, 0, 0);.
b7f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
b800: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b810: 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69   Cause any pendi
b820: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ng operation to 
b830: 73 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c  stop at its earl
b840: 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79  iest opportunity
b850: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b860: 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69  3_interrupt(sqli
b870: 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 64 65 66  te3 *db){.#ifdef
b880: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
b890: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
b8a0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
b8b0: 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  ckOk(db) ){.    
b8c0: 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53  (void)SQLITE_MIS
b8d0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65  USE_BKPT;.    re
b8e0: 74 75 72 6e 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  turn;.  }.#endif
b8f0: 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  .  db->u1.isInte
b900: 72 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a  rrupted = 1;.}..
b910: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b920: 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20  tion is exactly 
b930: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
b940: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
b950: 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a  ion(), except.**
b960: 20 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69   that it is desi
b970: 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  gned to be calle
b980: 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f  d by internal co
b990: 64 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e  de. The differen
b9a0: 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66  ce is.** that if
b9b0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
b9c0: 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  s in sqlite3_cre
b9d0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
b9e0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  an error code.**
b9f0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
ba00: 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65   the mallocFaile
ba10: 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20  d flag cleared. 
ba20: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
ba30: 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c  reateFunc(.  sql
ba40: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
ba50: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f  t char *zFunctio
ba60: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
ba70: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
ba80: 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c  void *pUserData,
ba90: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
baa0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
bab0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
bac0: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
bad0: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
bae0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
baf0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
bb00: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
bb10: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
bb20: 74 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72  t*),.  FuncDestr
bb30: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
bb40: 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  or.){.  FuncDef 
bb50: 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  *p;.  int nName;
bb60: 0a 20 20 69 6e 74 20 65 78 74 72 61 46 6c 61 67  .  int extraFlag
bb70: 73 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  s;..  assert( sq
bb80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
bb90: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
bba0: 20 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61   if( zFunctionNa
bbb0: 6d 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28  me==0 ||.      (
bbc0: 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c  xFunc && (xFinal
bbd0: 20 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c 20 0a   || xStep)) || .
bbe0: 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26 26        (!xFunc &&
bbf0: 20 28 78 46 69 6e 61 6c 20 26 26 20 21 78 53 74   (xFinal && !xSt
bc00: 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 21  ep)) ||.      (!
bc10: 78 46 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61  xFunc && (!xFina
bc20: 6c 20 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a  l && xStep)) ||.
bc30: 20 20 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c        (nArg<-1 |
bc40: 7c 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41  | nArg>SQLITE_MA
bc50: 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20  X_FUNCTION_ARG) 
bc60: 7c 7c 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e  ||.      (255<(n
bc70: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74  Name = sqlite3St
bc80: 72 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f  rlen30( zFunctio
bc90: 6e 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20  nName))) ){.    
bca0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
bcb0: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  SUSE_BKPT;.  }..
bcc0: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
bcd0: 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d  _FUNC_CONSTANT==
bce0: 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49  SQLITE_DETERMINI
bcf0: 53 54 49 43 20 29 3b 0a 20 20 65 78 74 72 61 46  STIC );.  extraF
bd00: 6c 61 67 73 20 3d 20 65 6e 63 20 26 20 20 53 51  lags = enc &  SQ
bd10: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
bd20: 49 43 3b 0a 20 20 65 6e 63 20 26 3d 20 28 53 51  IC;.  enc &= (SQ
bd30: 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53  LITE_FUNC_ENCMAS
bd40: 4b 7c 53 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20  K|SQLITE_ANY);. 
bd50: 20 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45   .#ifndef SQLITE
bd60: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a  _OMIT_UTF16.  /*
bd70: 20 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36   If SQLITE_UTF16
bd80: 20 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73   is specified as
bd90: 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79   the encoding ty
bda0: 70 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68  pe, transform th
bdb0: 69 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f  is.  ** to one o
bdc0: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  f SQLITE_UTF16LE
bdd0: 20 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36   or SQLITE_UTF16
bde0: 42 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a  BE using the.  *
bdf0: 2a 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  * SQLITE_UTF16NA
be00: 54 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49  TIVE macro. SQLI
be10: 54 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20  TE_UTF16 is not 
be20: 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e  used internally.
be30: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51  .  **.  ** If SQ
be40: 4c 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63  LITE_ANY is spec
be50: 69 66 69 65 64 2c 20 61 64 64 20 74 68 72 65 65  ified, add three
be60: 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65   versions of the
be70: 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74   function.  ** t
be80: 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  o the hash table
be90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63  ..  */.  if( enc
bea0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29  ==SQLITE_UTF16 )
beb0: 7b 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49  {.    enc = SQLI
bec0: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
bed0: 20 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d    }else if( enc=
bee0: 3d 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20  =SQLITE_ANY ){. 
bef0: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72     int rc;.    r
bf00: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
bf10: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74  eFunc(db, zFunct
bf20: 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53  ionName, nArg, S
bf30: 51 4c 49 54 45 5f 55 54 46 38 7c 65 78 74 72 61  QLITE_UTF8|extra
bf40: 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  Flags,.         
bf50: 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63  pUserData, xFunc
bf60: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
bf70: 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20   pDestructor);. 
bf80: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
bf90: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
bfa0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
bfb0: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
bfc0: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
bfd0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 7c 65 78 74  LITE_UTF16LE|ext
bfe0: 72 61 46 6c 61 67 73 2c 0a 20 20 20 20 20 20 20  raFlags,.       
bff0: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46     pUserData, xF
c000: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
c010: 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  al, pDestructor)
c020: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
c030: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c040: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
c050: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20  ;.    }.    enc 
c060: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  = SQLITE_UTF16BE
c070: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e  ;.  }.#else.  en
c080: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
c090: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20  .#endif.  .  /* 
c0a0: 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73  Check if an exis
c0b0: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73  ting function is
c0c0: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
c0d0: 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66  n or deleted. If
c0e0: 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68   so,.  ** and th
c0f0: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
c100: 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  Ms, then return 
c110: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20  SQLITE_BUSY. If 
c120: 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  a function.  ** 
c130: 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64  is being overrid
c140: 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20  den/deleted but 
c150: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74  there are no act
c160: 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74  ive VMs, allow t
c170: 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  he.  ** operatio
c180: 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75  n to continue bu
c190: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  t invalidate all
c1a0: 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61   precompiled sta
c1b0: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
c1c0: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
c1d0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
c1e0: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
c1f0: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
c200: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
c210: 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  (p->funcFlags & 
c220: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
c230: 41 53 4b 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e  ASK)==enc && p->
c240: 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20  nArg==nArg ){.  
c250: 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41    if( db->nVdbeA
c260: 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73  ctive ){.      s
c270: 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d  qlite3ErrorWithM
c280: 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  sg(db, SQLITE_BU
c290: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
c2a0: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
c2b0: 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74  odify user-funct
c2c0: 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76  ion due to activ
c2d0: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
c2e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
c2f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
c300: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
c310: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
c320: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
c330: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
c340: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
c350: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
c360: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
c370: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
c380: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
c390: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
c3a0: 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20   1);.  assert(p 
c3b0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
c3c0: 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29  led);.  if( !p )
c3d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c3e0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
c3f0: 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72    /* If an older
c400: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
c410: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20  function with a 
c420: 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72  configured destr
c430: 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65  uctor is.  ** be
c440: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76  ing replaced inv
c450: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
c460: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  or function here
c470: 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44  . */.  functionD
c480: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a  estroy(db, p);..
c490: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
c4a0: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
c4b0: 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ctor->nRef++;.  
c4c0: 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74  }.  p->pDestruct
c4d0: 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72  or = pDestructor
c4e0: 3b 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73  ;.  p->funcFlags
c4f0: 20 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73   = (p->funcFlags
c500: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
c510: 4e 43 4d 41 53 4b 29 20 7c 20 65 78 74 72 61 46  NCMASK) | extraF
c520: 6c 61 67 73 3b 0a 20 20 74 65 73 74 63 61 73 65  lags;.  testcase
c530: 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  ( p->funcFlags &
c540: 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
c550: 49 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78 46  ISTIC );.  p->xF
c560: 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70  unc = xFunc;.  p
c570: 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b  ->xStep = xStep;
c580: 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20  .  p->xFinalize 
c590: 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70  = xFinal;.  p->p
c5a0: 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72  UserData = pUser
c5b0: 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20  Data;.  p->nArg 
c5c0: 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72  = (u16)nArg;.  r
c5d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c5e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
c5f0: 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74 69   new user functi
c600: 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
c610: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
c620: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
c630: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
c640: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
c650: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
c660: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
c670: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
c680: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
c690: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
c6a0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
c6b0: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
c6c0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
c6d0: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
c6e0: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
c6f0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
c700: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
c710: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
c720: 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20  n_v2(db, zFunc, 
c730: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46  nArg, enc, p, xF
c740: 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20  unc, xStep,.    
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c770: 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69  xFinal, 0);.}..i
c780: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
c790: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20  e_function_v2(. 
c7a0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
c7b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
c7c0: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
c7d0: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
c7e0: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
c7f0: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
c800: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
c810: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
c820: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
c830: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
c840: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
c850: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
c860: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
c870: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
c880: 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64  (*xDestroy)(void
c890: 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   *).){.  int rc 
c8a0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
c8b0: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
c8c0: 20 2a 70 41 72 67 20 3d 20 30 3b 0a 0a 23 69 66   *pArg = 0;..#if
c8d0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
c8e0: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
c8f0: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
c900: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
c910: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
c920: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
c930: 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  }.#endif.  sqlit
c940: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
c950: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
c960: 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20   xDestroy ){.   
c970: 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73   pArg = (FuncDes
c980: 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65  tructor *)sqlite
c990: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
c9a0: 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73  , sizeof(FuncDes
c9b0: 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69  tructor));.    i
c9c0: 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20  f( !pArg ){.    
c9d0: 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20    xDestroy(p);. 
c9e0: 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20       goto out;. 
c9f0: 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78     }.    pArg->x
ca00: 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72  Destroy = xDestr
ca10: 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55  oy;.    pArg->pU
ca20: 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d  serData = p;.  }
ca30: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43  .  rc = sqlite3C
ca40: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
ca50: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
ca60: 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  p, xFunc, xStep,
ca70: 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a   xFinal, pArg);.
ca80: 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
ca90: 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  rg->nRef==0 ){. 
caa0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
cab0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
cac0: 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  xDestroy(p);.   
cad0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
cae0: 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20  b, pArg);.  }.. 
caf0: 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69  out:.  rc = sqli
cb00: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
cb10: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
cb20: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
cb30: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
cb40: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
cb50: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
cb60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
cb70: 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20  te_function16(. 
cb80: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
cb90: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e  const void *zFun
cba0: 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  ctionName,.  int
cbb0: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65   nArg,.  int eTe
cbc0: 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70  xtRep,.  void *p
cbd0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63  ,.  void (*xFunc
cbe0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
cbf0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
cc00: 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  alue**),.  void 
cc10: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
cc20: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
cc30: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a  lite3_value**),.
cc40: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
cc50: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
cc60: 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
cc70: 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a    char *zFunc8;.
cc80: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
cc90: 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a  NABLE_API_ARMOR.
cca0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
ccb0: 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20  fetyCheckOk(db) 
ccc0: 7c 7c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  || zFunctionName
ccd0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
cce0: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
ccf0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
cd00: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
cd10: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
cd20: 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
cd30: 61 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63  ailed );.  zFunc
cd40: 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
cd50: 74 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  to8(db, zFunctio
cd60: 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54  nName, -1, SQLIT
cd70: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a  E_UTF16NATIVE);.
cd80: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
cd90: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
cda0: 6e 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74  nc8, nArg, eText
cdb0: 52 65 70 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78  Rep, p, xFunc, x
cdc0: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 30 29 3b  Step, xFinal,0);
cdd0: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
cde0: 28 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20  (db, zFunc8);.  
cdf0: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
ce00: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
ce10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
ce20: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
ce30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
ce40: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63  ndif.../*.** Dec
ce50: 6c 61 72 65 20 74 68 61 74 20 61 20 66 75 6e 63  lare that a func
ce60: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76  tion has been ov
ce70: 65 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69  erloaded by a vi
ce80: 72 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a  rtual table..**.
ce90: 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69  ** If the functi
cea0: 6f 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  on already exist
ceb0: 73 20 61 73 20 61 20 72 65 67 75 6c 61 72 20 67  s as a regular g
cec0: 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20  lobal function, 
ced0: 74 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75  then.** this rou
cee0: 74 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tine is a no-op.
cef0: 20 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f    If the functio
cf00: 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
cf10: 2c 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a  , then create.**
cf20: 20 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20   a new one that 
cf30: 61 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61 20  always throws a 
cf40: 72 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20  run-time error. 
cf50: 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72   .**.** When vir
cf60: 74 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65  tual tables inte
cf70: 6e 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e  nd to provide an
cf80: 20 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63   overloaded func
cf90: 74 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68  tion, they.** sh
cfa0: 6f 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72  ould call this r
cfb0: 6f 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73  outine to make s
cfc0: 75 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66  ure the global f
cfd0: 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a  unction exists..
cfe0: 2a 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63  ** A global func
cff0: 74 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20  tion must exist 
d000: 69 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d  in order for nam
d010: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20  e resolution to 
d020: 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79  work.** properly
d030: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d040: 5f 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69  _overload_functi
d050: 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  on(.  sqlite3 *d
d060: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
d070: 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  *zName,.  int nA
d080: 72 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d  rg.){.  int nNam
d090: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
d0a0: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e  n30(zName);.  in
d0b0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
d0c0: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
d0d0: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
d0e0: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
d0f0: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
d100: 29 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 7c 7c  ) || zName==0 ||
d110: 20 6e 41 72 67 3c 2d 32 20 29 7b 0a 20 20 20 20   nArg<-2 ){.    
d120: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
d130: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 23  SUSE_BKPT;.  }.#
d140: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
d150: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
d160: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  mutex);.  if( sq
d170: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
d180: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  n(db, zName, nNa
d190: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
d1a0: 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a  _UTF8, 0)==0 ){.
d1b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d1c0: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
d1d0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
d1e0: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d200: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e      0, sqlite3In
d210: 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  validFunction, 0
d220: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
d230: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
d240: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
d250: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
d260: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
d270: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
d280: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
d290: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
d2a0: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
d2b0: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
d2c0: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
d2d0: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
d2e0: 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
d2f0: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
d300: 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
d310: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
d320: 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
d330: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
d340: 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
d350: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
d360: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
d370: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
d380: 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
d390: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
d3a0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
d3b0: 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
d3c0: 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63  db, void (*xTrac
d3d0: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
d3e0: 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
d3f0: 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
d400: 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
d410: 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
d420: 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
d430: 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
d440: 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53  ) ){.    (void)S
d450: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
d460: 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  T;.    return 0;
d470: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71  .  }.#endif.  sq
d480: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
d490: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
d4a0: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63  pOld = db->pTrac
d4b0: 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61  eArg;.  db->xTra
d4c0: 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64  ce = xTrace;.  d
d4d0: 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70  b->pTraceArg = p
d4e0: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
d4f0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
d500: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
d510: 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65  pOld;.}./*.** Re
d520: 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65  gister a profile
d530: 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20   function.  The 
d540: 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72  pArg from the pr
d550: 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65  eviously registe
d560: 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  red .** profile 
d570: 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75  function is retu
d580: 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20  rned.  .**.** A 
d590: 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e  NULL profile fun
d5a0: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
d5b0: 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73   no profiling is
d5c0: 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f   executes.  A no
d5d0: 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c  n-NULL.** profil
d5e0: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
d5f0: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
d600: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
d610: 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f  the conclusion o
d620: 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74  f.** each SQL st
d630: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20  atement that is 
d640: 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  run..*/.void *sq
d650: 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20  lite3_profile(. 
d660: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
d670: 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29  void (*xProfile)
d680: 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61  (void*,const cha
d690: 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34  r*,sqlite_uint64
d6a0: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a  ),.  void *pArg.
d6b0: 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b  ){.  void *pOld;
d6c0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
d6d0: 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
d6e0: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
d6f0: 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
d700: 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29 53 51   ){.    (void)SQ
d710: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
d720: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
d730: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c    }.#endif.  sql
d740: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d750: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
d760: 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69  Old = db->pProfi
d770: 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72  leArg;.  db->xPr
d780: 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65  ofile = xProfile
d790: 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  ;.  db->pProfile
d7a0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
d7b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
d7c0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
d7d0: 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23  return pOld;.}.#
d7e0: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d7f0: 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  OMIT_TRACE */../
d800: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
d810: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
d820: 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72  nvoked when a tr
d830: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
d840: 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76  s..** If the inv
d850: 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65  oked function re
d860: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
d870: 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20  then the commit 
d880: 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c  becomes a.** rol
d890: 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  lback..*/.void *
d8a0: 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68  sqlite3_commit_h
d8b0: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
d8c0: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
d8d0: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
d8e0: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
d8f0: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  base */.  int (*
d900: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
d910: 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  ),  /* Function 
d920: 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63  to invoke on eac
d930: 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f  h commit */.  vo
d940: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
d950: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
d960: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
d970: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
d980: 20 2a 70 4f 6c 64 3b 0a 0a 23 69 66 64 65 66 20   *pOld;..#ifdef 
d990: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50  SQLITE_ENABLE_AP
d9a0: 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73  I_ARMOR.  if( !s
d9b0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
d9c0: 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28  kOk(db) ){.    (
d9d0: 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55  void)SQLITE_MISU
d9e0: 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74  SE_BKPT;.    ret
d9f0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69  urn 0;.  }.#endi
da00: 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
da10: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
da20: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
da30: 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64  >pCommitArg;.  d
da40: 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61  b->xCommitCallba
da50: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
da60: 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67    db->pCommitArg
da70: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
da80: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
da90: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
daa0: 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a  urn pOld;.}../*.
dab0: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
dac0: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
dad0: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
dae0: 20 72 6f 77 20 69 73 20 75 70 64 61 74 65 64 2c   row is updated,
daf0: 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f 72 20  .** inserted or 
db00: 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20 74 68  deleted using th
db10: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
db20: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
db30: 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74 65 5f  *sqlite3_update_
db40: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
db50: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
db60: 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20    /* Attach the 
db70: 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74  hook to this dat
db80: 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20  abase */.  void 
db90: 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69  (*xCallback)(voi
dba0: 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73  d*,int,char cons
dbb0: 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  t *,char const *
dbc0: 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a  ,sqlite_int64),.
dbd0: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
dbf0: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
dc00: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
dc10: 76 6f 69 64 20 2a 70 52 65 74 3b 0a 0a 23 69 66  void *pRet;..#if
dc20: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
dc30: 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
dc40: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
dc50: 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
dc60: 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
dc70: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
dc80: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23   return 0;.  }.#
dc90: 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
dca0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
dcb0: 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
dcc0: 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b   db->pUpdateArg;
dcd0: 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61  .  db->xUpdateCa
dce0: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
dcf0: 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74  ck;.  db->pUpdat
dd00: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
dd10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
dd20: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
dd30: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
dd40: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
dd50: 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
dd60: 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
dd70: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
dd80: 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   is rolled.** ba
dd90: 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ck by this datab
dda0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
ddb0: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
ddc0: 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a  _rollback_hook(.
ddd0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
ddf0: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
de00: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
de10: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
de20: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f  lback)(void*), /
de30: 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
de40: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
de50: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
de60: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
de70: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
de80: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
de90: 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
dea0: 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d  E_ENABLE_API_ARM
deb0: 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  OR.  if( !sqlite
dec0: 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64  3SafetyCheckOk(d
ded0: 62 29 20 29 7b 0a 20 20 20 20 28 76 6f 69 64 29  b) ){.    (void)
dee0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
def0: 50 54 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  PT;.    return 0
df00: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  ;.  }.#endif.  s
df10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
df20: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
df30: 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c   pRet = db->pRol
df40: 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e  lbackArg;.  db->
df50: 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63  xRollbackCallbac
df60: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
df70: 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72   db->pRollbackAr
df80: 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69  g = pArg;.  sqli
df90: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
dfa0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
dfb0: 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69  turn pRet;.}..#i
dfc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
dfd0: 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20  T_WAL./*.** The 
dfe0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
dff0: 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69  () callback regi
e000: 73 74 65 72 65 64 20 62 79 20 73 71 6c 69 74 65  stered by sqlite
e010: 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70  3_wal_autocheckp
e020: 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b  oint()..** Invok
e030: 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  e sqlite3_wal_ch
e040: 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20  eckpoint if the 
e050: 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
e060: 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   in the log file
e070: 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20 74  .** is greater t
e080: 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c  han sqlite3.pWal
e090: 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69  Arg cast to an i
e0a0: 6e 74 65 67 65 72 20 28 74 68 65 20 76 61 6c 75  nteger (the valu
e0b0: 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a  e configured by.
e0c0: 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  ** wal_autocheck
e0d0: 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e  point())..*/ .in
e0e0: 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61  t sqlite3WalDefa
e0f0: 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20  ultHook(.  void 
e100: 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20  *pClientData,   
e110: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f    /* Argument */
e120: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
e130: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e            /* Con
e140: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e  nection */.  con
e150: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
e160: 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
e170: 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20  */.  int nFrame 
e180: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
e190: 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b  ize of WAL */.){
e1a0: 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53  .  if( nFrame>=S
e1b0: 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54  QLITE_PTR_TO_INT
e1c0: 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b  (pClientData) ){
e1d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
e1e0: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
e1f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
e200: 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  _checkpoint(db, 
e210: 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  zDb);.    sqlite
e220: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
e230: 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
e240: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
e250: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
e260: 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
e270: 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73  * Configure an s
e280: 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28  qlite3_wal_hook(
e290: 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75  ) callback to au
e2a0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63  tomatically chec
e2b0: 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61  kpoint.** a data
e2c0: 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69  base after commi
e2d0: 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  tting a transact
e2e0: 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65  ion if there are
e2f0: 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f   nFrame or.** mo
e300: 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  re frames in the
e310: 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69   log file. Passi
e320: 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67  ng zero or a neg
e330: 61 74 69 76 65 20 76 61 6c 75 65 20 61 73 20 74  ative value as t
e340: 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72  he.** nFrame par
e350: 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65 73 20  ameter disables 
e360: 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
e370: 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a  oints entirely..
e380: 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61  **.** The callba
e390: 63 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79  ck registered by
e3a0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
e3b0: 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73  eplaces any exis
e3c0: 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  ting callback.**
e3d0: 20 72 65 67 69 73 74 65 72 65 64 20 75 73 69 6e   registered usin
e3e0: 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  g sqlite3_wal_ho
e3f0: 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20  ok(). Likewise, 
e400: 72 65 67 69 73 74 65 72 69 6e 67 20 61 20 63 61  registering a ca
e410: 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20  llback.** using 
e420: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
e430: 28 29 20 64 69 73 61 62 6c 65 73 20 74 68 65 20  () disables the 
e440: 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70  automatic checkp
e450: 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a  oint mechanism.*
e460: 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20  * configured by 
e470: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a  this function..*
e480: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61  /.int sqlite3_wa
e490: 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74  l_autocheckpoint
e4a0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
e4b0: 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65  t nFrame){.#ifde
e4c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
e4d0: 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  L.  UNUSED_PARAM
e4e0: 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53  ETER(db);.  UNUS
e4f0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72  ED_PARAMETER(nFr
e500: 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 23 69 66 64  ame);.#else.#ifd
e510: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
e520: 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
e530: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
e540: 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74  heckOk(db) ) ret
e550: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
e560: 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 20  E_BKPT;.#endif. 
e570: 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b   if( nFrame>0 ){
e580: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
e590: 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65  _hook(db, sqlite
e5a0: 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c  3WalDefaultHook,
e5b0: 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50   SQLITE_INT_TO_P
e5c0: 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d  TR(nFrame));.  }
e5d0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
e5e0: 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30  3_wal_hook(db, 0
e5f0: 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
e600: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e610: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
e620: 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63  gister a callbac
e630: 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20  k to be invoked 
e640: 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e  each time a tran
e650: 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74  saction is writt
e660: 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77  en.** into the w
e670: 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62  rite-ahead-log b
e680: 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
e690: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
e6a0: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c  oid *sqlite3_wal
e6b0: 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33  _hook(.  sqlite3
e6c0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
e6d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61           /* Atta
e6e0: 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74  ch the hook to t
e6f0: 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f  his db handle */
e700: 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63  .  int(*xCallbac
e710: 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74  k)(void *, sqlit
e720: 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  e3*, const char*
e730: 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  , int),.  void *
e740: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
e750: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
e760: 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73  st argument pass
e770: 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28  ed to xCallback(
e780: 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20  ) */.){.#ifndef 
e790: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
e7a0: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 23 69    void *pRet;.#i
e7b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
e7c0: 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
e7d0: 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
e7e0: 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
e7f0: 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
e800: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
e810: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
e820: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
e830: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
e840: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20  >mutex);.  pRet 
e850: 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20  = db->pWalArg;. 
e860: 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63   db->xWalCallbac
e870: 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20  k = xCallback;. 
e880: 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70   db->pWalArg = p
e890: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
e8a0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
e8b0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
e8c0: 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65  pRet;.#else.  re
e8d0: 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  turn 0;.#endif.}
e8e0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69  ../*.** Checkpoi
e8f0: 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62 2e  nt database zDb.
e900: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
e910: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
e920: 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  2(.  sqlite3 *db
e930: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e940: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
e950: 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e   handle */.  con
e960: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
e970: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e980: 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68 65 64  Name of attached
e990: 20 64 61 74 61 62 61 73 65 20 28 6f 72 20 4e 55   database (or NU
e9a0: 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f  LL) */.  int eMo
e9b0: 64 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  de,             
e9c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 49           /* SQLI
e9d0: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20  TE_CHECKPOINT_* 
e9e0: 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a  value */.  int *
e9f0: 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20 20 20  pnLog,          
ea00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
ea10: 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c  T: Size of WAL l
ea20: 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a  og in frames */.
ea30: 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20    int *pnCkpt   
ea40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea50: 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20    /* OUT: Total 
ea60: 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73  number of frames
ea70: 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f   checkpointed */
ea80: 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .){.#ifdef SQLIT
ea90: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74  E_OMIT_WAL.  ret
eaa0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23  urn SQLITE_OK;.#
eab0: 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b 20 20  else.  int rc;  
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ead0: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
eae0: 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69   code */.  int i
eaf0: 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  Db = SQLITE_MAX_
eb00: 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20 73 71  ATTACHED;  /* sq
eb10: 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65  lite3.aDb[] inde
eb20: 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65 63 6b  x of db to check
eb30: 70 6f 69 6e 74 20 2a 2f 0a 0a 23 69 66 64 65 66  point */..#ifdef
eb40: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
eb50: 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 21  PI_ARMOR.  if( !
eb60: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
eb70: 63 6b 4f 6b 28 64 62 29 20 29 20 72 65 74 75 72  ckOk(db) ) retur
eb80: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
eb90: 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  BKPT;.#endif..  
eba0: 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
ebb0: 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c  e output variabl
ebc0: 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65  es to -1 in case
ebd0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
ebe0: 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67  . */.  if( pnLog
ebf0: 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a   ) *pnLog = -1;.
ec00: 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a    if( pnCkpt ) *
ec10: 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20  pnCkpt = -1;..  
ec20: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
ec30: 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53  HECKPOINT_FULL>S
ec40: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
ec50: 5f 50 41 53 53 49 56 45 20 29 3b 0a 20 20 61 73  _PASSIVE );.  as
ec60: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
ec70: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c  CKPOINT_FULL<SQL
ec80: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
ec90: 45 53 54 41 52 54 20 29 3b 0a 20 20 61 73 73 65  ESTART );.  asse
eca0: 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
ecb0: 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d  POINT_PASSIVE+2=
ecc0: 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  =SQLITE_CHECKPOI
ecd0: 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20  NT_RESTART );.  
ece0: 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45  if( eMode<SQLITE
ecf0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
ed00: 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c  IVE || eMode>SQL
ed10: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52  ITE_CHECKPOINT_R
ed20: 45 53 54 41 52 54 20 29 7b 0a 20 20 20 20 72 65  ESTART ){.    re
ed30: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
ed40: 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74  SE;.  }..  sqlit
ed50: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
ed60: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
ed70: 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29   zDb && zDb[0] )
ed80: 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69  {.    iDb = sqli
ed90: 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62  te3FindDbName(db
eda0: 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66  , zDb);.  }.  if
edb0: 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72  ( iDb<0 ){.    r
edc0: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
edd0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  ;.    sqlite3Err
ede0: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
edf0: 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b  LITE_ERROR, "unk
ee00: 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25  nown database: %
ee10: 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73  s", zDb);.  }els
ee20: 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
ee30: 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62  te3Checkpoint(db
ee40: 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e  , iDb, eMode, pn
ee50: 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20  Log, pnCkpt);.  
ee60: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
ee70: 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63  b, rc);.  }.  rc
ee80: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
ee90: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
eea0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
eeb0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
eec0: 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66  eturn rc;.#endif
eed0: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  .}.../*.** Check
eee0: 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a  point database z
eef0: 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55  Db. If zDb is NU
ef00: 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75  LL, or if the bu
ef10: 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a  ffer zDb points.
ef20: 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61  ** to contains a
ef30: 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72   zero-length str
ef40: 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65  ing, all attache
ef50: 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65 20  d databases are 
ef60: 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  .** checkpointed
ef70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ef80: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28  _wal_checkpoint(
ef90: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
efa0: 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20  st char *zDb){. 
efb0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f   return sqlite3_
efc0: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76  wal_checkpoint_v
efd0: 32 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54  2(db, zDb, SQLIT
efe0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
eff0: 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  SIVE, 0, 0);.}..
f000: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
f010: 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75  MIT_WAL./*.** Ru
f020: 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f  n a checkpoint o
f030: 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e 20  n database iDb. 
f040: 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20  This is a no-op 
f050: 69 66 20 64 61 74 61 62 61 73 65 20 69 44 62 20  if database iDb 
f060: 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e  is.** not curren
f070: 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20  tly open in WAL 
f080: 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  mode..**.** If a
f090: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
f0a0: 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61  open on the data
f0b0: 62 61 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b  base being check
f0c0: 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a  pointed, this .*
f0d0: 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  * function retur
f0e0: 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  ns SQLITE_LOCKED
f0f0: 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e   and a checkpoin
f100: 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74  t is not attempt
f110: 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72  ed. If .** an er
f120: 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
f130: 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65   running the che
f140: 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69  ckpoint, an SQLi
f150: 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
f160: 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69   .** returned (i
f170: 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  .e. SQLITE_IOERR
f180: 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  ). Otherwise, SQ
f190: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54  LITE_OK..**.** T
f1a0: 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61  he mutex on data
f1b0: 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73  base handle db s
f1c0: 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79  hould be held by
f1d0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65   the caller. The
f1e0: 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69   mutex.** associ
f1f0: 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73 70  ated with the sp
f200: 65 63 69 66 69 63 20 62 2d 74 72 65 65 20 62 65  ecific b-tree be
f210: 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64  ing checkpointed
f220: 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20   is taken by.** 
f230: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68  this function wh
f240: 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69  ile the checkpoi
f250: 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a  nt is running..*
f260: 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70  *.** If iDb is p
f270: 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58  assed SQLITE_MAX
f280: 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20  _ATTACHED, then 
f290: 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74  all attached dat
f2a0: 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68  abases are.** ch
f2b0: 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61  eckpointed. If a
f2c0: 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
f2d0: 6e 74 65 72 65 64 20 69 74 20 69 73 20 72 65 74  ntered it is ret
f2e0: 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  urned immediatel
f2f0: 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70  y -.** no attemp
f300: 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65  t is made to che
f310: 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61  ckpoint any rema
f320: 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e  ining databases.
f330: 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
f340: 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66   eMode is one of
f350: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
f360: 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c  NT_PASSIVE, FULL
f370: 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f 0a   or RESTART..*/.
f380: 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b  int sqlite3Check
f390: 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
f3a0: 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20  b, int iDb, int 
f3b0: 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f  eMode, int *pnLo
f3c0: 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b  g, int *pnCkpt){
f3d0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
f3e0: 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
f3f0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
f400: 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  e */.  int i;   
f410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f420: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
f430: 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75 67  o iterate throug
f440: 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20 2a  h attached dbs *
f450: 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d 20  /.  int bBusy = 
f460: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
f470: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53      /* True if S
f480: 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20 62  QLITE_BUSY has b
f490: 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20  een encountered 
f4a0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
f4b0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
f4c0: 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20  (db->mutex) );. 
f4d0: 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67 20   assert( !pnLog 
f4e0: 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b  || *pnLog==-1 );
f4f0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43 6b  .  assert( !pnCk
f500: 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d  pt || *pnCkpt==-
f510: 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  1 );..  for(i=0;
f520: 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72 63   i<db->nDb && rc
f530: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
f540: 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 44  ){.    if( i==iD
f550: 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45  b || iDb==SQLITE
f560: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 7b  _MAX_ATTACHED ){
f570: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
f580: 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f 69  te3BtreeCheckpoi
f590: 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42  nt(db->aDb[i].pB
f5a0: 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c  t, eMode, pnLog,
f5b0: 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20 20   pnCkpt);.      
f5c0: 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20  pnLog = 0;.     
f5d0: 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20   pnCkpt = 0;.   
f5e0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
f5f0: 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20  E_BUSY ){.      
f600: 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20 20    bBusy = 1;.   
f610: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f620: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  _OK;.      }.   
f630: 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
f640: 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20   (rc==SQLITE_OK 
f650: 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c 49  && bBusy) ? SQLI
f660: 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a  TE_BUSY : rc;.}.
f670: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f680: 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
f690: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
f6a0: 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20 69  n returns true i
f6b0: 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68  f main-memory sh
f6c0: 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e 73  ould be used ins
f6d0: 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d  tead of.** a tem
f6e0: 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72 20  porary file for 
f6f0: 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72 20  transient pager 
f700: 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65 6d  files and statem
f710: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a  ent journals..**
f720: 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   The value retur
f730: 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74  ned depends on t
f740: 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e  he value of db->
f750: 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e 74  temp_store (runt
f760: 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ime.** parameter
f770: 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  ) and the compil
f780: 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20  e time value of 
f790: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
f7a0: 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77  E. The.** follow
f7b0: 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72 69  ing table descri
f7c0: 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f 6e  bes the relation
f7d0: 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68 65  ship between the
f7e0: 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a  se two values.**
f7f0: 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
f800: 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65  ons return value
f810: 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45  ..**.**   SQLITE
f820: 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20  _TEMP_STORE     
f830: 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20  db->temp_store  
f840: 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74     Location of t
f850: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
f860: 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  e.**   ---------
f870: 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d  --------     ---
f880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20  -----------     
f890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a  --------------.*
f8b0: 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20  *   0           
f8c0: 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20            any   
f8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69 6c               fil
f8e0: 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20 30  e      (return 0
f8f0: 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
f900: 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20 20               1  
f910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f920: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
f930: 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20  n 0).**   1     
f940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f950: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
f960: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
f970: 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20  turn 1).**   1  
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f990: 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20     0            
f9a0: 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20        file      
f9b0: 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20  (return 0).**   
f9c0: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
f9d0: 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20 20        1         
f9e0: 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20           file   
f9f0: 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a     (return 0).**
fa00: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
fa10: 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20 20           2      
fa20: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
fa30: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
fa40: 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20  .**   2         
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20 20              0   
fa60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
fa70: 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e  emory    (return
fa80: 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20 20   1).**   3      
fa90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
faa0: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
fab0: 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74    memory    (ret
fac0: 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71  urn 1).*/.int sq
fad0: 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72  lite3TempInMemor
fae0: 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20  y(const sqlite3 
faf0: 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54 45  *db){.#if SQLITE
fb00: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20  _TEMP_STORE==1. 
fb10: 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65   return ( db->te
fb20: 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23  mp_store==2 );.#
fb30: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
fb40: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20  _TEMP_STORE==2. 
fb50: 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65   return ( db->te
fb60: 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23  mp_store!=1 );.#
fb70: 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
fb80: 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20  _TEMP_STORE==3. 
fb90: 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69   return 1;.#endi
fba0: 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d  f.#if SQLITE_TEM
fbb0: 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c  P_STORE<1 || SQL
fbc0: 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33  ITE_TEMP_STORE>3
fbd0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e  .  return 0;.#en
fbe0: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  dif.}../*.** Ret
fbf0: 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65  urn UTF-8 encode
fc00: 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  d English langua
fc10: 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f  ge explanation o
fc20: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
fc30: 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63  t.** error..*/.c
fc40: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
fc50: 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65  e3_errmsg(sqlite
fc60: 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20  3 *db){.  const 
fc70: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21  char *z;.  if( !
fc80: 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  db ){.    return
fc90: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
fca0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
fcb0: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
fcc0: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
fcd0: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
fce0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
fcf0: 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  Str(SQLITE_MISUS
fd00: 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73  E_BKPT);.  }.  s
fd10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
fd20: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
fd30: 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46   if( db->mallocF
fd40: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d  ailed ){.    z =
fd50: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53   sqlite3ErrStr(S
fd60: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20  QLITE_NOMEM);.  
fd70: 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74 63  }else{.    testc
fd80: 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30  ase( db->pErr==0
fd90: 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61   );.    z = (cha
fda0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
fdb0: 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29 3b  _text(db->pErr);
fdc0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64 62  .    assert( !db
fdd0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
fde0: 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
fdf0: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
fe00: 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
fe10: 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20  rCode);.    }.  
fe20: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
fe30: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
fe40: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a  x);.  return z;.
fe50: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
fe60: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a  E_OMIT_UTF16./*.
fe70: 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36  ** Return UTF-16
fe80: 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68   encoded English
fe90: 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e   language explan
fea0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73  ation of the mos
feb0: 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f  t recent.** erro
fec0: 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64  r..*/.const void
fed0: 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67   *sqlite3_errmsg
fee0: 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  16(sqlite3 *db){
fef0: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
ff00: 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d  u16 outOfMem[] =
ff10: 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c   {.    'o', 'u',
ff20: 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20   't', ' ', 'o', 
ff30: 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27  'f', ' ', 'm', '
ff40: 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72  e', 'm', 'o', 'r
ff50: 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20  ', 'y', 0.  };. 
ff60: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
ff70: 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20  6 misuse[] = {. 
ff80: 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62 27     'l', 'i', 'b'
ff90: 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27 2c  , 'r', 'a', 'r',
ffa0: 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   'y', ' ', .    
ffb0: 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27  'r', 'o', 'u', '
ffc0: 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27 65  t', 'i', 'n', 'e
ffd0: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63 27  ', ' ', .    'c'
ffe0: 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c  , 'a', 'l', 'l',
fff0: 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c 20   'e', 'd', ' ', 
10000 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27  .    'o', 'u', '
10010 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f  t', ' ', .    'o
10020 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'f', ' ', .  
10030 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27 2c    's', 'e', 'q',
10040 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20   'u', 'e', 'n', 
10050 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b  'c', 'e', 0.  };
10060 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ..  const void *
10070 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
10080 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64      return (void
10090 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d   *)outOfMem;.  }
100a0 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
100b0 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
100c0 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
100d0 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73  turn (void *)mis
100e0 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  use;.  }.  sqlit
100f0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
10100 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
10110 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
10120 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f  d ){.    z = (vo
10130 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20  id *)outOfMem;. 
10140 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20   }else{.    z = 
10150 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
10160 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a  xt16(db->pErr);.
10170 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a      if( z==0 ){.
10180 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
10190 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 64 62  orWithMsg(db, db
101a0 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c 69 74  ->errCode, sqlit
101b0 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72  e3ErrStr(db->err
101c0 43 6f 64 65 29 29 3b 0a 20 20 20 20 20 20 7a 20  Code));.      z 
101d0 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
101e0 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
101f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  ;.    }.    /* A
10200 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61   malloc() may ha
10210 76 65 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e  ve failed within
10220 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c   the call to sql
10230 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
10240 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65  6().    ** above
10250 2e 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  . If this is the
10260 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
10270 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
10280 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20   flag needs to. 
10290 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64     ** be cleared
102a0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
102b0 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72 65 63  g. Do this direc
102c0 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
102d0 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  via.    ** sqlit
102e0 65 33 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20  e3ApiExit(), to 
102f0 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68  avoid setting th
10300 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
10310 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
10320 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e  .    */.    db->
10330 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30  mallocFailed = 0
10340 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
10350 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
10360 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
10370 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20   z;.}.#endif /* 
10380 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
10390 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  6 */../*.** Retu
103a0 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  rn the most rece
103b0 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65  nt error code ge
103c0 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20 53 51  nerated by an SQ
103d0 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66  Lite routine. If
103e0 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73   NULL is.** pass
103f0 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ed to this funct
10400 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61  ion, we assume a
10410 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
10420 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f   during sqlite3_
10430 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73  open()..*/.int s
10440 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73  qlite3_errcode(s
10450 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
10460 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65  f( db && !sqlite
10470 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
10480 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
10490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
104a0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20  SUSE_BKPT;.  }. 
104b0 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e   if( !db || db->
104c0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
104d0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
104e0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72  E_NOMEM;.  }.  r
104f0 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64  eturn db->errCod
10500 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b  e & db->errMask;
10510 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  .}.int sqlite3_e
10520 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
10530 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
10540 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69 74  if( db && !sqlit
10550 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
10560 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
10570 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
10580 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
10590 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d    if( !db || db-
105a0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
105b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
105c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
105d0 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f  return db->errCo
105e0 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  de;.}../*.** Ret
105f0 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61  urn a string tha
10600 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
10610 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70  kind of error sp
10620 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a  ecified in the.*
10630 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72  * argument.  For
10640 20 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d 70 6c   now, this simpl
10650 79 20 63 61 6c 6c 73 20 74 68 65 20 69 6e 74 65  y calls the inte
10660 72 6e 61 6c 20 73 71 6c 69 74 65 33 45 72 72 53  rnal sqlite3ErrS
10670 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  tr().** function
10680 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
10690 2a 73 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28  *sqlite3_errstr(
106a0 69 6e 74 20 72 63 29 7b 0a 20 20 72 65 74 75 72  int rc){.  retur
106b0 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
106c0 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  rc);.}../*.** In
106d0 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63 61 63  validate all cac
106e0 68 65 64 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65  hed KeyInfo obje
106f0 63 74 73 20 66 6f 72 20 64 61 74 61 62 61 73 65  cts for database
10700 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 22   connection "db"
10710 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10720 69 6e 76 61 6c 69 64 61 74 65 43 61 63 68 65 64  invalidateCached
10730 4b 65 79 49 6e 66 6f 28 73 71 6c 69 74 65 33 20  KeyInfo(sqlite3 
10740 2a 64 62 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b  *db){.  Db *pDb;
10750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10760 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20      /* A single 
10770 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
10780 74 20 69 44 62 3b 20 20 20 20 20 20 20 20 20 20  t iDb;          
10790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
107a0 20 64 61 74 61 62 61 73 65 20 69 6e 64 65 78 20   database index 
107b0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 48 61 73 68  number */.  Hash
107c0 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20  Elem *k;        
107d0 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
107e0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c  ooping over tabl
107f0 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54  es in pDb */.  T
10800 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20  able *pTab;     
10810 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20             /* A 
10820 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
10830 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78  abase */.  Index
10840 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20 20 20   *pIdx;         
10850 20 20 20 20 20 20 20 2f 2a 20 45 61 63 68 20 69         /* Each i
10860 6e 64 65 78 20 2a 2f 0a 0a 20 20 66 6f 72 28 69  ndex */..  for(i
10870 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44  Db=0, pDb=db->aD
10880 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20  b; iDb<db->nDb; 
10890 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20  iDb++, pDb++){. 
108a0 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d     if( pDb->pBt=
108b0 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
108c0 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45     sqlite3BtreeE
108d0 6e 74 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a  nter(pDb->pBt);.
108e0 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65      for(k=sqlite
108f0 48 61 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e  HashFirst(&pDb->
10900 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68  pSchema->tblHash
10910 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48  );  k; k=sqliteH
10920 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20  ashNext(k)){.   
10930 20 20 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65     pTab = (Table
10940 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
10950 28 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70  (k);.      for(p
10960 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78  Idx=pTab->pIndex
10970 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64  ; pIdx; pIdx=pId
10980 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  x->pNext){.     
10990 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70 4b 65     if( pIdx->pKe
109a0 79 49 6e 66 6f 20 26 26 20 70 49 64 78 2d 3e 70  yInfo && pIdx->p
109b0 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20  KeyInfo->db==db 
109c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
109d0 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66  ite3KeyInfoUnref
109e0 28 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 29  (pIdx->pKeyInfo)
109f0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49 64 78  ;.          pIdx
10a00 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a  ->pKeyInfo = 0;.
10a10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10a20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
10a30 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 44  te3BtreeLeave(pD
10a40 62 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a  b->pBt);.  }.}..
10a50 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
10a60 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ew collating fun
10a70 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61  ction for databa
10a80 73 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61  se "db".  The na
10a90 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61  me is zName.** a
10aa0 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  nd the encoding 
10ab0 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69  is enc..*/.stati
10ac0 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c  c int createColl
10ad0 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
10ae0 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  * db,.  const ch
10af0 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38  ar *zName, .  u8
10b00 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43   enc,.  void* pC
10b10 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
10b20 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
10b30 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
10b40 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
10b50 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
10b60 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ).){.  CollSeq *
10b70 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63  pColl;.  int enc
10b80 32 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  2;.  .  assert( 
10b90 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
10ba0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
10bb0 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  ..  /* If SQLITE
10bc0 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
10bd0 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
10be0 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
10bf0 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
10c00 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
10c10 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
10c20 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
10c30 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
10c40 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
10c50 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
10c60 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
10c70 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e  nally..  */.  en
10c80 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74  c2 = enc;.  test
10c90 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49  case( enc2==SQLI
10ca0 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65  TE_UTF16 );.  te
10cb0 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
10cc0 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
10cd0 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32  ED );.  if( enc2
10ce0 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c  ==SQLITE_UTF16 |
10cf0 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  | enc2==SQLITE_U
10d00 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a  TF16_ALIGNED ){.
10d10 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54      enc2 = SQLIT
10d20 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
10d30 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51   }.  if( enc2<SQ
10d40 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63  LITE_UTF8 || enc
10d50 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  2>SQLITE_UTF16BE
10d60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10d70 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
10d80 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  T;.  }..  /* Che
10d90 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  ck if this call 
10da0 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72  is removing or r
10db0 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73  eplacing an exis
10dc0 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a  ting collation .
10dd0 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49    ** sequence. I
10de0 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20  f so, and there 
10df0 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
10e00 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20  return busy. If 
10e10 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e  there.  ** are n
10e20 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e  o active VMs, in
10e30 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65  validate any pre
10e40 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
10e50 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ents..  */.  pCo
10e60 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
10e70 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
10e80 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  enc2, zName, 0);
10e90 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20  .  if( pColl && 
10ea0 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20  pColl->xCmp ){. 
10eb0 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65     if( db->nVdbe
10ec0 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20  Active ){.      
10ed0 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
10ee0 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42  Msg(db, SQLITE_B
10ef0 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75  USY, .        "u
10f00 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f  nable to delete/
10f10 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e  modify collation
10f20 20 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f   sequence due to
10f30 20 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e   active statemen
10f40 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ts");.      retu
10f50 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
10f60 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10f70 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53  3ExpirePreparedS
10f80 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20  tatements(db);. 
10f90 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43 61 63     invalidateCac
10fa0 68 65 64 4b 65 79 49 6e 66 6f 28 64 62 29 3b 0a  hedKeyInfo(db);.
10fb0 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61  .    /* If colla
10fc0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43  tion sequence pC
10fd0 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  oll was created 
10fe0 64 69 72 65 63 74 6c 79 20 62 79 20 61 20 63 61  directly by a ca
10ff0 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c  ll to.    ** sql
11000 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c  ite3_create_coll
11010 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67  ation, and not g
11020 65 6e 65 72 61 74 65 64 20 62 79 20 73 79 6e 74  enerated by synt
11030 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20  hCollSeq(),.    
11040 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69  ** then any copi
11050 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68  es made by synth
11060 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74  CollSeq() need t
11070 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64  o be invalidated
11080 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63  ..    ** Also, c
11090 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63  ollation destruc
110a0 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44  tor - CollSeq.xD
110b0 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20  el() - function 
110c0 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20  may need.    ** 
110d0 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20  to be called..  
110e0 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70    */ .    if( (p
110f0 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c  Coll->enc & ~SQL
11100 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45  ITE_UTF16_ALIGNE
11110 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20  D)==enc2 ){.    
11120 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c    CollSeq *aColl
11130 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68 46 69   = sqlite3HashFi
11140 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  nd(&db->aCollSeq
11150 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
11160 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
11170 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
11180 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
11190 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b   *p = &aColl[j];
111a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
111b0 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
111c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
111d0 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20   p->xDel ){.    
111e0 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28          p->xDel(
111f0 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  p->pUser);.     
11200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
11210 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20   p->xCmp = 0;.  
11220 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
11230 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f      }.  }..  pCo
11240 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
11250 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
11260 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b  enc2, zName, 1);
11270 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20  .  if( pColl==0 
11280 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
11290 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e  NOMEM;.  pColl->
112a0 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b  xCmp = xCompare;
112b0 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20  .  pColl->pUser 
112c0 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d  = pCtx;.  pColl-
112d0 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20  >xDel = xDel;.  
112e0 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38  pColl->enc = (u8
112f0 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20  )(enc2 | (enc & 
11300 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
11310 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65  GNED));.  sqlite
11320 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
11330 45 5f 4f 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20  E_OK);.  return 
11340 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f  SQLITE_OK;.}.../
11350 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20  *.** This array 
11360 64 65 66 69 6e 65 73 20 68 61 72 64 20 75 70 70  defines hard upp
11370 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d  er bounds on lim
11380 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a  it values.  The.
11390 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d  ** initializer m
113a0 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73  ust be kept in s
113b0 79 6e 63 20 77 69 74 68 20 74 68 65 20 53 51 4c  ync with the SQL
113c0 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23  ITE_LIMIT_*.** #
113d0 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74  defines in sqlit
113e0 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e3.h..*/.static 
113f0 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c  const int aHardL
11400 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c  imit[] = {.  SQL
11410 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a  ITE_MAX_LENGTH,.
11420 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c    SQLITE_MAX_SQL
11430 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54  _LENGTH,.  SQLIT
11440 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20  E_MAX_COLUMN,.  
11450 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f  SQLITE_MAX_EXPR_
11460 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  DEPTH,.  SQLITE_
11470 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
11480 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  ECT,.  SQLITE_MA
11490 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c  X_VDBE_OP,.  SQL
114a0 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
114b0 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  _ARG,.  SQLITE_M
114c0 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53  AX_ATTACHED,.  S
114d0 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
114e0 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20  ATTERN_LENGTH,. 
114f0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
11500 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 20 20 20  ABLE_NUMBER,    
11510 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 30 39    /* IMP: R-3809
11520 31 2d 33 32 33 35 32 20 2a 2f 0a 20 20 53 51 4c  1-32352 */.  SQL
11530 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f  ITE_MAX_TRIGGER_
11540 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  DEPTH,.  SQLITE_
11550 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
11560 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61  DS,.};../*.** Ma
11570 6b 65 20 73 75 72 65 20 74 68 65 20 68 61 72 64  ke sure the hard
11580 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74 20   limits are set 
11590 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61  to reasonable va
115a0 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  lues.*/.#if SQLI
115b0 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30  TE_MAX_LENGTH<10
115c0 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
115d0 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _MAX_LENGTH must
115e0 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
115f0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
11600 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
11610 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51  H<100.# error SQ
11620 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
11630 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
11640 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
11650 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
11660 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45  QL_LENGTH>SQLITE
11670 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72  _MAX_LENGTH.# er
11680 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ror SQLITE_MAX_S
11690 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e  QL_LENGTH must n
116a0 6f 74 20 62 65 20 67 72 65 61 74 65 72 20 74 68  ot be greater th
116b0 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  an SQLITE_MAX_LE
116c0 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20  NGTH.#endif.#if 
116d0 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f  SQLITE_MAX_COMPO
116e0 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65  UND_SELECT<2.# e
116f0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
11700 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20  COMPOUND_SELECT 
11710 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
11720 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51   2.#endif.#if SQ
11730 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
11740 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  <40.# error SQLI
11750 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d  TE_MAX_VDBE_OP m
11760 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
11770 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  40.#endif.#if SQ
11780 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
11790 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54  N_ARG<0 || SQLIT
117a0 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
117b0 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72 20  RG>1000.# error 
117c0 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
117d0 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20  ION_ARG must be 
117e0 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31 30  between 0 and 10
117f0 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
11800 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
11810 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41  D<0 || SQLITE_MA
11820 58 5f 41 54 54 41 43 48 45 44 3e 31 32 35 0a 23  X_ATTACHED>125.#
11830 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
11840 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74 20  X_ATTACHED must 
11850 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
11860 20 31 32 35 0a 23 65 6e 64 69 66 0a 23 69 66 20   125.#endif.#if 
11870 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
11880 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31  PATTERN_LENGTH<1
11890 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
118a0 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
118b0 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20  _LENGTH must be 
118c0 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69  at least 1.#endi
118d0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
118e0 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20  _COLUMN>32767.# 
118f0 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
11900 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74  _COLUMN must not
11910 20 65 78 63 65 65 64 20 33 32 37 36 37 0a 23 65   exceed 32767.#e
11920 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
11930 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MAX_TRIGGER_DEPT
11940 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  H<1.# error SQLI
11950 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44  TE_MAX_TRIGGER_D
11960 45 50 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  EPTH must be at 
11970 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23  least 1.#endif.#
11980 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f  if SQLITE_MAX_WO
11990 52 4b 45 52 5f 54 48 52 45 41 44 53 3c 30 20 7c  RKER_THREADS<0 |
119a0 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  | SQLITE_MAX_WOR
119b0 4b 45 52 5f 54 48 52 45 41 44 53 3e 35 30 0a 23  KER_THREADS>50.#
119c0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
119d0 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
119e0 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
119f0 20 30 20 61 6e 64 20 35 30 0a 23 65 6e 64 69 66   0 and 50.#endif
11a00 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20  .../*.** Change 
11a10 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c  the value of a l
11a20 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68  imit.  Report th
11a30 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20  e old value..** 
11a40 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69  If an invalid li
11a50 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73 75 70  mit index is sup
11a60 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31  plied, report -1
11a70 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61  ..** Make no cha
11a80 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72  nges but still r
11a90 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61  eport the old va
11aa0 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65  lue if the.** ne
11ab0 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74  w limit is negat
11ac0 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77  ive..**.** A new
11ad0 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65   lower limit doe
11ae0 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69  s not shrink exi
11af0 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73  sting constructs
11b00 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70  ..** It merely p
11b10 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73  revents new cons
11b20 74 72 75 63 74 73 20 74 68 61 74 20 65 78 63 65  tructs that exce
11b30 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20  ed the limit.** 
11b40 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f  from forming..*/
11b50 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d  .int sqlite3_lim
11b60 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  it(sqlite3 *db, 
11b70 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74  int limitId, int
11b80 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e   newLimit){.  in
11b90 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 23 69 66  t oldLimit;..#if
11ba0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11bb0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
11bc0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
11bd0 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20  CheckOk(db) ){. 
11be0 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f     (void)SQLITE_
11bf0 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20  MISUSE_BKPT;.   
11c00 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
11c10 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 45 56 49  #endif..  /* EVI
11c20 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38  DENCE-OF: R-3018
11c30 39 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63 68  9-54097 For each
11c40 20 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79 20   limit category 
11c50 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d  SQLITE_LIMIT_NAM
11c60 45 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20  E.  ** there is 
11c70 61 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75  a hard upper bou
11c80 6e 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c  nd set at compil
11c90 65 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70 72  e-time by a C pr
11ca0 65 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20  eprocessor.  ** 
11cb0 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c  macro called SQL
11cc0 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54  ITE_MAX_NAME. (T
11cd0 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20  he "_LIMIT_" in 
11ce0 74 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61 6e  the name is chan
11cf0 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41  ged to.  ** "_MA
11d00 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73  X_".).  */.  ass
11d10 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
11d20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e  SQLITE_LIMIT_LEN
11d30 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  GTH]==SQLITE_MAX
11d40 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
11d50 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
11d60 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c  SQLITE_LIMIT_SQL
11d70 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45  _LENGTH]==SQLITE
11d80 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  _MAX_SQL_LENGTH 
11d90 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
11da0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
11db0 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51  IMIT_COLUMN]==SQ
11dc0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20  LITE_MAX_COLUMN 
11dd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
11de0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
11df0 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d  IMIT_EXPR_DEPTH]
11e00 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  ==SQLITE_MAX_EXP
11e10 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  R_DEPTH );.  ass
11e20 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
11e30 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d  SQLITE_LIMIT_COM
11e40 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53  POUND_SELECT]==S
11e50 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55  QLITE_MAX_COMPOU
11e60 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61 73  ND_SELECT);.  as
11e70 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
11e80 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44  [SQLITE_LIMIT_VD
11e90 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d  BE_OP]==SQLITE_M
11ea0 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20  AX_VDBE_OP );.  
11eb0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
11ec0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
11ed0 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53  FUNCTION_ARG]==S
11ee0 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
11ef0 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73 65  ON_ARG );.  asse
11f00 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
11f10 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41  QLITE_LIMIT_ATTA
11f20 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  CHED]==SQLITE_MA
11f30 58 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20 20  X_ATTACHED );.  
11f40 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
11f50 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
11f60 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
11f70 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20  GTH]==.         
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11fa0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58        SQLITE_MAX
11fb0 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
11fc0 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74  NGTH );.  assert
11fd0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
11fe0 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42  ITE_LIMIT_VARIAB
11ff0 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49  LE_NUMBER]==SQLI
12000 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f  TE_MAX_VARIABLE_
12010 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65 72  NUMBER);.  asser
12020 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
12030 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47  LITE_LIMIT_TRIGG
12040 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54  ER_DEPTH]==SQLIT
12050 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
12060 50 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  PTH );.  assert(
12070 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
12080 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
12090 54 48 52 45 41 44 53 5d 3d 3d 53 51 4c 49 54 45  THREADS]==SQLITE
120a0 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45  _MAX_WORKER_THRE
120b0 41 44 53 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ADS );.  assert(
120c0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f   SQLITE_LIMIT_WO
120d0 52 4b 45 52 5f 54 48 52 45 41 44 53 3d 3d 28 53  RKER_THREADS==(S
120e0 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29  QLITE_N_LIMIT-1)
120f0 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69   );...  if( limi
12100 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64  tId<0 || limitId
12110 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54  >=SQLITE_N_LIMIT
12120 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d   ){.    return -
12130 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69  1;.  }.  oldLimi
12140 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c  t = db->aLimit[l
12150 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e  imitId];.  if( n
12160 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20  ewLimit>=0 ){   
12170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12180 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d  /* IMP: R-52476-
12190 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69 66 28  28732 */.    if(
121a0 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c   newLimit>aHardL
121b0 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b  imit[limitId] ){
121c0 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20  .      newLimit 
121d0 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  = aHardLimit[lim
121e0 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20  itId];  /* IMP: 
121f0 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20 2a 2f  R-51463-25634 */
12200 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61  .    }.    db->a
12210 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d  Limit[limitId] =
12220 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20   newLimit;.  }. 
12230 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74   return oldLimit
12240 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
12250 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
12260 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d  53341-35419 */.}
12270 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
12280 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f  ction is used to
12290 20 70 61 72 73 65 20 62 6f 74 68 20 55 52 49 73   parse both URIs
122a0 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c   and non-URI fil
122b0 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20 62 79  enames passed by
122c0 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20   the.** user to 
122d0 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20 73 71  API functions sq
122e0 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20  lite3_open() or 
122f0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
12300 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74 61 62  ), and for datab
12310 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70 65 63  ase.** URIs spec
12320 69 66 69 65 64 20 61 73 20 70 61 72 74 20 6f 66  ified as part of
12330 20 41 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e   ATTACH statemen
12340 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ts..**.** The fi
12350 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
12360 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
12370 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
12380 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f 72 0a   VFS to use (or.
12390 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67  ** a NULL to sig
123a0 6e 69 66 79 20 74 68 65 20 64 65 66 61 75 6c 74  nify the default
123b0 20 56 46 53 29 20 69 66 20 74 68 65 20 55 52 49   VFS) if the URI
123c0 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
123d0 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a  n a "vfs=xxx".**
123e0 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
123f0 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67  . The second arg
12400 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74  ument contains t
12410 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55  he URI (or non-U
12420 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20  RI filename).** 
12430 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74 68 69  itself. When thi
12440 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
12450 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61 67 73  lled the *pFlags
12460 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64   variable should
12470 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20   contain.** the 
12480 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20 74 6f  default flags to
12490 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
124a0 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68 2e 20  se handle with. 
124b0 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64  The value stored
124c0 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d   in.** *pFlags m
124d0 61 79 20 62 65 20 75 70 64 61 74 65 64 20 62 65  ay be updated be
124e0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69  fore returning i
124f0 66 20 74 68 65 20 55 52 49 20 66 69 6c 65 6e 61  f the URI filena
12500 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20  me contains .** 
12510 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72 20 22  "cache=xxx" or "
12520 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72 79 20  mode=xxx" query 
12530 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a  parameters..**.*
12540 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
12550 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
12560 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  turned. In this 
12570 63 61 73 65 20 2a 70 70 56 66 73 20 69 73 20 73  case *ppVfs is s
12580 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a  et to point to.*
12590 2a 20 74 68 65 20 56 46 53 20 74 68 61 74 20 73  * the VFS that s
125a0 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f  hould be used to
125b0 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61   open the databa
125c0 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65  se file. *pzFile
125d0 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f   is set to.** po
125e0 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
125f0 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e  containing the n
12600 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ame of the file 
12610 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73 20 74  to open. It is t
12620 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62  he .** responsib
12630 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
12640 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
12650 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66  y call sqlite3_f
12660 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65  ree() to release
12670 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 2e  .** this buffer.
12680 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
12690 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20  or occurs, then 
126a0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
126b0 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
126c0 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a   and *pzErrMsg.*
126d0 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20  * may be set to 
126e0 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
126f0 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20  r containing an 
12700 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
12710 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61   error .** messa
12720 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ge. It is the re
12730 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
12740 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  the caller to ev
12750 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65  entually release
12760 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65 72 20  .** this buffer 
12770 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74  by calling sqlit
12780 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e  e3_free()..*/.in
12790 74 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72  t sqlite3ParseUr
127a0 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i(.  const char 
127b0 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20 20 20  *zDefaultVfs,   
127c0 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75       /* VFS to u
127d0 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d 78 78  se if no "vfs=xx
127e0 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f 6e 20  x" query option 
127f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
12800 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20 20 20  *zUri,          
12810 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d       /* Nul-term
12820 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20 70 61  inated URI to pa
12830 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  rse */.  unsigne
12840 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20  d int *pFlags,  
12850 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f           /* IN/O
12860 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  UT: SQLITE_OPEN_
12870 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73  XXX flags */.  s
12880 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70 70 56  qlite3_vfs **ppV
12890 66 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  fs,            /
128a0 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20 75 73  * OUT: VFS to us
128b0 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70  e */ .  char **p
128c0 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20  zFile,          
128d0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
128e0 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65  Filename compone
128f0 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63  nt of URI */.  c
12900 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20  har **pzErrMsg  
12910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12920 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73  * OUT: Error mes
12930 73 61 67 65 20 28 69 66 20 72 63 21 3d 53 51 4c  sage (if rc!=SQL
12940 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20  ITE_OK) */.){.  
12950 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12960 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  OK;.  unsigned i
12970 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61  nt flags = *pFla
12980 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  gs;.  const char
12990 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61 75 6c   *zVfs = zDefaul
129a0 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46  tVfs;.  char *zF
129b0 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20  ile;.  char c;. 
129c0 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c 69   int nUri = sqli
129d0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55 72 69  te3Strlen30(zUri
129e0 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70  );..  assert( *p
129f0 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20  zErrMsg==0 );.. 
12a00 20 69 66 28 20 28 28 66 6c 61 67 73 20 26 20 53   if( ((flags & S
12a10 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20  QLITE_OPEN_URI) 
12a20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  || sqlite3Global
12a30 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 29  Config.bOpenUri)
12a40 20 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d 35 20   .   && nUri>=5 
12a50 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20  && memcmp(zUri, 
12a60 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 2f  "file:", 5)==0 /
12a70 2a 20 49 4d 50 3a 20 52 2d 35 37 38 38 34 2d 33  * IMP: R-57884-3
12a80 37 34 39 36 20 2a 2f 0a 20 20 29 7b 0a 20 20 20  7496 */.  ){.   
12a90 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20   char *zOpt;.   
12aa0 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20   int eState;    
12ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
12ac0 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20 77  * Parser state w
12ad0 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20  hen parsing URI 
12ae0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20  */.    int iIn; 
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b00 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68       /* Input ch
12b10 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
12b20 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20  .    int iOut = 
12b30 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12b40 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61     /* Output cha
12b50 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a  racter index */.
12b60 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
12b70 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20  nUri+2;         
12b80 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
12b90 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ace to allocate 
12ba0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  */..    /* Make 
12bb0 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f  sure the SQLITE_
12bc0 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73  OPEN_URI flag is
12bd0 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65   set to indicate
12be0 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65   to the VFS xOpe
12bf0 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  n .    ** method
12c00 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79 20   that there may 
12c10 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65 74  be extra paramet
12c20 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ers following th
12c30 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f  e file-name.  */
12c40 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
12c50 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a  LITE_OPEN_URI;..
12c60 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69      for(iIn=0; i
12c70 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20  In<nUri; iIn++) 
12c80 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69  nByte += (zUri[i
12c90 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a  In]=='&');.    z
12ca0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
12cb0 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
12cc0 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72    if( !zFile ) r
12cd0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12ce0 45 4d 3b 0a 0a 20 20 20 20 69 49 6e 20 3d 20 35  EM;..    iIn = 5
12cf0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
12d00 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48 4f  _ALLOW_URI_AUTHO
12d10 52 49 54 59 0a 20 20 20 20 2f 2a 20 44 69 73 63  RITY.    /* Disc
12d20 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20 61  ard the scheme a
12d30 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65 67  nd authority seg
12d40 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52 49  ments of the URI
12d50 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55 72  . */.    if( zUr
12d60 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72  i[5]=='/' && zUr
12d70 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i[6]=='/' ){.   
12d80 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20     iIn = 7;.    
12d90 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
12da0 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
12db0 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20  ='/' ) iIn++;.  
12dc0 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20 26      if( iIn!=7 &
12dd0 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d 65  & (iIn!=16 || me
12de0 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74 22  mcmp("localhost"
12df0 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29 20  , &zUri[7], 9)) 
12e00 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
12e10 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
12e20 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20  printf("invalid 
12e30 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20 25  uri authority: %
12e40 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  .*s", .         
12e50 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69 5b     iIn-7, &zUri[
12e60 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  7]);.        rc 
12e70 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
12e80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
12e90 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20  se_uri_out;.    
12ea0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
12eb0 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68  ..    /* Copy th
12ec0 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 61  e filename and a
12ed0 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ny query paramet
12ee0 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46 69  ers into the zFi
12ef0 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20  le buffer. .    
12f00 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65 73  ** Decode %HH es
12f10 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e 67  cape codes along
12f20 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20 2a   the way. .    *
12f30 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e 20  *.    ** Within 
12f40 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69 61  this loop, varia
12f50 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20 62  ble eState may b
12f60 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f 72  e set to 0, 1 or
12f70 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20   2, depending.  
12f80 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72 73    ** on the pars
12f90 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73 20  ing context. As 
12fa0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a  follows:.    **.
12fb0 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72 73      **   0: Pars
12fc0 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20  ing file-name.. 
12fd0 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73 69     **   1: Parsi
12fe0 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e 20  ng name section 
12ff0 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20  of a name=value 
13000 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
13010 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61 72  .    **   2: Par
13020 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74 69  sing value secti
13030 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c  on of a name=val
13040 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ue query paramet
13050 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65  er..    */.    e
13060 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 77  State = 0;.    w
13070 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b  hile( (c = zUri[
13080 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  iIn])!=0 && c!='
13090 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 2b  #' ){.      iIn+
130a0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  +;.      if( c==
130b0 27 25 27 20 0a 20 20 20 20 20 20 20 26 26 20 73  '%' .       && s
130c0 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a  qlite3Isxdigit(z
130d0 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20 20  Uri[iIn]) .     
130e0 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64    && sqlite3Isxd
130f0 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31 5d  igit(zUri[iIn+1]
13100 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
13110 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d 20      int octet = 
13120 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74  (sqlite3HexToInt
13130 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c  (zUri[iIn++]) <<
13140 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63 74   4);.        oct
13150 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65 78  et += sqlite3Hex
13160 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b  ToInt(zUri[iIn++
13170 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73  ]);..        ass
13180 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26 26  ert( octet>=0 &&
13190 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20 20   octet<256 );.  
131a0 20 20 20 20 20 20 69 66 28 20 6f 63 74 65 74 3d        if( octet=
131b0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
131c0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
131d0 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25 30  s taken when "%0
131e0 30 22 20 61 70 70 65 61 72 73 20 77 69 74 68 69  0" appears withi
131f0 6e 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74 68  n the URI. In th
13200 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
13210 63 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20 61  case we ignore a
13220 6c 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20 72  ll text in the r
13230 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
13240 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20 20  path, name or.  
13250 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
13260 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
13270 20 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e 6f   parsed. So igno
13280 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
13290 68 61 72 61 63 74 65 72 0a 20 20 20 20 20 20 20  haracter.       
132a0 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20 74     ** and skip t
132b0 6f 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c 20  o the next "?", 
132c0 22 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20 61  "=" or "&", as a
132d0 70 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a 20  ppropriate. */. 
132e0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
132f0 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21  (c = zUri[iIn])!
13300 3d 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20 20  =0 && c!='#' .  
13310 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
13320 65 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21 3d  eState!=0 || c!=
13330 27 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20 20  '?').           
13340 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 31     && (eState!=1
13350 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20 63   || (c!='=' && c
13360 21 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20 20  !='&')).        
13370 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
13380 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a 20  !=2 || c!='&'). 
13390 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
133a0 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20          iIn++;. 
133b0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
133c0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
133d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
133e0 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20   c = octet;.    
133f0 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61    }else if( eSta
13400 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26 27  te==1 && (c=='&'
13410 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20   || c=='=') ){. 
13420 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
13430 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20  [iOut-1]==0 ){. 
13440 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
13450 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65  mpty option name
13460 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f 70  . Ignore this op
13470 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e  tion altogether.
13480 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68   */.          wh
13490 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26  ile( zUri[iIn] &
134a0 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27  & zUri[iIn]!='#'
134b0 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21   && zUri[iIn-1]!
134c0 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20  ='&' ) iIn++;.  
134d0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
134e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
134f0 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20 29      if( c=='&' )
13500 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c  {.          zFil
13510 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
13520 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
13530 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
13540 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d  e = 2;.        }
13550 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a  .        c = 0;.
13560 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
13570 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63 3d  (eState==0 && c=
13580 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74 65  ='?') || (eState
13590 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20 29  ==2 && c=='&') )
135a0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b  {.        c = 0;
135b0 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20  .        eState 
135c0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
135d0 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
135e0 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = c;.    }.    
135f0 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29 20  if( eState==1 ) 
13600 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
13610 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
13620 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
13630 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
13640 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f  ] = '\0';..    /
13650 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 72 65  * Check if there
13660 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e   were any option
13670 73 20 73 70 65 63 69 66 69 65 64 20 74 68 61 74  s specified that
13680 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65 72   should be inter
13690 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20 68  preted .    ** h
136a0 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61  ere. Options tha
136b0 74 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65  t are interprete
136c0 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20 22  d here include "
136d0 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20 74  vfs" and those t
136e0 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65  hat.    ** corre
136f0 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20 74  spond to flags t
13700 68 61 74 20 6d 61 79 20 62 65 20 70 61 73 73 65  hat may be passe
13710 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  d to the sqlite3
13720 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a  _open_v2().    *
13730 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20  * method. */.   
13740 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73   zOpt = &zFile[s
13750 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
13760 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  File)+1];.    wh
13770 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a  ile( zOpt[0] ){.
13780 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d        int nOpt =
13790 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
137a0 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63 68  (zOpt);.      ch
137b0 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74  ar *zVal = &zOpt
137c0 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20  [nOpt+1];.      
137d0 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74  int nVal = sqlit
137e0 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29  e3Strlen30(zVal)
137f0 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 70  ;..      if( nOp
13800 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==3 && memcmp("
13810 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d  vfs", zOpt, 3)==
13820 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56 66  0 ){.        zVf
13830 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20  s = zVal;.      
13840 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
13850 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b  truct OpenMode {
13860 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
13870 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
13880 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20      int mode;.  
13890 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d        } *aMode =
138a0 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   0;.        char
138b0 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b   *zModeType = 0;
138c0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73  .        int mas
138d0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  k = 0;.        i
138e0 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20  nt limit = 0;.. 
138f0 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d         if( nOpt=
13900 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63 61  =5 && memcmp("ca
13910 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d  che", zOpt, 5)==
13920 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
13930 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65  tatic struct Ope
13940 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64 65  nMode aCacheMode
13950 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
13960 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20 20     { "shared",  
13970 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
13980 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  EDCACHE },.     
13990 20 20 20 20 20 20 20 7b 20 22 70 72 69 76 61 74         { "privat
139a0 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  e", SQLITE_OPEN_
139b0 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a  PRIVATECACHE },.
139c0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c              { 0,
139d0 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d   0 }.          }
139e0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73  ;..          mas
139f0 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  k = SQLITE_OPEN_
13a00 53 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c 49  SHAREDCACHE|SQLI
13a10 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
13a20 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20 20  ACHE;.          
13a30 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d 6f  aMode = aCacheMo
13a40 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69  de;.          li
13a50 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  mit = mask;.    
13a60 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20        zModeType 
13a70 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20 20  = "cache";.     
13a80 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
13a90 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63   nOpt==4 && memc
13aa0 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c  mp("mode", zOpt,
13ab0 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)==0 ){.      
13ac0 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63      static struc
13ad0 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e  t OpenMode aOpen
13ae0 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
13af0 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20 20         { "ro",  
13b00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
13b10 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20 20  ONLY },.        
13b20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51 4c      { "rw",  SQL
13b30 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
13b40 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 20  TE }, .         
13b50 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c 49     { "rwc", SQLI
13b60 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
13b70 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
13b80 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20  CREATE },.      
13b90 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79 22        { "memory"
13ba0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  , SQLITE_OPEN_ME
13bb0 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20 20  MORY },.        
13bc0 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20      { 0, 0 }.   
13bd0 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20         };..     
13be0 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49       mask = SQLI
13bf0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
13c00 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
13c10 45 41 44 57 52 49 54 45 0a 20 20 20 20 20 20 20  EADWRITE.       
13c20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
13c30 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
13c40 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   | SQLITE_OPEN_M
13c50 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20 20  EMORY;.         
13c60 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f   aMode = aOpenMo
13c70 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69  de;.          li
13c80 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61  mit = mask & fla
13c90 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d  gs;.          zM
13ca0 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63 65 73  odeType = "acces
13cb0 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  s";.        }.. 
13cc0 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65         if( aMode
13cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
13ce0 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t i;.          i
13cf0 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  nt mode = 0;.   
13d00 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
13d10 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29  aMode[i].z; i++)
13d20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
13d30 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d  nst char *z = aM
13d40 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20  ode[i].z;.      
13d50 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d        if( nVal==
13d60 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
13d70 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  z) && 0==memcmp(
13d80 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29  zVal, z, nVal) )
13d90 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
13da0 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e  mode = aMode[i].
13db0 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  mode;.          
13dc0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
13dd0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13de0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
13df0 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  f( mode==0 ){.  
13e00 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
13e10 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
13e20 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25  rintf("no such %
13e30 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f  s mode: %s", zMo
13e40 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20  deType, zVal);. 
13e50 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
13e60 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
13e70 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
13e80 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
13e90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13ea0 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26 20      if( (mode & 
13eb0 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d  ~SQLITE_OPEN_MEM
13ec0 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20  ORY)>limit ){.  
13ed0 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
13ee0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
13ef0 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20 6e  rintf("%s mode n
13f00 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c  ot allowed: %s",
13f10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f30 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79           zModeTy
13f40 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  pe, zVal);.     
13f50 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
13f60 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 20  TE_PERM;.       
13f70 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f       goto parse_
13f80 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  uri_out;.       
13f90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
13fa0 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26 20  lags = (flags & 
13fb0 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20  ~mask) | mode;. 
13fc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
13fd0 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20 26  ..      zOpt = &
13fe0 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20  zVal[nVal+1];.  
13ff0 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
14000 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    zFile = sqlite
14010 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b 32 29  3_malloc(nUri+2)
14020 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65  ;.    if( !zFile
14030 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
14040 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 63  _NOMEM;.    memc
14050 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20  py(zFile, zUri, 
14060 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c 65  nUri);.    zFile
14070 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20  [nUri] = '\0';. 
14080 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d     zFile[nUri+1]
14090 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61   = '\0';.    fla
140a0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
140b0 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a  EN_URI;.  }..  *
140c0 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  ppVfs = sqlite3_
140d0 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a  vfs_find(zVfs);.
140e0 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30 20    if( *ppVfs==0 
140f0 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67  ){.    *pzErrMsg
14100 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
14110 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73 3a  tf("no such vfs:
14120 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20   %s", zVfs);.   
14130 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
14140 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75  OR;.  }. parse_u
14150 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  ri_out:.  if( rc
14160 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14170 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
14180 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c  zFile);.    zFil
14190 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46  e = 0;.  }.  *pF
141a0 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
141b0 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b  *pzFile = zFile;
141c0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
141d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
141e0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f  tine does the wo
141f0 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20  rk of opening a 
14200 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61  database on beha
14210 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lf of.** sqlite3
14220 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69  _open() and sqli
14230 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68  te3_open16(). Th
14240 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e  e database filen
14250 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20  ame "zFilename" 
14260 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e   .** is UTF-8 en
14270 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  coded..*/.static
14280 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73   int openDatabas
14290 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
142a0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44  *zFilename, /* D
142b0 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
142c0 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a   UTF-8 encoded *
142d0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  /.  sqlite3 **pp
142e0 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  Db,        /* OU
142f0 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74 61  T: Returned data
14300 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
14310 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c   unsigned int fl
14320 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61  ags,    /* Opera
14330 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a  tional flags */.
14340 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
14350 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  fs       /* Name
14360 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75   of the VFS to u
14370 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  se */.){.  sqlit
14380 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
14390 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
143a0 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61  ore allocated ha
143b0 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  ndle here */.  i
143c0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
143d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
143e0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
143f0 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64 73  .  int isThreads
14400 61 66 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  afe;            
14410 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74     /* True for t
14420 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63  hreadsafe connec
14430 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  tions */.  char 
14440 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20  *zOpen = 0;     
14450 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
14460 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
14470 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65 65  to pass to Btree
14480 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72  Open() */.  char
14490 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20   *zErrMsg = 0;  
144a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
144b0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f  rror message fro
144c0 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72  m sqlite3ParseUr
144d0 69 28 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  i() */..#ifdef S
144e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49  QLITE_ENABLE_API
144f0 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70 70 44  _ARMOR.  if( ppD
14500 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  b==0 ) return SQ
14510 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
14520 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70 44 62  ;.#endif.  *ppDb
14530 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
14540 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
14550 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
14560 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
14570 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
14580 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  n rc;.#endif..  
14590 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65  /* Only allow se
145a0 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69  nsible combinati
145b0 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74  ons of bits in t
145c0 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
145d0 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20  t.  .  ** Throw 
145e0 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
145f0 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e  non-sense combin
14600 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20  ation is used.  
14610 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f  If we.  ** do no
14620 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20  t block illegal 
14630 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72  combinations her
14640 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67  e, it could trig
14650 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  ger.  ** assert(
14660 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  ) statements in 
14670 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20  deeper layers.  
14680 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61  Sensible combina
14690 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a  tions.  ** are:.
146a0 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53    **.  **  1:  S
146b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
146c0 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51  NLY.  **  2:  SQ
146d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
146e0 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51  ITE.  **  6:  SQ
146f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
14700 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
14710 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20  N_CREATE.  */.  
14720 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
14730 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d  PEN_READONLY  ==
14740 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72   0x01 );.  asser
14750 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  t( SQLITE_OPEN_R
14760 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32  EADWRITE == 0x02
14770 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
14780 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
14790 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20      == 0x04 );. 
147a0 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
147b0 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20  flags&7))==0x02 
147c0 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a  ); /* READONLY *
147d0 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  /.  testcase( (1
147e0 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
147f0 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49  04 ); /* READWRI
14800 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  TE */.  testcase
14810 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
14820 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41  ==0x40 ); /* REA
14830 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20  DWRITE | CREATE 
14840 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66  */.  if( ((1<<(f
14850 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36 29  lags&7)) & 0x46)
14860 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
14870 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
14880 42 4b 50 54 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  BKPT;  /* IMP: R
14890 2d 36 35 34 39 37 2d 34 34 35 39 34 20 2a 2f 0a  -65497-44594 */.
148a0 20 20 7d 0a 0a 20 20 69 66 28 20 73 71 6c 69 74    }..  if( sqlit
148b0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
148c0 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a  CoreMutex==0 ){.
148d0 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
148e0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
148f0 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ( flags & SQLITE
14900 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b  _OPEN_NOMUTEX ){
14910 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
14920 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69  e = 0;.  }else i
14930 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
14940 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58  E_OPEN_FULLMUTEX
14950 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
14960 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  safe = 1;.  }els
14970 65 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  e{.    isThreads
14980 61 66 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  afe = sqlite3Glo
14990 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d  balConfig.bFullM
149a0 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20  utex;.  }.  if( 
149b0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
149c0 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
149d0 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d   ){.    flags &=
149e0 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48   ~SQLITE_OPEN_SH
149f0 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c  AREDCACHE;.  }el
14a00 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  se if( sqlite3Gl
14a10 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65  obalConfig.share
14a20 64 43 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b  dCacheEnabled ){
14a30 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
14a40 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
14a50 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  CACHE;.  }..  /*
14a60 20 52 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20   Remove harmful 
14a70 62 69 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c  bits from the fl
14a80 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20  ags parameter.  
14a90 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49  **.  ** The SQLI
14aa0 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
14ab0 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  and SQLITE_OPEN_
14ac0 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20  FULLMUTEX flags 
14ad0 77 65 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20  were.  ** dealt 
14ae0 77 69 74 68 20 69 6e 20 74 68 65 20 70 72 65 76  with in the prev
14af0 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e  ious code block.
14b00 20 20 42 65 73 69 64 65 73 20 74 68 65 73 65 2c    Besides these,
14b10 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76   the only.  ** v
14b20 61 6c 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73  alid input flags
14b30 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65   for sqlite3_ope
14b40 6e 5f 76 32 28 29 20 61 72 65 20 53 51 4c 49 54  n_v2() are SQLIT
14b50 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c  E_OPEN_READONLY,
14b60 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45  .  ** SQLITE_OPE
14b70 4e 5f 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c  N_READWRITE, SQL
14b80 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
14b90 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
14ba0 52 45 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53  REDCACHE,.  ** S
14bb0 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41  QLITE_OPEN_PRIVA
14bc0 54 45 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d  TECACHE, and som
14bd0 65 20 72 65 73 65 72 76 65 64 20 62 69 74 73 2e  e reserved bits.
14be0 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a    Silently mask.
14bf0 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68    ** off all oth
14c00 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20  er flags..  */. 
14c10 20 66 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51   flags &=  ~( SQ
14c20 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45  LITE_OPEN_DELETE
14c30 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20  ONCLOSE |.      
14c40 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
14c50 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
14c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14c70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
14c80 5f 44 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20  _DB |.          
14c90 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
14ca0 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20  _TEMP_DB | .    
14cb0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
14cc0 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54  E_OPEN_TRANSIENT
14cd0 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20  _DB | .         
14ce0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
14cf0 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c  N_MAIN_JOURNAL |
14d00 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
14d10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
14d20 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  P_JOURNAL | .   
14d30 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
14d40 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e  TE_OPEN_SUBJOURN
14d50 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  AL | .          
14d60 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
14d70 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20  _MASTER_JOURNAL 
14d80 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
14d90 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d   SQLITE_OPEN_NOM
14da0 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20  UTEX |.         
14db0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
14dc0 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20  N_FULLMUTEX |.  
14dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
14de0 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20  ITE_OPEN_WAL.   
14df0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20            );..  
14e00 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20  /* Allocate the 
14e10 73 71 6c 69 74 65 20 64 61 74 61 20 73 74 72 75  sqlite data stru
14e20 63 74 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20  cture */.  db = 
14e30 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72  sqlite3MallocZer
14e40 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  o( sizeof(sqlite
14e50 33 29 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d  3) );.  if( db==
14e60 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f  0 ) goto opendb_
14e70 6f 75 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72  out;.  if( isThr
14e80 65 61 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64  eadsafe ){.    d
14e90 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74  b->mutex = sqlit
14ea0 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c  e3MutexAlloc(SQL
14eb0 49 54 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53  ITE_MUTEX_RECURS
14ec0 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62  IVE);.    if( db
14ed0 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  ->mutex==0 ){.  
14ee0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14ef0 28 64 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d  (db);.      db =
14f00 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f   0;.      goto o
14f10 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d  pendb_out;.    }
14f20 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
14f30 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
14f40 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72  utex);.  db->err
14f50 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64  Mask = 0xff;.  d
14f60 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62  b->nDb = 2;.  db
14f70 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
14f80 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64  _MAGIC_BUSY;.  d
14f90 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62  b->aDb = db->aDb
14fa0 53 74 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72  Static;..  asser
14fb0 74 28 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c  t( sizeof(db->aL
14fc0 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48  imit)==sizeof(aH
14fd0 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d  ardLimit) );.  m
14fe0 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74  emcpy(db->aLimit
14ff0 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69  , aHardLimit, si
15000 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29  zeof(db->aLimit)
15010 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  );.  db->aLimit[
15020 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
15030 4b 45 52 5f 54 48 52 45 41 44 53 5d 20 3d 20 53  KER_THREADS] = S
15040 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 4f  QLITE_DEFAULT_WO
15050 52 4b 45 52 5f 54 48 52 45 41 44 53 3b 0a 20 20  RKER_THREADS;.  
15060 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
15070 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75   1;.  db->nextAu
15080 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62  tovac = -1;.  db
15090 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74  ->szMmap = sqlit
150a0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
150b0 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78  zMmap;.  db->nex
150c0 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20  tPagesize = 0;. 
150d0 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65 72 4d   db->nMaxSorterM
150e0 6d 61 70 20 3d 20 30 78 37 46 46 46 46 46 46 46  map = 0x7FFFFFFF
150f0 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
15100 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
15110 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f 45  Names | SQLITE_E
15120 6e 61 62 6c 65 54 72 69 67 67 65 72 20 7c 20 53  nableTrigger | S
15130 51 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c  QLITE_CacheSpill
15140 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
15150 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54  LITE_DEFAULT_AUT
15160 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c  OMATIC_INDEX) ||
15170 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
15180 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a  AUTOMATIC_INDEX.
15190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
151a0 20 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e   | SQLITE_AutoIn
151b0 64 65 78 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  dex.#endif.#if S
151c0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49  QLITE_DEFAULT_FI
151d0 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20  LE_FORMAT<4.    
151e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
151f0 51 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65  QLITE_LegacyFile
15200 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  Fmt.#endif.#ifde
15210 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
15220 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20  LOAD_EXTENSION. 
15230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15240 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74  | SQLITE_LoadExt
15250 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69  ension.#endif.#i
15260 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
15270 5f 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47  _RECURSIVE_TRIGG
15280 45 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20  ERS.            
15290 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65       | SQLITE_Re
152a0 63 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66  cTriggers.#endif
152b0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
152c0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45  ITE_DEFAULT_FORE
152d0 49 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c  IGN_KEYS) && SQL
152e0 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45  ITE_DEFAULT_FORE
152f0 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20  IGN_KEYS.       
15300 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
15310 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23  TE_ForeignKeys.#
15320 65 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20  endif.      ;.  
15330 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28  sqlite3HashInit(
15340 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a  &db->aCollSeq);.
15350 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15360 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
15370 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
15380 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29  it(&db->aModule)
15390 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41  ;.#endif..  /* A
153a0 64 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  dd the default c
153b0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
153c0 65 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59  e BINARY. BINARY
153d0 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20   works for both 
153e0 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55  UTF-8.  ** and U
153f0 54 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20  TF-16, so add a 
15400 76 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68  version for each
15410 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e   to avoid any un
15420 6e 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63  necessary.  ** c
15430 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20  onversions. The 
15440 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20  only error that 
15450 63 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69  can occur here i
15460 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  s a malloc() fai
15470 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65  lure..  */.  cre
15480 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
15490 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
154a0 45 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f  E_UTF8, 0, binCo
154b0 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
154c0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
154d0 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
154e0 54 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62  TE_UTF16BE, 0, b
154f0 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
15500 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
15510 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20  n(db, "BINARY", 
15520 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20  SQLITE_UTF16LE, 
15530 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  0, binCollFunc, 
15540 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
15550 61 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d  ation(db, "RTRIM
15560 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
15570 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c  (void*)1, binCol
15580 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28  lFunc, 0);.  if(
15590 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
155a0 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70  d ){.    goto op
155b0 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20  endb_out;.  }.  
155c0 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20  db->pDfltColl = 
155d0 73 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53  sqlite3FindCollS
155e0 65 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54  eq(db, SQLITE_UT
155f0 46 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29  F8, "BINARY", 0)
15600 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
15610 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a  pDfltColl!=0 );.
15620 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61  .  /* Also add a
15630 20 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65   UTF-8 case-inse
15640 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f  nsitive collatio
15650 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20  n sequence. */. 
15660 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
15670 28 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53  (db, "NOCASE", S
15680 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e  QLITE_UTF8, 0, n
15690 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75  ocaseCollatingFu
156a0 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 61  nc, 0);..  /* Pa
156b0 72 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65  rse the filename
156c0 2f 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a  /URI argument. *
156d0 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67  /.  db->openFlag
156e0 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20  s = flags;.  rc 
156f0 3d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72  = sqlite3ParseUr
15700 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  i(zVfs, zFilenam
15710 65 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e  e, &flags, &db->
15720 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a  pVfs, &zOpen, &z
15730 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72  ErrMsg);.  if( r
15740 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
15750 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
15760 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d  TE_NOMEM ) db->m
15770 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b  allocFailed = 1;
15780 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
15790 72 57 69 74 68 4d 73 67 28 64 62 2c 20 72 63 2c  rWithMsg(db, rc,
157a0 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20   zErrMsg ? "%s" 
157b0 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  : 0, zErrMsg);. 
157c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
157d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f  zErrMsg);.    go
157e0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
157f0 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68   }..  /* Open th
15800 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61  e backend databa
15810 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72  se driver */.  r
15820 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  c = sqlite3Btree
15830 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a  Open(db->pVfs, z
15840 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61  Open, db, &db->a
15850 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20  Db[0].pBt, 0,.  
15860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15870 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51        flags | SQ
15880 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
15890 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  B);.  if( rc!=SQ
158a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
158b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
158c0 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ERR_NOMEM ){.   
158d0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
158e0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
158f0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
15900 20 72 63 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f   rc);.    goto o
15910 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20  pendb_out;.  }. 
15920 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53 63 68   db->aDb[0].pSch
15930 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68  ema = sqlite3Sch
15940 65 6d 61 47 65 74 28 64 62 2c 20 64 62 2d 3e 61  emaGet(db, db->a
15950 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20 64 62  Db[0].pBt);.  db
15960 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61  ->aDb[1].pSchema
15970 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61   = sqlite3Schema
15980 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 20 20 2f  Get(db, 0);..  /
15990 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 73 61  * The default sa
159a0 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74  fety_level for t
159b0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
159c0 20 69 73 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20   is 'full'; for 
159d0 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61  the temp.  ** da
159e0 74 61 62 61 73 65 20 69 74 20 69 73 20 27 4e 4f  tabase it is 'NO
159f0 4e 45 27 2e 20 54 68 69 73 20 6d 61 74 63 68 65  NE'. This matche
15a00 73 20 74 68 65 20 70 61 67 65 72 20 6c 61 79 65  s the pager laye
15a10 72 20 64 65 66 61 75 6c 74 73 2e 20 20 0a 20 20  r defaults.  .  
15a20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  */.  db->aDb[0].
15a30 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a  zName = "main";.
15a40 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66    db->aDb[0].saf
15a50 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20  ety_level = 3;. 
15a60 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d   db->aDb[1].zNam
15a70 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20 20 64 62  e = "temp";.  db
15a80 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f  ->aDb[1].safety_
15a90 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62  level = 1;..  db
15aa0 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
15ab0 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69  _MAGIC_OPEN;.  i
15ac0 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
15ad0 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  led ){.    goto 
15ae0 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a  opendb_out;.  }.
15af0 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 61  .  /* Register a
15b00 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63  ll built-in func
15b10 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f  tions, but do no
15b20 74 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 61  t attempt to rea
15b30 64 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  d the.  ** datab
15b40 61 73 65 20 73 63 68 65 6d 61 20 79 65 74 2e 20  ase schema yet. 
15b50 54 68 69 73 20 69 73 20 64 65 6c 61 79 65 64 20  This is delayed 
15b60 75 6e 74 69 6c 20 74 68 65 20 66 69 72 73 74 20  until the first 
15b70 74 69 6d 65 20 74 68 65 20 64 61 74 61 62 61 73  time the databas
15b80 65 0a 20 20 2a 2a 20 69 73 20 61 63 63 65 73 73  e.  ** is access
15b90 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ed..  */.  sqlit
15ba0 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
15bb0 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65  TE_OK);.  sqlite
15bc0 33 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e  3RegisterBuiltin
15bd0 46 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a  Functions(db);..
15be0 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61    /* Load automa
15bf0 74 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d  tic extensions -
15c00 20 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74   extensions that
15c10 20 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73   have been regis
15c20 74 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67  tered.  ** using
15c30 20 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74   the sqlite3_aut
15c40 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e  omatic_extension
15c50 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72  () API..  */.  r
15c60 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
15c70 6f 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72  ode(db);.  if( r
15c80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15c90 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c      sqlite3AutoL
15ca0 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62  oadExtensions(db
15cb0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
15cc0 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
15cd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15ce0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15cf0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
15d00 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64  .    }.  }..#ifd
15d10 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15d20 5f 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d  _FTS1.  if( !db-
15d30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
15d40 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
15d50 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28  sqlite3Fts1Init(
15d60 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72  sqlite3*);.    r
15d70 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49  c = sqlite3Fts1I
15d80 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
15d90 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
15da0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20  TE_ENABLE_FTS2. 
15db0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
15dc0 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
15dd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65  LITE_OK ){.    e
15de0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
15df0 33 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65  3Fts2Init(sqlite
15e00 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  3*);.    rc = sq
15e10 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62  lite3Fts2Init(db
15e20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
15e30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15e40 42 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21  BLE_FTS3.  if( !
15e50 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15e60 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
15e70 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
15e80 6c 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62  lite3Fts3Init(db
15e90 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23  );.  }.#endif..#
15ea0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15eb0 42 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64  BLE_ICU.  if( !d
15ec0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15ed0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
15ee0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
15ef0 69 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b  ite3IcuInit(db);
15f00 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
15f10 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15f20 45 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64  E_RTREE.  if( !d
15f30 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15f40 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
15f50 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15f60 74 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29  te3RtreeInit(db)
15f70 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
15f80 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41  /* -DSQLITE_DEFA
15f90 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
15fa0 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49  =1 makes EXCLUSI
15fb0 56 45 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c  VE the default l
15fc0 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65  ocking.  ** mode
15fd0 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41  .  -DSQLITE_DEFA
15fe0 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
15ff0 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74  =0 make NORMAL t
16000 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69  he default locki
16010 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44  ng.  ** mode.  D
16020 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20  oing nothing at 
16030 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e  all also makes N
16040 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c  ORMAL the defaul
16050 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  t..  */.#ifdef S
16060 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
16070 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d  CKING_MODE.  db-
16080 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20  >dfltLockMode = 
16090 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c  SQLITE_DEFAULT_L
160a0 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73  OCKING_MODE;.  s
160b0 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69  qlite3PagerLocki
160c0 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74  ngMode(sqlite3Bt
160d0 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62  reePager(db->aDb
160e0 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20  [0].pBt),.      
160f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16100 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55      SQLITE_DEFAU
16110 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29  LT_LOCKING_MODE)
16120 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
16130 72 63 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f  rc ) sqlite3Erro
16140 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a  r(db, rc);..  /*
16150 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b   Enable the look
16160 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62  aside-malloc sub
16170 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75  system */.  setu
16180 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30  pLookaside(db, 0
16190 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  , sqlite3GlobalC
161a0 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64  onfig.szLookasid
161b0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
161c0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
161d0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
161e0 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73  Lookaside);..  s
161f0 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
16200 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51  heckpoint(db, SQ
16210 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
16220 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29  _AUTOCHECKPOINT)
16230 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20  ;..opendb_out:. 
16240 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
16250 70 65 6e 29 3b 0a 20 20 69 66 28 20 64 62 20 29  pen);.  if( db )
16260 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
16270 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73  ->mutex!=0 || is
16280 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20 7c 7c  Threadsafe==0 ||
16290 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
162a0 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d  nfig.bFullMutex=
162b0 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
162c0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
162d0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20  ->mutex);.  }.  
162e0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
162f0 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73 73 65  code(db);.  asse
16300 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d  rt( db!=0 || rc=
16310 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
16320 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
16330 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73  E_NOMEM ){.    s
16340 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
16350 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20  ;.    db = 0;.  
16360 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
16370 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64  LITE_OK ){.    d
16380 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
16390 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20  E_MAGIC_SICK;.  
163a0 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a  }.  *ppDb = db;.
163b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
163c0 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66  ABLE_SQLLOG.  if
163d0 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
163e0 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b  onfig.xSqllog ){
163f0 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20  .    /* Opening 
16400 61 20 64 62 20 68 61 6e 64 6c 65 2e 20 46 6f 75  a db handle. Fou
16410 72 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73  rth parameter is
16420 20 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a 20 20   passed 0. */.  
16430 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d 20 73    void *pArg = s
16440 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16450 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b 0a 20  ig.pSqllogArg;. 
16460 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
16470 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 28 70  Config.xSqllog(p
16480 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65 6e 61  Arg, db, zFilena
16490 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64  me, 0);.  }.#end
164a0 69 66 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  if.  return sqli
164b0 74 65 33 41 70 69 45 78 69 74 28 30 2c 20 72 63  te3ApiExit(0, rc
164c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
164d0 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
164e0 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73  handle..*/.int s
164f0 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63  qlite3_open(.  c
16500 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
16510 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  name, .  sqlite3
16520 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20 72 65   **ppDb .){.  re
16530 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73  turn openDatabas
16540 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44  e(zFilename, ppD
16550 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
16560 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
16570 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
16580 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
16590 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73  ATE, 0);.}.int s
165a0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a  qlite3_open_v2(.
165b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 69    const char *fi
165c0 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74  lename,   /* Dat
165d0 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 28  abase filename (
165e0 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69  UTF-8) */.  sqli
165f0 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20 20 20  te3 **ppDb,     
16600 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69      /* OUT: SQLi
16610 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a  te db handle */.
16620 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20    int flags,    
16630 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
16640 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  gs */.  const ch
16650 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20 20 20  ar *zVfs        
16660 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d  /* Name of VFS m
16670 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a  odule to use */.
16680 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e  ){.  return open
16690 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e 61 6d  Database(filenam
166a0 65 2c 20 70 70 44 62 2c 20 28 75 6e 73 69 67 6e  e, ppDb, (unsign
166b0 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56  ed int)flags, zV
166c0 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  fs);.}..#ifndef 
166d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
166e0 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  6./*.** Open a n
166f0 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  ew database hand
16700 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
16710 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e  e3_open16(.  con
16720 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61  st void *zFilena
16730 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a  me, .  sqlite3 *
16740 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61 72 20  *ppDb.){.  char 
16750 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65  const *zFilename
16760 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d  8;   /* zFilenam
16770 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55 54 46  e encoded in UTF
16780 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20 55 54  -8 instead of UT
16790 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65  F-16 */.  sqlite
167a0 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20  3_value *pVal;. 
167b0 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64 65 66   int rc;..#ifdef
167c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
167d0 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20 70  PI_ARMOR.  if( p
167e0 70 44 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  pDb==0 ) return 
167f0 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
16800 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 2a 70 70  PT;.#endif.  *pp
16810 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  Db = 0;.#ifndef 
16820 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
16830 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69  INIT.  rc = sqli
16840 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
16850 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
16860 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20  urn rc;.#endif. 
16870 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d   if( zFilename==
16880 30 20 29 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  0 ) zFilename = 
16890 22 5c 30 30 30 5c 30 30 30 22 3b 0a 20 20 70 56  "\000\000";.  pV
168a0 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75  al = sqlite3Valu
168b0 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74  eNew(0);.  sqlit
168c0 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70 56  e3ValueSetStr(pV
168d0 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d  al, -1, zFilenam
168e0 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  e, SQLITE_UTF16N
168f0 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54  ATIVE, SQLITE_ST
16900 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61  ATIC);.  zFilena
16910 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  me8 = sqlite3Val
16920 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c  ueText(pVal, SQL
16930 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28  ITE_UTF8);.  if(
16940 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20   zFilename8 ){. 
16950 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61     rc = openData
16960 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c  base(zFilename8,
16970 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20   ppDb,.         
16980 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
16990 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
169a0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
169b0 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20  _CREATE, 0);.   
169c0 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c   assert( *ppDb |
169d0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  | rc==SQLITE_NOM
169e0 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63  EM );.    if( rc
169f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21  ==SQLITE_OK && !
16a00 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70  DbHasProperty(*p
16a10 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d  pDb, 0, DB_Schem
16a20 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20  aLoaded) ){.    
16a30 20 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53    ENC(*ppDb) = S
16a40 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
16a50 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  E;.    }.  }else
16a60 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
16a70 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73  E_NOMEM;.  }.  s
16a80 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65 28  qlite3ValueFree(
16a90 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e  pVal);..  return
16aa0 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
16ab0 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66  0, rc);.}.#endif
16ac0 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
16ad0 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
16ae0 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63  Register a new c
16af0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
16b00 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  e with the datab
16b10 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a  ase handle db..*
16b20 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72  /.int sqlite3_cr
16b30 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a  eate_collation(.
16b40 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
16b50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
16b60 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
16b70 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
16b80 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
16b90 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
16ba0 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
16bb0 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65 74   void*).){.  ret
16bc0 75 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61  urn sqlite3_crea
16bd0 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28  te_collation_v2(
16be0 64 62 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20  db, zName, enc, 
16bf0 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20  pCtx, xCompare, 
16c00 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  0);.}../*.** Reg
16c10 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
16c20 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
16c30 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
16c40 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
16c50 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
16c60 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a  e_collation_v2(.
16c70 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
16c80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
16c90 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
16ca0 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
16cb0 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
16cc0 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
16cd0 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
16ce0 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28   void*),.  void(
16cf0 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b  *xDel)(void*).){
16d00 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 23 69 66 64  .  int rc;..#ifd
16d10 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
16d20 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28  _API_ARMOR.  if(
16d30 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
16d40 68 65 63 6b 4f 6b 28 64 62 29 20 7c 7c 20 7a 4e  heckOk(db) || zN
16d50 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ame==0 ) return 
16d60 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
16d70 50 54 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c  PT;.#endif.  sql
16d80 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
16d90 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
16da0 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
16db0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63  ocFailed );.  rc
16dc0 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69   = createCollati
16dd0 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75  on(db, zName, (u
16de0 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  8)enc, pCtx, xCo
16df0 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20  mpare, xDel);.  
16e00 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
16e10 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
16e20 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
16e30 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
16e40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
16e50 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16e60 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
16e70 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
16e80 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
16e90 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
16ea0 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
16eb0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
16ec0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28  ate_collation16(
16ed0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
16ee0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
16ef0 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  Name,.  int enc,
16f00 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
16f10 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
16f20 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
16f30 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
16f40 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
16f50 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16f60 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b  .  char *zName8;
16f70 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
16f80 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52  ENABLE_API_ARMOR
16f90 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53  .  if( !sqlite3S
16fa0 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29  afetyCheckOk(db)
16fb0 20 7c 7c 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72   || zName==0 ) r
16fc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
16fd0 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66  USE_BKPT;.#endif
16fe0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16ff0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
17000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
17010 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
17020 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c  ;.  zName8 = sql
17030 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
17040 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
17050 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
17060 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b  .  if( zName8 ){
17070 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65  .    rc = create
17080 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
17090 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70  ame8, (u8)enc, p
170a0 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30  Ctx, xCompare, 0
170b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
170c0 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29  Free(db, zName8)
170d0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
170e0 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
170f0 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
17100 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
17110 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
17120 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
17130 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
17140 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  6 */../*.** Regi
17150 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  ster a collation
17160 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
17170 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  y callback with 
17180 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
17190 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61  dle.** db. Repla
171a0 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c  ce any previousl
171b0 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c  y installed coll
171c0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
171d0 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73  actory..*/.int s
171e0 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
171f0 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74  _needed(.  sqlit
17200 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20  e3 *db, .  void 
17210 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c  *pCollNeededArg,
17220 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e   .  void(*xCollN
17230 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c  eeded)(void*,sql
17240 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52  ite3*,int eTextR
17250 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a  ep,const char*).
17260 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
17270 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f  _ENABLE_API_ARMO
17280 52 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  R.  if( !sqlite3
17290 53 61 66 65 74 79 43 68 65 63 6b 4f 6b 28 64 62  SafetyCheckOk(db
172a0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
172b0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23  E_MISUSE_BKPT;.#
172c0 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f  endif.  sqlite3_
172d0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
172e0 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43  mutex);.  db->xC
172f0 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c  ollNeeded = xCol
17300 6c 4e 65 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78  lNeeded;.  db->x
17310 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 30  CollNeeded16 = 0
17320 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65  ;.  db->pCollNee
17330 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65  dedArg = pCollNe
17340 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c 69 74  ededArg;.  sqlit
17350 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
17360 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
17370 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
17380 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
17390 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a  _OMIT_UTF16./*.*
173a0 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f 6c  * Register a col
173b0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
173c0 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b  factory callback
173d0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
173e0 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e  se handle.** db.
173f0 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72 65   Replace any pre
17400 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65  viously installe
17410 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  d collation sequ
17420 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f  ence factory..*/
17430 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c  .int sqlite3_col
17440 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28  lation_needed16(
17450 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
17460 0a 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65  .  void *pCollNe
17470 65 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64  ededArg, .  void
17480 28 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29  (*xCollNeeded16)
17490 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c  (void*,sqlite3*,
174a0 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63 6f 6e  int eTextRep,con
174b0 73 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 23 69 66  st void*).){.#if
174c0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
174d0 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66  E_API_ARMOR.  if
174e0 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
174f0 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 20 72 65  CheckOk(db) ) re
17500 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
17510 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64 69 66 0a  SE_BKPT;.#endif.
17520 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
17530 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
17540 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
17550 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 78  ded = 0;.  db->x
17560 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20 78  CollNeeded16 = x
17570 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20 20  CollNeeded16;.  
17580 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41  db->pCollNeededA
17590 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64  rg = pCollNeeded
175a0 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
175b0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
175c0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
175d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
175e0 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
175f0 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69 66  IT_UTF16 */..#if
17600 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
17610 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a 2a  _DEPRECATED./*.*
17620 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
17630 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68 72  is now an anachr
17640 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20 74  onism. It used t
17650 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65 63  o be used to rec
17660 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20 6d  over from a.** m
17670 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2c  alloc() failure,
17680 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77 20   but SQLite now 
17690 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d 61  does this automa
176a0 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  tically..*/.int 
176b0 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f 72  sqlite3_global_r
176c0 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20 20  ecover(void){.  
176d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
176e0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
176f0 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77 68  * Test to see wh
17700 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
17710 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
17720 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f 63  tion is in autoc
17730 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20 20  ommit.** mode.  
17740 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  Return TRUE if i
17750 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20 69  t is and FALSE i
17760 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d 6d  f not.  Autocomm
17770 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a 2a  it mode is on.**
17780 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41 75   by default.  Au
17790 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73 61  tocommit is disa
177a0 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e 20  bled by a BEGIN 
177b0 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72 65  statement and re
177c0 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74 68  enabled.** by th
177d0 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f 72  e next COMMIT or
177e0 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69 6e   ROLLBACK..*/.in
177f0 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61 75  t sqlite3_get_au
17800 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65 33  tocommit(sqlite3
17810 20 2a 64 62 29 7b 0a 23 69 66 64 65 66 20 53 51   *db){.#ifdef SQ
17820 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f  LITE_ENABLE_API_
17830 41 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c  ARMOR.  if( !sql
17840 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f  ite3SafetyCheckO
17850 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 28 76 6f  k(db) ){.    (vo
17860 69 64 29 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  id)SQLITE_MISUSE
17870 5f 42 4b 50 54 3b 0a 20 20 20 20 72 65 74 75 72  _BKPT;.    retur
17880 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  n 0;.  }.#endif.
17890 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74    return db->aut
178a0 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  oCommit;.}../*.*
178b0 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
178c0 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62  routines are sub
178d0 73 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e  stitutes for con
178e0 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f  stants SQLITE_CO
178f0 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45  RRUPT,.** SQLITE
17900 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f  _MISUSE, SQLITE_
17910 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45  CANTOPEN, SQLITE
17920 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69  _IOERR and possi
17930 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a  bly other error.
17940 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54  ** constants.  T
17950 68 65 79 20 73 65 72 76 65 20 74 77 6f 20 70 75  hey serve two pu
17960 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  rposes:.**.**   
17970 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63  1.  Serve as a c
17980 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20  onvenient place 
17990 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f  to set a breakpo
179a0 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65  int in a debugge
179b0 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65  r.**       to de
179c0 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f  tect when versio
179d0 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f  n error conditio
179e0 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  ns occurs..**.**
179f0 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71     2.  Invoke sq
17a00 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70  lite3_log() to p
17a10 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63  rovide the sourc
17a20 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20  e code location 
17a30 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61  where.**       a
17a40 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72   low-level error
17a50 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74   is first detect
17a60 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
17a70 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69  e3CorruptError(i
17a80 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
17a90 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
17aa0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
17ab0 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
17ac0 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52  _log(SQLITE_CORR
17ad0 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20  UPT,.           
17ae0 20 20 20 22 64 61 74 61 62 61 73 65 20 63 6f 72     "database cor
17af0 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20  ruption at line 
17b00 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a  %d of [%.10s]",.
17b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69                li
17b20 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33  neno, 20+sqlite3
17b30 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20  _sourceid());.  
17b40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
17b50 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c  RRUPT;.}.int sql
17b60 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28  ite3MisuseError(
17b70 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
17b80 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
17b90 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
17ba0 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  g!=0 );.  sqlite
17bb0 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53  3_log(SQLITE_MIS
17bc0 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20  USE, .          
17bd0 20 20 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c      "misuse at l
17be0 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
17bf0 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
17c00 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
17c10 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
17c20 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
17c30 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20  E_MISUSE;.}.int 
17c40 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45  sqlite3CantopenE
17c50 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29  rror(int lineno)
17c60 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71  {.  testcase( sq
17c70 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
17c80 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73  g.xLog!=0 );.  s
17c90 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
17ca0 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20  E_CANTOPEN, .   
17cb0 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e             "cann
17cc0 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20  ot open file at 
17cd0 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
17ce0 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
17cf0 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
17d00 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
17d10 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
17d20 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a  TE_CANTOPEN;.}..
17d30 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
17d40 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a  OMIT_DEPRECATED.
17d50 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
17d60 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74  convenience rout
17d70 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73  ine that makes s
17d80 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72  ure that all thr
17d90 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20  ead-specific.** 
17da0 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68  data for this th
17db0 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65  read has been de
17dc0 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  allocated..**.**
17dd0 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65   SQLite no longe
17de0 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70  r uses thread-sp
17df0 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74  ecific data so t
17e00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  his routine is n
17e10 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20  ow a.** no-op.  
17e20 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66  It is retained f
17e30 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f  or historical co
17e40 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a  mpatibility..*/.
17e50 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72  void sqlite3_thr
17e60 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64  ead_cleanup(void
17e70 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  ){.}.#endif../*.
17e80 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69  ** Return meta i
17e90 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
17ea0 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75   a specific colu
17eb0 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  mn of a database
17ec0 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63   table..** See c
17ed0 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65  omment in sqlite
17ee0 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e  3.h (sqlite.h.in
17ef0 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a  ) for details..*
17f00 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
17f10 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45  ENABLE_COLUMN_ME
17f20 54 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74  TADATA.int sqlit
17f30 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
17f40 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69  metadata(.  sqli
17f50 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
17f60 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
17f70 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a  ction handle */.
17f80 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
17f90 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a  bName,        /*
17fa0 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f   Database name o
17fb0 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73  r NULL */.  cons
17fc0 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61  t char *zTableNa
17fd0 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65  me,     /* Table
17fe0 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   name */.  const
17ff0 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61   char *zColumnNa
18000 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  me,    /* Column
18010 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20   name */.  char 
18020 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79  const **pzDataTy
18030 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  pe,    /* OUTPUT
18040 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20  : Declared data 
18050 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  type */.  char c
18060 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71  onst **pzCollSeq
18070 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  ,     /* OUTPUT:
18080 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   Collation seque
18090 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nce name */.  in
180a0 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20  t *pNotNull,    
180b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
180c0 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54  PUT: True if NOT
180d0 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74   NULL constraint
180e0 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74   exists */.  int
180f0 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20   *pPrimaryKey,  
18100 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
18110 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75  UT: True if colu
18120 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f  mn part of PK */
18130 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63  .  int *pAutoinc
18140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
18150 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69  * OUTPUT: True i
18160 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f  f column is auto
18170 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b  -increment */.){
18180 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
18190 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a  r *zErrMsg = 0;.
181a0 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
181b0 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  0;.  Column *pCo
181c0 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f  l = 0;.  int iCo
181d0 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74  l;..  char const
181e0 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b   *zDataType = 0;
181f0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
18200 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69  CollSeq = 0;.  i
18210 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a  nt notnull = 0;.
18220 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79    int primarykey
18230 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f   = 0;.  int auto
18240 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45  inc = 0;..  /* E
18250 6e 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61  nsure the databa
18260 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65  se schema has be
18270 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73  en loaded */.  s
18280 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
18290 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
182a0 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
182b0 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20  erAll(db);.  rc 
182c0 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62  = sqlite3Init(db
182d0 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69  , &zErrMsg);.  i
182e0 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63  f( SQLITE_OK!=rc
182f0 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   ){.    goto err
18300 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
18310 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62  * Locate the tab
18320 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a  le in question *
18330 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74  /.  pTab = sqlit
18340 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20  e3FindTable(db, 
18350 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e  zTableName, zDbN
18360 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61  ame);.  if( !pTa
18370 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65  b || pTab->pSele
18380 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d  ct ){.    pTab =
18390 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72   0;.    goto err
183a0 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  or_out;.  }..  /
183b0 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d  * Find the colum
183c0 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f  n for which info
183d0 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f   is requested */
183e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73  .  if( sqlite3Is
183f0 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d  Rowid(zColumnNam
18400 65 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d  e) ){.    iCol =
18410 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20   pTab->iPKey;.  
18420 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b    if( iCol>=0 ){
18430 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70  .      pCol = &p
18440 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b  Tab->aCol[iCol];
18450 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
18460 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20      for(iCol=0; 
18470 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b  iCol<pTab->nCol;
18480 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   iCol++){.      
18490 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43  pCol = &pTab->aC
184a0 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20  ol[iCol];.      
184b0 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74  if( 0==sqlite3St
184c0 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
184d0 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  e, zColumnName) 
184e0 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
184f0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
18500 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54      if( iCol==pT
18510 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ab->nCol ){.    
18520 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
18530 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74    goto error_out
18540 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
18550 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
18560 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65  block stores the
18570 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f   meta informatio
18580 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72  n that will be r
18590 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20  eturned.  ** to 
185a0 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f  the caller in lo
185b0 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44  cal variables zD
185c0 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65  ataType, zCollSe
185d0 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d  q, notnull, prim
185e0 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20  arykey.  ** and 
185f0 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73  autoinc. At this
18600 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65   point there are
18610 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69   two possibiliti
18620 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20  es:.  ** .  **  
18630 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66     1. The specif
18640 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ied column name 
18650 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64  was rowid", "oid
18660 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a  " or "_rowid_" .
18670 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20    **        and 
18680 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c  there is no expl
18690 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20  icitly declared 
186a0 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a  IPK column. .  *
186b0 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68  *.  **     2. Th
186c0 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61  e table is not a
186d0 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f   view and the co
186e0 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69  lumn name identi
186f0 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20  fied an .  **   
18700 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20       explicitly 
18710 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e  declared column.
18720 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72   Copy meta infor
18730 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f  mation from *pCo
18740 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70  l..  */ .  if( p
18750 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61  Col ){.    zData
18760 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79  Type = pCol->zTy
18770 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71  pe;.    zCollSeq
18780 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a   = pCol->zColl;.
18790 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43      notnull = pC
187a0 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a  ol->notNull!=0;.
187b0 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20      primarykey  
187c0 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67  = (pCol->colFlag
187d0 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d  s & COLFLAG_PRIM
187e0 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74  KEY)!=0;.    aut
187f0 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b  oinc = pTab->iPK
18800 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61  ey==iCol && (pTa
18810 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46  b->tabFlags & TF
18820 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21  _Autoincrement)!
18830 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  =0;.  }else{.   
18840 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e   zDataType = "IN
18850 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d  TEGER";.    prim
18860 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a  arykey = 1;.  }.
18870 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20    if( !zCollSeq 
18880 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  ){.    zCollSeq 
18890 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a  = "BINARY";.  }.
188a0 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71  .error_out:.  sq
188b0 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41  lite3BtreeLeaveA
188c0 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68  ll(db);..  /* Wh
188d0 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69  ether the functi
188e0 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65  on call succeede
188f0 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74  d or failed, set
18900 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61   the output para
18910 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77  meters.  ** to w
18920 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f  hatever their lo
18930 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73  cal counterparts
18940 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20   contain. If an 
18950 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c  error did occur,
18960 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74  .  ** this has t
18970 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72  he effect of zer
18980 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20  oing all output 
18990 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f  parameters..  */
189a0 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70  .  if( pzDataTyp
189b0 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20  e ) *pzDataType 
189c0 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69  = zDataType;.  i
189d0 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a  f( pzCollSeq ) *
189e0 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c  pzCollSeq = zCol
189f0 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74  lSeq;.  if( pNot
18a00 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c  Null ) *pNotNull
18a10 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66   = notnull;.  if
18a20 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20  ( pPrimaryKey ) 
18a30 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70  *pPrimaryKey = p
18a40 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28  rimarykey;.  if(
18a50 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75   pAutoinc ) *pAu
18a60 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b  toinc = autoinc;
18a70 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f  ..  if( SQLITE_O
18a80 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29  K==rc && !pTab )
18a90 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46  {.    sqlite3DbF
18aa0 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29  ree(db, zErrMsg)
18ab0 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20  ;.    zErrMsg = 
18ac0 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64  sqlite3MPrintf(d
18ad0 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c  b, "no such tabl
18ae0 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22  e column: %s.%s"
18af0 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20  , zTableName,.  
18b00 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d        zColumnNam
18b10 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  e);.    rc = SQL
18b20 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20  ITE_ERROR;.  }. 
18b30 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
18b40 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 28 7a 45  hMsg(db, rc, (zE
18b50 72 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a  rrMsg?"%s":0), z
18b60 45 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74  ErrMsg);.  sqlit
18b70 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72  e3DbFree(db, zEr
18b80 72 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71  rMsg);.  rc = sq
18b90 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c  lite3ApiExit(db,
18ba0 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f   rc);.  sqlite3_
18bb0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
18bc0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
18bd0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
18be0 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61  *.** Sleep for a
18bf0 20 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20   little while.  
18c00 52 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e  Return the amoun
18c10 74 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e  t of time slept.
18c20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
18c30 73 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20  sleep(int ms){. 
18c40 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
18c50 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
18c60 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
18c70 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
18c80 28 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75  ( pVfs==0 ) retu
18c90 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  rn 0;..  /* This
18ca0 20 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20   function works 
18cb0 69 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c  in milliseconds,
18cc0 20 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79   but the underly
18cd0 69 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20  ing OsSleep() . 
18ce0 20 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63   ** API uses mic
18cf0 72 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65  roseconds. Hence
18d00 20 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a   the 1000's..  *
18d10 2f 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65  /.  rc = (sqlite
18d20 33 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31  3OsSleep(pVfs, 1
18d30 30 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20  000*ms)/1000);. 
18d40 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
18d50 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64  *.** Enable or d
18d60 69 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e  isable the exten
18d70 64 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73  ded result codes
18d80 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
18d90 5f 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74  _extended_result
18da0 5f 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a  _codes(sqlite3 *
18db0 64 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a  db, int onoff){.
18dc0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
18dd0 41 42 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20  ABLE_API_ARMOR. 
18de0 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
18df0 65 74 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29  etyCheckOk(db) )
18e00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
18e10 49 53 55 53 45 5f 42 4b 50 54 3b 0a 23 65 6e 64  ISUSE_BKPT;.#end
18e20 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  if.  sqlite3_mut
18e30 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
18e40 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
18e50 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30 78 66  sk = onoff ? 0xf
18e60 66 66 66 66 66 66 66 20 3a 20 30 78 66 66 3b 0a  fffffff : 0xff;.
18e70 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
18e80 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
18e90 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
18ea0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  E_OK;.}../*.** I
18eb0 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c 65 43  nvoke the xFileC
18ec0 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e  ontrol method on
18ed0 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 64 61   a particular da
18ee0 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73  tabase..*/.int s
18ef0 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
18f00 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  rol(sqlite3 *db,
18f10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
18f20 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f  Name, int op, vo
18f30 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74  id *pArg){.  int
18f40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
18f50 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  OR;.  Btree *pBt
18f60 72 65 65 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  ree;..#ifdef SQL
18f70 49 54 45 5f 45 4e 41 42 4c 45 5f 41 50 49 5f 41  ITE_ENABLE_API_A
18f80 52 4d 4f 52 0a 20 20 69 66 28 20 21 73 71 6c 69  RMOR.  if( !sqli
18f90 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 4f 6b  te3SafetyCheckOk
18fa0 28 64 62 29 20 29 20 72 65 74 75 72 6e 20 53 51  (db) ) return SQ
18fb0 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
18fc0 3b 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74  ;.#endif.  sqlit
18fd0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
18fe0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74  b->mutex);.  pBt
18ff0 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  ree = sqlite3DbN
19000 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
19010 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  DbName);.  if( p
19020 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67  Btree ){.    Pag
19030 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
19040 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
19050 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
19060 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
19070 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71  .    pPager = sq
19080 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
19090 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73  pBtree);.    ass
190a0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
190b0 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74  ;.    fd = sqlit
190c0 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
190d0 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
190e0 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   fd!=0 );.    if
190f0 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e  ( op==SQLITE_FCN
19100 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  TL_FILE_POINTER 
19110 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74  ){.      *(sqlit
19120 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d  e3_file**)pArg =
19130 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   fd;.      rc = 
19140 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
19150 65 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65  else if( fd->pMe
19160 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72  thods ){.      r
19170 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
19180 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c  eControl(fd, op,
19190 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73   pArg);.    }els
191a0 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
191b0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
191c0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
191d0 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
191e0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
191f0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
19200 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
19210 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a  rn rc;   .}../*.
19220 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
19230 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69  the testing logi
19240 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  c..*/.int sqlite
19250 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
19260 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69  nt op, ...){.  i
19270 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64  nt rc = 0;.#ifnd
19280 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
19290 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61  UILTIN_TEST.  va
192a0 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
192b0 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
192c0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
192d0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76     /*.    ** Sav
192e0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  e the current st
192f0 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e  ate of the PRNG.
19300 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
19310 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
19320 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20  _PRNG_SAVE: {.  
19330 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53      sqlite3PrngS
19340 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20  aveState();.    
19350 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
19360 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
19370 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65 20  store the state 
19380 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74  of the PRNG to t
19390 68 65 20 6c 61 73 74 20 73 74 61 74 65 20 73 61  he last state sa
193a0 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a  ved using.    **
193b0 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20   PRNG_SAVE.  If 
193c0 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65  PRNG_SAVE has ne
193d0 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20  ver before been 
193e0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  called, then.   
193f0 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61 63   ** this verb ac
19400 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53  ts like PRNG_RES
19410 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ET..    */.    c
19420 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
19430 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45  TRL_PRNG_RESTORE
19440 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
19450 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74  3PrngRestoreStat
19460 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
19470 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
19480 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65      ** Reset the
19490 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74   PRNG back to it
194a0 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  s uninitialized 
194b0 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74  state.  The next
194c0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
194d0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
194e0 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64  ss() will reseed
194f0 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20   the PRNG using 
19500 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20  a single call.  
19510 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e    ** to the xRan
19520 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f  domness method o
19530 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  f the default VF
19540 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  S..    */.    ca
19550 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
19560 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b  RL_PRNG_RESET: {
19570 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
19580 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a  andomness(0,0);.
19590 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
195a0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
195b0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
195c0 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54  control(BITVEC_T
195d0 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72  EST, size, progr
195e0 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  am).    **.    *
195f0 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61 67 61  * Run a test aga
19600 69 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f 62  inst a Bitvec ob
19610 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54  ject of size.  T
19620 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d  he program argum
19630 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e  ent.    ** is an
19640 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65   array of intege
19650 72 73 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  rs that defines 
19660 74 68 65 20 74 65 73 74 2e 20 20 52 65 74 75 72  the test.  Retur
19670 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a  n -1 on a.    **
19680 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
19690 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73  on error, 0 on s
196a0 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a  uccess, or non-z
196b0 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72  ero for an error
196c0 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65  ..    ** See the
196d0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
196e0 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20  iltinTest() for 
196f0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
19700 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
19710 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
19720 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54  ESTCTRL_BITVEC_T
19730 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  EST: {.      int
19740 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   sz = va_arg(ap,
19750 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74   int);.      int
19760 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67   *aProg = va_arg
19770 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20  (ap, int*);.    
19780 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
19790 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
197a0 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20  sz, aProg);.    
197b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
197c0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
197d0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
197e0 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54 41 4c  rol(FAULT_INSTAL
197f0 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a 20 20  L, xCallback).  
19800 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72 72 61    **.    ** Arra
19810 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20 78 43  nge to invoke xC
19820 61 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e 65 76  allback() whenev
19830 65 72 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53  er sqlite3FaultS
19840 69 6d 28 29 20 69 73 20 63 61 6c 6c 65 64 2c 0a  im() is called,.
19850 20 20 20 20 2a 2a 20 69 66 20 78 43 61 6c 6c 62      ** if xCallb
19860 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e  ack is not NULL.
19870 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
19880 73 20 61 20 74 65 73 74 20 6f 66 20 74 68 65 20  s a test of the 
19890 66 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f 72 20  fault simulator 
198a0 6d 65 63 68 61 6e 69 73 6d 20 69 74 73 65 6c 66  mechanism itself
198b0 2c 20 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69  , sqlite3FaultSi
198c0 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69 73 20 63  m(0).    ** is c
198d0 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74 65 6c  alled immediatel
198e0 79 20 61 66 74 65 72 20 69 6e 73 74 61 6c 6c 69  y after installi
198f0 6e 67 20 74 68 65 20 6e 65 77 20 63 61 6c 6c 62  ng the new callb
19900 61 63 6b 20 61 6e 64 20 74 68 65 20 72 65 74 75  ack and the retu
19910 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  rn.    ** value 
19920 66 72 6f 6d 20 73 71 6c 69 74 65 33 46 61 75 6c  from sqlite3Faul
19930 74 53 69 6d 28 30 29 20 62 65 63 6f 6d 65 73 20  tSim(0) becomes 
19940 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f 6d 0a  the return from.
19950 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 74      ** sqlite3_t
19960 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e 0a 20  est_control().. 
19970 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19980 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 46  QLITE_TESTCTRL_F
19990 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20 7b 0a  AULT_INSTALL: {.
199a0 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20 69 73        /* MSVC is
199b0 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70 75 6c   picky about pul
199c0 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73 20 66  ling func ptrs f
199d0 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a 20 20  rom va lists..  
199e0 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f 73 75      ** http://su
199f0 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66 74 2e  pport.microsoft.
19a00 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20 20 20  com/kb/47961.   
19a10 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47 6c 6f     ** sqlite3Glo
19a20 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73 74 43  balConfig.xTestC
19a30 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61 72 67  allback = va_arg
19a40 28 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e 74 29  (ap, int(*)(int)
19a50 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  );.      */.    
19a60 20 20 74 79 70 65 64 65 66 20 69 6e 74 28 2a 54    typedef int(*T
19a70 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f  ESTCALLBACKFUNC_
19a80 74 29 28 69 6e 74 29 3b 0a 20 20 20 20 20 20 73  t)(int);.      s
19a90 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
19aa0 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b  ig.xTestCallback
19ab0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 54 45   = va_arg(ap, TE
19ac0 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43 5f 74  STCALLBACKFUNC_t
19ad0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
19ae0 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29  lite3FaultSim(0)
19af0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
19b00 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
19b10 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
19b20 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e  t_control(BENIGN
19b30 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78  _MALLOC_HOOKS, x
19b40 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20  Begin, xEnd).   
19b50 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73   **.    ** Regis
19b60 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c  ter hooks to cal
19b70 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68  l to indicate wh
19b80 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  ich malloc() fai
19b90 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72  lures .    ** ar
19ba0 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f  e benign..    */
19bb0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19bc0 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e  _TESTCTRL_BENIGN
19bd0 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b  _MALLOC_HOOKS: {
19be0 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
19bf0 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74  oid (*void_funct
19c00 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20  ion)(void);.    
19c10 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
19c20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20  xBenignBegin;.  
19c30 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f      void_functio
19c40 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20  n xBenignEnd;.  
19c50 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e      xBenignBegin
19c60 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
19c70 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20  id_function);.  
19c80 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d      xBenignEnd =
19c90 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
19ca0 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
19cb0 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d    sqlite3BenignM
19cc0 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69  allocHooks(xBeni
19cd0 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e  gnBegin, xBenign
19ce0 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61  End);.      brea
19cf0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
19d00 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
19d10 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
19d20 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
19d30 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69  NDING_BYTE, unsi
19d40 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20  gned int X).    
19d50 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
19d60 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74  e PENDING byte t
19d70 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  o the value in t
19d80 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20  he argument, if 
19d90 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65  X>0..    ** Make
19da0 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58   no changes if X
19db0 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ==0.  Return the
19dc0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65   value of the pe
19dd0 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a  nding byte.    *
19de0 2a 20 61 73 20 69 74 20 65 78 69 73 74 69 6e 67  * as it existing
19df0 20 62 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75   before this rou
19e00 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e  tine was called.
19e10 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
19e20 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67  MPORTANT:  Chang
19e30 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20  ing the PENDING 
19e40 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30  byte from 0x4000
19e50 30 30 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a  0000 results in.
19e60 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70      ** an incomp
19e70 61 74 69 62 6c 65 20 64 61 74 61 62 61 73 65 20  atible database 
19e80 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68  file format.  Ch
19e90 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49  anging the PENDI
19ea0 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77  NG byte.    ** w
19eb0 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73  hile any databas
19ec0 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
19ed0 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20  open results in 
19ee0 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20  undefined and.  
19ef0 20 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f 75 73    ** deleterious
19f00 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a   behavior..    *
19f10 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
19f20 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49  E_TESTCTRL_PENDI
19f30 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20  NG_BYTE: {.     
19f40 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59   rc = PENDING_BY
19f50 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  TE;.#ifndef SQLI
19f60 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20  TE_OMIT_WSD.    
19f70 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69    {.        unsi
19f80 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20  gned int newVal 
19f90 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73  = va_arg(ap, uns
19fa0 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20  igned int);.    
19fb0 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29      if( newVal )
19fc0 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42   sqlite3PendingB
19fd0 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20  yte = newVal;.  
19fe0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
19ff0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a000 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
1a010 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1a020 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1a030 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74  CTRL_ASSERT, int
1a040 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a   X).    **.    *
1a050 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72  * This action pr
1a060 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d  ovides a run-tim
1a070 65 20 74 65 73 74 20 74 6f 20 73 65 65 20 77 68  e test to see wh
1a080 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20  ether or not.   
1a090 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77 61 73   ** assert() was
1a0a0 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70   enabled at comp
1a0b0 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20  ile-time.  If X 
1a0c0 69 73 20 74 72 75 65 20 61 6e 64 20 61 73 73 65  is true and asse
1a0d0 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65  rt().    ** is e
1a0e0 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  nabled, then the
1a0f0 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1a100 20 74 72 75 65 2e 20 20 49 66 20 58 20 69 73 20   true.  If X is 
1a110 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20  true and.    ** 
1a120 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61  assert() is disa
1a130 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
1a140 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
1a150 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20  ero.  If X is.  
1a160 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61    ** false and a
1a170 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c  ssert() is enabl
1a180 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73  ed, then the ass
1a190 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64  ertion fires and
1a1a0 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63   the.    ** proc
1a1b0 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20  ess aborts.  If 
1a1c0 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61  X is false and a
1a1d0 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
1a1e0 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20  led, then the.  
1a1f0 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75    ** return valu
1a200 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a  e is zero..    *
1a210 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1a220 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
1a230 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74  T: {.      volat
1a240 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20  ile int x = 0;. 
1a250 20 20 20 20 20 61 73 73 65 72 74 28 20 28 78 20       assert( (x 
1a260 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
1a270 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  )!=0 );.      rc
1a280 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61   = x;.      brea
1a290 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  k;.    }...    /
1a2a0 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
1a2b0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
1a2c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
1a2d0 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20  LWAYS, int X).  
1a2e0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
1a2f0 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
1a300 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
1a310 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20   to see how the 
1a320 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a  ALWAYS and.    *
1a330 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77  * NEVER macros w
1a340 65 72 65 20 64 65 66 69 6e 65 64 20 61 74 20 63  ere defined at c
1a350 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20  ompile-time..   
1a360 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
1a370 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41  eturn value is A
1a380 4c 57 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20  LWAYS(X).  .    
1a390 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65  **.    ** The re
1a3a0 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69  commended test i
1a3b0 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20  s X==2.  If the 
1a3c0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
1a3d0 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20  2, that means.  
1a3e0 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e    ** ALWAYS() an
1a3f0 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f  d NEVER() are bo
1a400 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68  th no-op pass-th
1a410 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68  rough macros, wh
1a420 69 63 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a  ich is the.    *
1a430 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e  * default settin
1a440 67 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  g.  If the retur
1a450 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68  n value is 1, th
1a460 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73 20 65  en ALWAYS() is e
1a470 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72  ither.    ** har
1a480 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20  d-coded to true 
1a490 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73 65 72  or else it asser
1a4a0 74 73 20 69 66 20 69 74 73 20 61 72 67 75 6d 65  ts if its argume
1a4b0 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20  nt is false..   
1a4c0 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20 62 65   ** The first be
1a4d0 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64  havior (hard-cod
1a4e0 65 64 20 74 6f 20 74 72 75 65 29 20 69 73 20 74  ed to true) is t
1a4f0 68 65 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a  he case if.    *
1a500 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  * SQLITE_TESTCTR
1a510 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73 20 74  L_ASSERT shows t
1a520 68 61 74 20 61 73 73 65 72 74 28 29 20 69 73 20  hat assert() is 
1a530 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65  disabled and the
1a540 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62   second.    ** b
1a550 65 68 61 76 69 6f 72 20 28 61 73 73 65 72 74 20  ehavior (assert 
1a560 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  if the argument 
1a570 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73 20 66  to ALWAYS() is f
1a580 61 6c 73 65 29 20 69 73 20 74 68 65 20 63 61 73  alse) is the cas
1a590 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49  e if.    ** SQLI
1a5a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
1a5b0 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73  RT shows that as
1a5c0 73 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65  sert() is enable
1a5d0 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
1a5e0 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65   The run-time te
1a5f0 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67  st procedure mig
1a600 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e  ht look somethin
1a610 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20  g like this:.   
1a620 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66   **.    **    if
1a630 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  ( sqlite3_test_c
1a640 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
1a650 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32  STCTRL_ALWAYS, 2
1a660 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20  )==2 ){.    **  
1a670 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20      // ALWAYS() 
1a680 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20  and NEVER() are 
1a690 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75  no-op pass-throu
1a6a0 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a  gh macros.    **
1a6b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
1a6c0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1a6d0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1a6e0 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b  RL_ASSERT, 1) ){
1a6f0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
1a700 41 4c 57 41 59 53 28 78 29 20 61 73 73 65 72 74  ALWAYS(x) assert
1a710 73 20 74 68 61 74 20 78 20 69 73 20 74 72 75 65  s that x is true
1a720 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73 65 72  . NEVER(x) asser
1a730 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20  ts x is false.. 
1a740 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a     **    }else{.
1a750 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41      **      // A
1a760 4c 57 41 59 53 28 78 29 20 69 73 20 61 20 63 6f  LWAYS(x) is a co
1a770 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52  nstant 1.  NEVER
1a780 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  (x) is a constan
1a790 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d  t 0..    **    }
1a7a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1a7b0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1a7c0 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20  _ALWAYS: {.     
1a7d0 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28   int x = va_arg(
1a7e0 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72  ap,int);.      r
1a7f0 63 20 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20  c = ALWAYS(x);. 
1a800 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1a810 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
1a820 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
1a830 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
1a840 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45  ESTCTRL_BYTEORDE
1a850 52 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  R);.    **.    *
1a860 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20 72 65  * The integer re
1a870 74 75 72 6e 65 64 20 72 65 76 65 61 6c 73 20 74  turned reveals t
1a880 68 65 20 62 79 74 65 2d 6f 72 64 65 72 20 6f 66  he byte-order of
1a890 20 74 68 65 20 63 6f 6d 70 75 74 65 72 20 6f 6e   the computer on
1a8a0 20 77 68 69 63 68 0a 20 20 20 20 2a 2a 20 53 51   which.    ** SQ
1a8b0 4c 69 74 65 20 69 73 20 72 75 6e 6e 69 6e 67 3a  Lite is running:
1a8c0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20  .    **.    **  
1a8d0 20 20 20 20 20 31 20 20 20 20 20 62 69 67 2d 65       1     big-e
1a8e0 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65 72 6d  ndian,    determ
1a8f0 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69 6d 65  ined at run-time
1a900 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 31 30 20  .    **      10 
1a910 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61      little-endia
1a920 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74  n, determined at
1a930 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a   run-time.    **
1a940 20 20 34 33 32 31 30 31 20 20 20 20 20 62 69 67    432101     big
1a950 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65  -endian,    dete
1a960 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c  rmined at compil
1a970 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20 20 31  e-time.    **  1
1a980 32 33 34 31 30 20 20 20 20 20 6c 69 74 74 6c 65  23410     little
1a990 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72 6d 69  -endian, determi
1a9a0 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  ned at compile-t
1a9b0 69 6d 65 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  ime.    */ .    
1a9c0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1a9d0 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a 20  CTRL_BYTEORDER: 
1a9e0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1a9f0 49 54 45 5f 42 59 54 45 4f 52 44 45 52 2a 31 30  ITE_BYTEORDER*10
1aa00 30 20 2b 20 53 51 4c 49 54 45 5f 4c 49 54 54 4c  0 + SQLITE_LITTL
1aa10 45 45 4e 44 49 41 4e 2a 31 30 20 2b 20 53 51 4c  EENDIAN*10 + SQL
1aa20 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 3b 0a 20  ITE_BIGENDIAN;. 
1aa30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1aa40 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
1aa50 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1aa60 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1aa70 5f 52 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65  _RESERVE, sqlite
1aa80 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20  3 *db, int N).  
1aa90 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
1aaa0 74 68 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a  the nReserve siz
1aab0 65 20 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d  e to N for the m
1aac0 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20  ain database on 
1aad0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
1aae0 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64   ** connection d
1aaf0 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  b..    */.    ca
1ab00 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1ab10 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20  RL_RESERVE: {.  
1ab20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
1ab30 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c  = va_arg(ap, sql
1ab40 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e  ite3*);.      in
1ab50 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  t x = va_arg(ap,
1ab60 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
1ab70 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1ab80 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
1ab90 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 65    sqlite3BtreeSe
1aba0 74 50 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44  tPageSize(db->aD
1abb0 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20  b[0].pBt, 0, x, 
1abc0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
1abd0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
1abe0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
1abf0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
1ac00 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65    /*  sqlite3_te
1ac10 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1ac20 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
1ac30 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65  IZATIONS, sqlite
1ac40 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20  3 *db, int N).  
1ac50 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62    **.    ** Enab
1ac60 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61  le or disable va
1ac70 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69  rious optimizati
1ac80 6f 6e 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ons for testing 
1ac90 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a  purposes.  The .
1aca0 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20      ** argument 
1acb0 4e 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f  N is a bitmask o
1acc0 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  f optimizations 
1acd0 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20  to be disabled. 
1ace0 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20   For normal.    
1acf0 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73  ** operation N s
1ad00 68 6f 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65  hould be 0.  The
1ad10 20 69 64 65 61 20 69 73 20 74 68 61 74 20 61 20   idea is that a 
1ad20 74 65 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69  test program (li
1ad30 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51  ke the.    ** SQ
1ad40 4c 20 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20  L Logic Test or 
1ad50 53 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29  SLT test module)
1ad60 20 63 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d   can run the sam
1ad70 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74  e SQL multiple t
1ad80 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68  imes.    ** with
1ad90 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a   various optimiz
1ada0 61 74 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20  ations disabled 
1adb0 74 6f 20 76 65 72 69 66 79 20 74 68 61 74 20 74  to verify that t
1adc0 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20  he same answer. 
1add0 20 20 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65     ** is obtaine
1ade0 64 20 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e  d in every case.
1adf0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1ae00 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1ae10 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20  _OPTIMIZATIONS: 
1ae20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
1ae30 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  *db = va_arg(ap,
1ae40 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20   sqlite3*);.    
1ae50 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73    db->dbOptFlags
1ae60 20 3d 20 28 75 31 36 29 28 76 61 5f 61 72 67 28   = (u16)(va_arg(
1ae70 61 70 2c 20 69 6e 74 29 20 26 20 30 78 66 66 66  ap, int) & 0xfff
1ae80 66 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  f);.      break;
1ae90 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
1aea0 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a  QLITE_N_KEYWORD.
1aeb0 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74      /* sqlite3_t
1aec0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1aed0 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45  TE_TESTCTRL_ISKE
1aee0 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68 61  YWORD, const cha
1aef0 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a  r *zWord).    **
1af00 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64  .    ** If zWord
1af10 20 69 73 20 61 20 6b 65 79 77 6f 72 64 20 72 65   is a keyword re
1af20 63 6f 67 6e 69 7a 65 64 20 62 79 20 74 68 65 20  cognized by the 
1af30 70 61 72 73 65 72 2c 20 74 68 65 6e 20 72 65 74  parser, then ret
1af40 75 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e  urn the.    ** n
1af50 75 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f 72 64  umber of keyword
1af60 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72 64 20  s.  Or if zWord 
1af70 69 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64  is not a keyword
1af80 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20 20 20  , return 0..    
1af90 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  ** .    ** This 
1afa0 74 65 73 74 20 66 65 61 74 75 72 65 20 69 73 20  test feature is 
1afb0 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69  only available i
1afc0 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69  n the amalgamati
1afd0 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20  on since.    ** 
1afe0 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59  the SQLITE_N_KEY
1aff0 57 4f 52 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f  WORD macro is no
1b000 74 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  t defined in thi
1b010 73 20 66 69 6c 65 20 69 66 20 53 51 4c 69 74 65  s file if SQLite
1b020 0a 20 20 20 20 2a 2a 20 69 73 20 62 75 69 6c 74  .    ** is built
1b030 20 75 73 69 6e 67 20 73 65 70 61 72 61 74 65 20   using separate 
1b040 73 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a 20 20  source files..  
1b050 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1b060 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53  LITE_TESTCTRL_IS
1b070 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20  KEYWORD: {.     
1b080 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f   const char *zWo
1b090 72 64 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  rd = va_arg(ap, 
1b0a0 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20  const char*);.  
1b0b0 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69      int n = sqli
1b0c0 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72  te3Strlen30(zWor
1b0d0 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28  d);.      rc = (
1b0e0 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f  sqlite3KeywordCo
1b0f0 64 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e  de((u8*)zWord, n
1b100 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49  )!=TK_ID) ? SQLI
1b110 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30  TE_N_KEYWORD : 0
1b120 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1b130 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20     }.#endif ..  
1b140 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
1b150 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1b160 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43  _TESTCTRL_SCRATC
1b170 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e  HMALLOC, sz, &pN
1b180 65 77 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20  ew, pFree);.    
1b190 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70  **.    ** Pass p
1b1a0 46 72 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65  Free into sqlite
1b1b0 33 53 63 72 61 74 63 68 46 72 65 65 28 29 2e 20  3ScratchFree(). 
1b1c0 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20  .    ** If sz>0 
1b1d0 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20  then allocate a 
1b1e0 73 63 72 61 74 63 68 20 62 75 66 66 65 72 20 69  scratch buffer i
1b1f0 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20  nto pNew.  .    
1b200 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1b210 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41  TE_TESTCTRL_SCRA
1b220 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20  TCHMALLOC: {.   
1b230 20 20 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20     void *pFree, 
1b240 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69  **ppNew;.      i
1b250 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20  nt sz;.      sz 
1b260 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
1b270 29 3b 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d  );.      ppNew =
1b280 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
1b290 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65  **);.      pFree
1b2a0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
1b2b0 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20  id*);.      if( 
1b2c0 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71  sz ) *ppNew = sq
1b2d0 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c  lite3ScratchMall
1b2e0 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71  oc(sz);.      sq
1b2f0 6c 69 74 65 33 53 63 72 61 74 63 68 46 72 65 65  lite3ScratchFree
1b300 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62  (pFree);.      b
1b310 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1b320 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1b330 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1b340 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c  E_TESTCTRL_LOCAL
1b350 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20  TIME_FAULT, int 
1b360 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20  onoff);.    **. 
1b370 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74     ** If paramet
1b380 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d  er onoff is non-
1b390 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20  zero, configure 
1b3a0 74 68 65 20 77 72 61 70 70 65 72 73 20 73 6f 20  the wrappers so 
1b3b0 74 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20  that all.    ** 
1b3c0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73  subsequent calls
1b3d0 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20   to localtime() 
1b3e0 61 6e 64 20 76 61 72 69 61 6e 74 73 20 66 61 69  and variants fai
1b3f0 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a  l. If onoff is z
1b400 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f  ero,.    ** undo
1b410 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20   this setting.. 
1b420 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1b430 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c  QLITE_TESTCTRL_L
1b440 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20  OCALTIME_FAULT: 
1b450 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
1b460 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63  lobalConfig.bLoc
1b470 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61  altimeFault = va
1b480 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
1b490 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b4a0 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  }..    /*   sqli
1b4b0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1b4c0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1b4d0 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c 20  _NEVER_CORRUPT, 
1b4e0 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  int);.    **.   
1b4f0 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72   ** Set or clear
1b500 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e 64   a flag that ind
1b510 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
1b520 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73  database file is
1b530 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20   always well-.  
1b540 20 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20    ** formed and 
1b550 6e 65 76 65 72 20 63 6f 72 72 75 70 74 2e 20 20  never corrupt.  
1b560 54 68 69 73 20 66 6c 61 67 20 69 73 20 63 6c 65  This flag is cle
1b570 61 72 20 62 79 20 64 65 66 61 75 6c 74 2c 20 69  ar by default, i
1b580 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 0a 20  ndicating that. 
1b590 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
1b5a0 69 6c 65 73 20 6d 69 67 68 74 20 68 61 76 65 20  iles might have 
1b5b0 61 72 62 69 74 72 61 72 79 20 63 6f 72 72 75 70  arbitrary corrup
1b5c0 74 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20 74  tion.  Setting t
1b5d0 68 65 20 66 6c 61 67 20 64 75 72 69 6e 67 0a 20  he flag during. 
1b5e0 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 63 61     ** testing ca
1b5f0 75 73 65 73 20 63 65 72 74 61 69 6e 20 61 73 73  uses certain ass
1b600 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73  ert() statements
1b610 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 6f 20   in the code to 
1b620 62 65 20 61 63 74 69 76 61 74 65 64 0a 20 20 20  be activated.   
1b630 20 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73 74   ** that demonst
1b640 72 61 74 20 69 6e 76 61 72 69 61 6e 74 73 20 6f  rat invariants o
1b650 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61  n well-formed da
1b660 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20 20  tabase files..  
1b670 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1b680 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45  LITE_TESTCTRL_NE
1b690 56 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20  VER_CORRUPT: {. 
1b6a0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1b6b0 61 6c 43 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f  alConfig.neverCo
1b6c0 72 72 75 70 74 20 3d 20 76 61 5f 61 72 67 28 61  rrupt = va_arg(a
1b6d0 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
1b6e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20  reak;.    }...  
1b6f0 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
1b700 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1b710 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45  TE_TESTCTRL_VDBE
1b720 5f 43 4f 56 45 52 41 47 45 2c 20 78 43 61 6c 6c  _COVERAGE, xCall
1b730 62 61 63 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20  back, ptr);.    
1b740 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
1b750 65 20 56 44 42 45 20 63 6f 76 65 72 61 67 65 20  e VDBE coverage 
1b760 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f  callback functio
1b770 6e 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77  n to xCallback w
1b780 69 74 68 20 63 6f 6e 74 65 78 74 20 0a 20 20 20  ith context .   
1b790 20 2a 2a 20 70 6f 69 6e 74 65 72 20 70 74 72 2e   ** pointer ptr.
1b7a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1b7b0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1b7c0 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 3a 20  _VDBE_COVERAGE: 
1b7d0 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
1b7e0 56 44 42 45 5f 43 4f 56 45 52 41 47 45 0a 20 20  VDBE_COVERAGE.  
1b7f0 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64      typedef void
1b800 20 28 2a 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61   (*branch_callba
1b810 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38  ck)(void*,int,u8
1b820 2c 75 38 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ,u8);.      sqli
1b830 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1b840 78 56 64 62 65 42 72 61 6e 63 68 20 3d 20 76 61  xVdbeBranch = va
1b850 5f 61 72 67 28 61 70 2c 62 72 61 6e 63 68 5f 63  _arg(ap,branch_c
1b860 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20  allback);.      
1b870 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1b880 66 69 67 2e 70 56 64 62 65 42 72 61 6e 63 68 41  fig.pVdbeBranchA
1b890 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 76  rg = va_arg(ap,v
1b8a0 6f 69 64 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20  oid*);.#endif.  
1b8b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1b8c0 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
1b8d0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1b8e0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1b8f0 53 4f 52 54 45 52 5f 4d 4d 41 50 2c 20 64 62 2c  SORTER_MMAP, db,
1b900 20 6e 4d 61 78 29 3b 20 2a 2f 0a 20 20 20 20 63   nMax); */.    c
1b910 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1b920 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50 3a  TRL_SORTER_MMAP:
1b930 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1b940 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61 70   *db = va_arg(ap
1b950 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  , sqlite3*);.   
1b960 20 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74 65     db->nMaxSorte
1b970 72 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61  rMmap = va_arg(a
1b980 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
1b990 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
1b9a0 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1b9b0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1b9c0 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49  E_TESTCTRL_ISINI
1b9d0 54 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  T);.    **.    *
1b9e0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1b9f0 4f 4b 20 69 66 20 53 51 4c 69 74 65 20 68 61 73  OK if SQLite has
1ba00 20 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 7a 65   been initialize
1ba10 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 45 52 52  d and SQLITE_ERR
1ba20 4f 52 20 69 66 0a 20 20 20 20 2a 2a 20 6e 6f 74  OR if.    ** not
1ba30 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
1ba40 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
1ba50 4c 5f 49 53 49 4e 49 54 3a 20 7b 0a 20 20 20 20  L_ISINIT: {.    
1ba60 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1ba70 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e 69 74  balConfig.isInit
1ba80 3d 3d 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54  ==0 ) rc = SQLIT
1ba90 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
1baa0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
1bab0 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23 65    va_end(ap);.#e
1bac0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
1bad0 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54  MIT_BUILTIN_TEST
1bae0 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   */.  return rc;
1baf0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
1bb00 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75 74  s a utility rout
1bb10 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20 56  ine, useful to V
1bb20 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  FS implementatio
1bb30 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73 0a  ns, that checks.
1bb40 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20 64  ** to see if a d
1bb50 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 61 73  atabase file was
1bb60 20 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e 74   a URI that cont
1bb70 61 69 6e 65 64 20 61 20 73 70 65 63 69 66 69 63  ained a specific
1bb80 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61 6d   query .** param
1bb90 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f 20  eter, and if so 
1bba0 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  obtains the valu
1bbb0 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 70  e of the query p
1bbc0 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  arameter..**.** 
1bbd0 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
1bbe0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
1bbf0 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20 70  lename pointer p
1bc00 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20 78  assed into the x
1bc10 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f 64  Open().** method
1bc20 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65 6d   of a VFS implem
1bc30 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20 7a  entation.  The z
1bc40 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20 69  Param argument i
1bc50 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
1bc60 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d  e.** query param
1bc70 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20 54  eter we seek.  T
1bc80 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1bc90 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  rns the value of
1bca0 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20 70   the zParam.** p
1bcb0 61 72 61 6d 65 74 65 72 20 69 66 20 69 74 20 65  arameter if it e
1bcc0 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 20 70  xists.  If the p
1bcd0 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e 6f  arameter does no
1bce0 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 72 6f  t exist, this ro
1bcf0 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73  utine.** returns
1bd00 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 2e   a NULL pointer.
1bd10 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1bd20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
1bd30 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61 72  meter(const char
1bd40 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e   *zFilename, con
1bd50 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 29  st char *zParam)
1bd60 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  {.  if( zFilenam
1bd70 65 3d 3d 30 20 7c 7c 20 7a 50 61 72 61 6d 3d 3d  e==0 || zParam==
1bd80 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1bd90 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
1bda0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
1bdb0 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77  lename) + 1;.  w
1bdc0 68 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b  hile( zFilename[
1bdd0 30 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20  0] ){.    int x 
1bde0 3d 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61  = strcmp(zFilena
1bdf0 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20  me, zParam);.   
1be00 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71   zFilename += sq
1be10 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
1be20 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20  ilename) + 1;.  
1be30 20 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74    if( x==0 ) ret
1be40 75 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20  urn zFilename;. 
1be50 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20     zFilename += 
1be60 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1be70 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a  zFilename) + 1;.
1be80 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1be90 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1bea0 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20  a boolean value 
1beb0 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61  for a query para
1bec0 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  meter..*/.int sq
1bed0 6c 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61  lite3_uri_boolea
1bee0 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
1bef0 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ilename, const c
1bf00 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74  har *zParam, int
1bf10 20 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74   bDflt){.  const
1bf20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
1bf30 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72  e3_uri_parameter
1bf40 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72  (zFilename, zPar
1bf50 61 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62  am);.  bDflt = b
1bf60 44 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72  Dflt!=0;.  retur
1bf70 6e 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74  n z ? sqlite3Get
1bf80 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74  Boolean(z, bDflt
1bf90 29 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a  ) : bDflt;.}../*
1bfa0 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d  .** Return a 64-
1bfb0 62 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75  bit integer valu
1bfc0 65 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61  e for a query pa
1bfd0 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69  rameter..*/.sqli
1bfe0 74 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65  te3_int64 sqlite
1bff0 33 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63  3_uri_int64(.  c
1c000 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1c010 6e 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65  name,    /* File
1c020 6e 61 6d 65 20 61 73 20 70 61 73 73 65 64 20 74  name as passed t
1c030 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e  o xOpen */.  con
1c040 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c  st char *zParam,
1c050 20 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61         /* URI pa
1c060 72 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a  rameter sought *
1c070 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  /.  sqlite3_int6
1c080 34 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a  4 bDflt       /*
1c090 20 72 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d   return if param
1c0a0 65 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20  eter is missing 
1c0b0 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  */.){.  const ch
1c0c0 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  ar *z = sqlite3_
1c0d0 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46  uri_parameter(zF
1c0e0 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29  ilename, zParam)
1c0f0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
1c100 34 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20  4 v;.  if( z && 
1c110 73 71 6c 69 74 65 33 44 65 63 4f 72 48 65 78 54  sqlite3DecOrHexT
1c120 6f 49 36 34 28 7a 2c 20 26 76 29 3d 3d 53 51 4c  oI64(z, &v)==SQL
1c130 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44  ITE_OK ){.    bD
1c140 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72  flt = v;.  }.  r
1c150 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a  eturn bDflt;.}..
1c160 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1c170 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69   Btree pointer i
1c180 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62  dentified by zDb
1c190 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  Name.  Return NU
1c1a0 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1c1b0 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74  .*/.Btree *sqlit
1c1c0 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
1c1d0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1c1e0 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1c1f0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1c200 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
1c210 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1c220 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20  db->aDb[i].pBt. 
1c230 20 20 20 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d      && (zDbName=
1c240 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  =0 || sqlite3Str
1c250 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62  ICmp(zDbName, db
1c260 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ->aDb[i].zName)=
1c270 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
1c280 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b   return db->aDb[
1c290 69 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20  i].pBt;.    }.  
1c2a0 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1c2b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1c2c0 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68  e filename of th
1c2d0 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
1c2e0 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
1c2f0 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
1c300 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ion..*/.const ch
1c310 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66  ar *sqlite3_db_f
1c320 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20  ilename(sqlite3 
1c330 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1c340 2a 7a 44 62 4e 61 6d 65 29 7b 0a 23 69 66 64 65  *zDbName){.#ifde
1c350 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1c360 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69 66 28 20  API_ARMOR.  if( 
1c370 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68  !sqlite3SafetyCh
1c380 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  eckOk(db) ){.   
1c390 20 28 76 6f 69 64 29 53 51 4c 49 54 45 5f 4d 49   (void)SQLITE_MI
1c3a0 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 20 20 72  SUSE_BKPT;.    r
1c3b0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 23 65 6e  eturn 0;.  }.#en
1c3c0 64 69 66 0a 20 20 42 74 72 65 65 20 2a 70 42 74  dif.  Btree *pBt
1c3d0 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65   = sqlite3DbName
1c3e0 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e  ToBtree(db, zDbN
1c3f0 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
1c400 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65  Bt ? sqlite3Btre
1c410 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42 74  eGetFilename(pBt
1c420 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) : 0;.}../*.** 
1c430 52 65 74 75 72 6e 20 31 20 69 66 20 64 61 74 61  Return 1 if data
1c440 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c  base is read-onl
1c450 79 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f 77  y or 0 if read/w
1c460 72 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  rite.  Return -1
1c470 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64   if.** no such d
1c480 61 74 61 62 61 73 65 20 65 78 69 73 74 73 2e 0a  atabase exists..
1c490 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
1c4a0 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74  b_readonly(sqlit
1c4b0 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
1c4c0 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 23 69  ar *zDbName){.#i
1c4d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
1c4e0 4c 45 5f 41 50 49 5f 41 52 4d 4f 52 0a 20 20 69  LE_API_ARMOR.  i
1c4f0 66 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  f( !sqlite3Safet
1c500 79 43 68 65 63 6b 4f 6b 28 64 62 29 20 29 7b 0a  yCheckOk(db) ){.
1c510 20 20 20 20 28 76 6f 69 64 29 53 51 4c 49 54 45      (void)SQLITE
1c520 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
1c530 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
1c540 0a 23 65 6e 64 69 66 0a 20 20 42 74 72 65 65 20  .#endif.  Btree 
1c550 2a 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62  *pBt = sqlite3Db
1c560 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20  NameToBtree(db, 
1c570 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75  zDbName);.  retu
1c580 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33  rn pBt ? sqlite3
1c590 42 74 72 65 65 49 73 52 65 61 64 6f 6e 6c 79 28  BtreeIsReadonly(
1c5a0 70 42 74 29 20 3a 20 2d 31 3b 0a 7d 0a           pBt) : -1;.}.