/ Hex Artifact Content
Login

Artifact d3655832585baef4c2356529a5c6ca5ca3bd7c1f:


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 63 61  k;.    }..    ca
4070: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4080: 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 73 71  _URI: {.      sq
4090: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
40a0: 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f  g.bOpenUri = va_
40b0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
40c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
40d0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e  E_CONFIG_COVERIN
40f0: 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a  G_INDEX_SCAN: {.
4100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4110: 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
4120: 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  s = va_arg(ap, i
4130: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
4140: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
4150: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
4160: 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51  LLOG.    case SQ
4170: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
4180: 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  OG: {.      type
4190: 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47  def void(*SQLLOG
41a0: 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73  FUNC_t)(void*, s
41b0: 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
41c0: 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20  har*, int);.    
41d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
41e0: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20  onfig.xSqllog = 
41f0: 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f  va_arg(ap, SQLLO
4200: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
4210: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4220: 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d  fig.pSqllogArg =
4230: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
4240: 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   *);.      break
4250: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
4260: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4270: 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45  CONFIG_MMAP_SIZE
4280: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4290: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d  3_int64 szMmap =
42a0: 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
42b0: 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20  te3_int64);.    
42c0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
42d0: 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  mxMmap = va_arg(
42e0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ap, sqlite3_int6
42f0: 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  4);.      if( mx
4300: 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70  Mmap<0 || mxMmap
4310: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50  >SQLITE_MAX_MMAP
4320: 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
4330: 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45   mxMmap = SQLITE
4340: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a  _MAX_MMAP_SIZE;.
4350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
4360: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4370: 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61  g.mxMmap = mxMma
4380: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d  p;.      if( szM
4390: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
43a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
43b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
43c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
43d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
43e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
43f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
4400: 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
4410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4420: 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   }..#if SQLITE_O
4430: 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e 65 64  S_WIN && defined
4440: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
4450: 4c 4c 4f 43 29 0a 20 20 20 20 63 61 73 65 20 53  LLOC).    case S
4460: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e  QLITE_CONFIG_WIN
4470: 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20  32_HEAPSIZE: {. 
4480: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4490: 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d  alConfig.nHeap =
44a0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
44b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
44c0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
44d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
44e0: 46 49 47 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  FIG_WORKER_THREA
44f0: 44 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  DS: {.      int 
4500: 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  n = va_arg(ap, i
4510: 6e 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  nt);.      if( n
4520: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b  >SQLITE_MAX_WORK
4530: 45 52 5f 54 48 52 45 41 44 53 20 29 20 6e 20 3d  ER_THREADS ) n =
4540: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
4550: 45 52 5f 54 48 52 45 41 44 53 3b 0a 20 20 20 20  ER_THREADS;.    
4560: 20 20 69 66 28 20 6e 3e 3d 30 20 29 20 73 71 6c    if( n>=0 ) sql
4570: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4580: 2e 6e 57 6f 72 6b 65 72 20 3d 20 6e 3b 0a 20 20  .nWorker = n;.  
4590: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
45a0: 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  ..    default: {
45b0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
45c0: 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
45d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
45e0: 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
45f0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
4600: 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65 20  *.** Set up the 
4610: 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65 72  lookaside buffer
4620: 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73 65  s for a database
4630: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20   connection..** 
4640: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
4650: 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a 2a   on success.  .*
4660: 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69  * If lookaside i
4670: 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76 65  s already active
4680: 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  , return SQLITE_
4690: 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  BUSY..**.** The 
46a0: 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  sz parameter is 
46b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
46c0: 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b  tes in each look
46d0: 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54  aside slot..** T
46e0: 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65 72  he cnt parameter
46f0: 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
4700: 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53 74  f slots.  If pSt
4710: 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a  art is NULL the.
4720: 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ** space for the
4730: 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72   lookaside memor
4740: 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  y is obtained fr
4750: 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
4760: 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72  c()..** If pStar
4770: 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  t is not NULL th
4780: 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74 20  en it is sz*cnt 
4790: 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20  bytes of memory 
47a0: 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68  to use for.** th
47b0: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
47c0: 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
47d0: 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65  t setupLookaside
47e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f  (sqlite3 *db, vo
47f0: 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a  id *pBuf, int sz
4800: 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f  , int cnt){.  vo
4810: 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69 66  id *pStart;.  if
4820: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
4830: 6e 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75  nOut ){.    retu
4840: 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a  rn SQLITE_BUSY;.
4850: 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e    }.  /* Free an
4860: 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61  y existing looka
4870: 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72 20  side buffer for 
4880: 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66 6f  this handle befo
4890: 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69  re.  ** allocati
48a0: 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20  ng a new one so 
48b0: 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74 6f  we don't have to
48c0: 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72 20   have space for 
48d0: 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74 68  .  ** both at th
48e0: 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a  e same time..  *
48f0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
4900: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
4910: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
4920: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
4930: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
4940: 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20   /* The size of 
4950: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74  a lookaside slot
4960: 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e   after ROUNDDOWN
4970: 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 61  8 needs to be la
4980: 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61  rger.  ** than a
4990: 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20 75   pointer to be u
49a0: 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a  seful..  */.  sz
49b0: 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a   = ROUNDDOWN8(sz
49c0: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33  );  /* IMP: R-33
49d0: 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69  038-09382 */.  i
49e0: 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65  f( sz<=(int)size
49f0: 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74  of(LookasideSlot
4a00: 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69  *) ) sz = 0;.  i
4a10: 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d  f( cnt<0 ) cnt =
4a20: 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20   0;.  if( sz==0 
4a30: 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  || cnt==0 ){.   
4a40: 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53 74   sz = 0;.    pSt
4a50: 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  art = 0;.  }else
4a60: 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a   if( pBuf==0 ){.
4a70: 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e      sqlite3Begin
4a80: 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
4a90: 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71 6c      pStart = sql
4aa0: 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63  ite3Malloc( sz*c
4ab0: 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52  nt );  /* IMP: R
4ac0: 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a  -61949-35727 */.
4ad0: 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65      sqlite3EndBe
4ae0: 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20  nignMalloc();.  
4af0: 20 20 69 66 28 20 70 53 74 61 72 74 20 29 20 63    if( pStart ) c
4b00: 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  nt = sqlite3Mall
4b10: 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f 73  ocSize(pStart)/s
4b20: 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  z;.  }else{.    
4b30: 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a 20  pStart = pBuf;. 
4b40: 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   }.  db->lookasi
4b50: 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74 61  de.pStart = pSta
4b60: 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73  rt;.  db->lookas
4b70: 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20  ide.pFree = 0;. 
4b80: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73   db->lookaside.s
4b90: 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20 69  z = (u16)sz;.  i
4ba0: 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20 20  f( pStart ){.   
4bb0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b   int i;.    Look
4bc0: 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20  asideSlot *p;.  
4bd0: 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20 28    assert( sz > (
4be0: 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61  int)sizeof(Looka
4bf0: 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20  sideSlot*) );.  
4c00: 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65    p = (Lookaside
4c10: 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20 20  Slot*)pStart;.  
4c20: 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69    for(i=cnt-1; i
4c30: 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20  >=0; i--){.     
4c40: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e   p->pNext = db->
4c50: 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65 3b  lookaside.pFree;
4c60: 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61  .      db->looka
4c70: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a  side.pFree = p;.
4c80: 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61        p = (Looka
4c90: 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a  sideSlot*)&((u8*
4ca0: 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20  )p)[sz];.    }. 
4cb0: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
4cc0: 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64  .pEnd = p;.    d
4cd0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e  b->lookaside.bEn
4ce0: 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 64  abled = 1;.    d
4cf0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61  b->lookaside.bMa
4d00: 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d 30  lloced = pBuf==0
4d10: 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a   ?1:0;.  }else{.
4d20: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4d30: 65 2e 70 53 74 61 72 74 20 3d 20 64 62 3b 0a 20  e.pStart = db;. 
4d40: 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65     db->lookaside
4d50: 2e 70 45 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20  .pEnd = db;.    
4d60: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
4d70: 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20  nabled = 0;.    
4d80: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
4d90: 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d  alloced = 0;.  }
4da0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4db0: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  _OK;.}../*.** Re
4dc0: 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20 61  turn the mutex a
4dd0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
4de0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
4df0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33  tion..*/.sqlite3
4e00: 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33 5f  _mutex *sqlite3_
4e10: 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65 33  db_mutex(sqlite3
4e20: 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
4e30: 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a  db->mutex;.}../*
4e40: 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73 20 6d  .** Free up as m
4e50: 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 77 65  uch memory as we
4e60: 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20 67 69   can from the gi
4e70: 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ven database.** 
4e80: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  connection..*/.i
4e90: 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
4ea0: 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c  lease_memory(sql
4eb0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74  ite3 *db){.  int
4ec0: 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75   i;.  sqlite3_mu
4ed0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
4ee0: 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  tex);.  sqlite3B
4ef0: 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29  treeEnterAll(db)
4f00: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ;.  for(i=0; i<d
4f10: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
4f20: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
4f30: 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20  b->aDb[i].pBt;. 
4f40: 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20 20     if( pBt ){.  
4f50: 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
4f60: 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65  r = sqlite3Btree
4f70: 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20 20  Pager(pBt);.    
4f80: 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 68    sqlite3PagerSh
4f90: 72 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  rink(pPager);.  
4fa0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
4fb0: 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
4fc0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  b);.  sqlite3_mu
4fd0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
4fe0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
4ff0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5000: 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  ** Configuration
5010: 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61 6e   settings for an
5020: 20 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74 61   individual data
5030: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  base connection.
5040: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
5050: 62 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65 33  b_config(sqlite3
5060: 20 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e   *db, int op, ..
5070: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
5080: 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76 61  ;.  int rc;.  va
5090: 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a  _start(ap, op);.
50a0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
50b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
50c0: 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49  DBCONFIG_LOOKASI
50d0: 44 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64  DE: {.      void
50e0: 20 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67 28   *pBuf = va_arg(
50f0: 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49  ap, void*); /* I
5100: 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31 30 39 36  MP: R-26835-1096
5110: 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 73  4 */.      int s
5120: 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
5130: 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d  nt);       /* IM
5140: 50 3a 20 52 2d 34 37 38 37 31 2d 32 35 39 39 34  P: R-47871-25994
5150: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63 6e   */.      int cn
5160: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
5170: 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50  nt);      /* IMP
5180: 3a 20 52 2d 30 34 34 36 30 2d 35 33 33 38 36 20  : R-04460-53386 
5190: 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 65  */.      rc = se
51a0: 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c  tupLookaside(db,
51b0: 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b   pBuf, sz, cnt);
51c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
51d0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
51e0: 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20   {.      static 
51f0: 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
5200: 20 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20 20         int op;  
5210: 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64      /* The opcod
5220: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33 32  e */.        u32
5230: 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73   mask;    /* Mas
5240: 6b 20 6f 66 20 74 68 65 20 62 69 74 20 69 6e 20  k of the bit in 
5250: 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 74 6f  sqlite3.flags to
5260: 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20   set/clear */.  
5270: 20 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20      } aFlagOp[] 
5280: 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 53 51  = {.        { SQ
5290: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
52a0: 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20 53 51  ABLE_FKEY,    SQ
52b0: 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73  LITE_ForeignKeys
52c0: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b      },.        {
52d0: 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
52e0: 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52 2c  _ENABLE_TRIGGER,
52f0: 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72   SQLITE_EnableTr
5300: 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20 20  igger  },.      
5310: 7d 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65  };.      unsigne
5320: 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 72  d int i;.      r
5330: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
5340: 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39  ; /* IMP: R-4279
5350: 30 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20 20 20  0-23372 */.     
5360: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
5370: 79 53 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20  ySize(aFlagOp); 
5380: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
5390: 28 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d  ( aFlagOp[i].op=
53a0: 3d 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =op ){.         
53b0: 20 69 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f   int onoff = va_
53c0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
53d0: 20 20 20 20 20 20 20 20 69 6e 74 20 2a 70 52 65          int *pRe
53e0: 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  s = va_arg(ap, i
53f0: 6e 74 2a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nt*);.          
5400: 69 6e 74 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64  int oldFlags = d
5410: 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20 20  b->flags;.      
5420: 20 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20      if( onoff>0 
5430: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ){.            d
5440: 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61  b->flags |= aFla
5450: 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20  gOp[i].mask;.   
5460: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
5470: 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20   onoff==0 ){.   
5480: 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c 61           db->fla
5490: 67 73 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69  gs &= ~aFlagOp[i
54a0: 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  ].mask;.        
54b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
54c0: 28 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e  ( oldFlags!=db->
54d0: 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20 20  flags ){.       
54e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69       sqlite3Expi
54f0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
5500: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20 20  ents(db);.      
5510: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
5520: 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20 20  if( pRes ){.    
5530: 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d 20          *pRes = 
5540: 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c  (db->flags & aFl
5550: 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30  agOp[i].mask)!=0
5560: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
5570: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
5580: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
5590: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
55a0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
55b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
55c0: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
55d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
55e0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
55f0: 75 65 20 69 66 20 74 68 65 20 62 75 66 66 65 72  ue if the buffer
5600: 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61   z[0..n-1] conta
5610: 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a  ins all spaces..
5620: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6c  */.static int al
5630: 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63 68  lSpaces(const ch
5640: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
5650: 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a   while( n>0 && z
5660: 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d  [n-1]==' ' ){ n-
5670: 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d  -; }.  return n=
5680: 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  =0;.}../*.** Thi
5690: 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  s is the default
56a0: 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
56b0: 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41 52  ion named "BINAR
56c0: 59 22 20 77 68 69 63 68 20 69 73 20 61 6c 77 61  Y" which is alwa
56d0: 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e  ys.** available.
56e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
56f0: 64 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  dFlag argument i
5700: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
5710: 73 70 61 63 65 20 70 61 64 64 69 6e 67 20 61 74  space padding at
5720: 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73   the end.** of s
5730: 74 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72 65  trings is ignore
5740: 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d 65  d.  This impleme
5750: 6e 74 73 20 74 68 65 20 52 54 52 49 4d 20 63 6f  nts the RTRIM co
5760: 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  llation..*/.stat
5770: 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75  ic int binCollFu
5780: 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64 46  nc(.  void *padF
5790: 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31  lag,.  int nKey1
57a0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
57b0: 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32  ey1,.  int nKey2
57c0: 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b  , const void *pK
57d0: 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c  ey2.){.  int rc,
57e0: 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c   n;.  n = nKey1<
57f0: 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20  nKey2 ? nKey1 : 
5800: 6e 4b 65 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65  nKey2;.  rc = me
5810: 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65 79  mcmp(pKey1, pKey
5820: 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d  2, n);.  if( rc=
5830: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 61  =0 ){.    if( pa
5840: 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61 6c  dFlag.     && al
5850: 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a 29  lSpaces(((char*)
5860: 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d  pKey1)+n, nKey1-
5870: 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  n).     && allSp
5880: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
5890: 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a  y2)+n, nKey2-n).
58a0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
58b0: 4c 65 61 76 65 20 72 63 20 75 6e 63 68 61 6e 67  Leave rc unchang
58c0: 65 64 20 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d  ed at 0 */.    }
58d0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
58e0: 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a   nKey1 - nKey2;.
58f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
5900: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5910: 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69 6e  Another built-in
5920: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
5930: 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a  nce: NOCASE. .**
5940: 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74 69  .** This collati
5950: 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20 69  ng sequence is i
5960: 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75 73  ntended to be us
5970: 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e 64  ed for "case ind
5980: 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70  ependent.** comp
5990: 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27  arison". SQLite'
59a0: 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75  s knowledge of u
59b0: 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20 63  pper and lower c
59c0: 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73 0a  ase equivalents.
59d0: 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20  ** extends only 
59e0: 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61 63  to the 26 charac
59f0: 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68 65  ters used in the
5a00: 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
5a10: 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20  e..**.** At the 
5a20: 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73 20  moment there is 
5a30: 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d 70  only a UTF-8 imp
5a40: 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a  lementation..*/.
5a50: 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61 73  static int nocas
5a60: 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a  eCollatingFunc(.
5a70: 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c    void *NotUsed,
5a80: 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f  .  int nKey1, co
5a90: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c  nst void *pKey1,
5aa0: 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f  .  int nKey2, co
5ab0: 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a  nst void *pKey2.
5ac0: 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71 6c  ){.  int r = sql
5ad0: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20 20  ite3StrNICmp(.  
5ae0: 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72 20      (const char 
5af0: 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20  *)pKey1, (const 
5b00: 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e  char *)pKey2, (n
5b10: 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79  Key1<nKey2)?nKey
5b20: 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53  1:nKey2);.  UNUS
5b30: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
5b40: 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d  Used);.  if( 0==
5b50: 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65  r ){.    r = nKe
5b60: 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20  y1-nKey2;.  }.  
5b70: 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a  return r;.}../*.
5b80: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52 4f  ** Return the RO
5b90: 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  WID of the most 
5ba0: 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f  recent insert.*/
5bb0: 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 71  .sqlite_int64 sq
5bc0: 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72  lite3_last_inser
5bd0: 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33 20  t_rowid(sqlite3 
5be0: 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64  *db){.  return d
5bf0: 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a  b->lastRowid;.}.
5c00: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5c10: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 6e  e number of chan
5c20: 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74 20  ges in the most 
5c30: 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73  recent call to s
5c40: 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a  qlite3_exec()..*
5c50: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 68  /.int sqlite3_ch
5c60: 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64  anges(sqlite3 *d
5c70: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
5c80: 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a  >nChange;.}../*.
5c90: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
5ca0: 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20  mber of changes 
5cb0: 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62 61  since the databa
5cc0: 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f 70  se handle was op
5cd0: 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ened..*/.int sql
5ce0: 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67  ite3_total_chang
5cf0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
5d00: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54  .  return db->nT
5d10: 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f  otalChange;.}../
5d20: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f  *.** Close all o
5d30: 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e 20  pen savepoints. 
5d40: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e  This function on
5d50: 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20 66  ly manipulates f
5d60: 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20  ields of the.** 
5d70: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
5d80: 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73 20  object, it does 
5d90: 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73 61  not close any sa
5da0: 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d 61  vepoints that ma
5db0: 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20  y be open.** at 
5dc0: 74 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65 72  the b-tree/pager
5dd0: 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20   level..*/.void 
5de0: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
5df0: 70 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20 2a  points(sqlite3 *
5e00: 64 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64 62  db){.  while( db
5e10: 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ->pSavepoint ){.
5e20: 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a 70      Savepoint *p
5e30: 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65 70  Tmp = db->pSavep
5e40: 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53  oint;.    db->pS
5e50: 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d  avepoint = pTmp-
5e60: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c 69  >pNext;.    sqli
5e70: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 54  te3DbFree(db, pT
5e80: 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e  mp);.  }.  db->n
5e90: 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20  Savepoint = 0;. 
5ea0: 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20   db->nStatement 
5eb0: 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61  = 0;.  db->isTra
5ec0: 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e  nsactionSavepoin
5ed0: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
5ee0: 49 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74 72  Invoke the destr
5ef0: 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61  uctor function a
5f00: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 46  ssociated with F
5f10: 75 6e 63 44 65 66 20 70 2c 20 69 66 20 61 6e 79  uncDef p, if any
5f20: 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20  . Except,.** if 
5f30: 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65 20  this is not the 
5f40: 6c 61 73 74 20 63 6f 70 79 20 6f 66 20 74 68 65  last copy of the
5f50: 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f   function, do no
5f60: 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c  t invoke it. Mul
5f70: 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20  tiple.** copies 
5f80: 6f 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e 63  of a single func
5f90: 74 69 6f 6e 20 61 72 65 20 63 72 65 61 74 65 64  tion are created
5fa0: 20 77 68 65 6e 20 63 72 65 61 74 65 5f 66 75 6e   when create_fun
5fb0: 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65  ction() is calle
5fc0: 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54 45  d.** with SQLITE
5fd0: 5f 41 4e 59 20 61 73 20 74 68 65 20 65 6e 63 6f  _ANY as the enco
5fe0: 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ding..*/.static 
5ff0: 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44 65 73  void functionDes
6000: 74 72 6f 79 28 73 71 6c 69 74 65 33 20 2a 64 62  troy(sqlite3 *db
6010: 2c 20 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20  , FuncDef *p){. 
6020: 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20   FuncDestructor 
6030: 2a 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70  *pDestructor = p
6040: 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20  ->pDestructor;. 
6050: 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72   if( pDestructor
6060: 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63   ){.    pDestruc
6070: 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  tor->nRef--;.   
6080: 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f 72   if( pDestructor
6090: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
60a0: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
60b0: 78 44 65 73 74 72 6f 79 28 70 44 65 73 74 72 75  xDestroy(pDestru
60c0: 63 74 6f 72 2d 3e 70 55 73 65 72 44 61 74 61 29  ctor->pUserData)
60d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
60e0: 62 46 72 65 65 28 64 62 2c 20 70 44 65 73 74 72  bFree(db, pDestr
60f0: 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20  uctor);.    }.  
6100: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f  }.}../*.** Disco
6110: 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69 74 65  nnect all sqlite
6120: 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 73 20 74  3_vtab objects t
6130: 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61  hat belong to da
6140: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
6150: 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20 69 73  n.** db. This is
6160: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 64 62 20   called when db 
6170: 69 73 20 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e  is being closed.
6180: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6190: 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61  disconnectAllVta
61a0: 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  b(sqlite3 *db){.
61b0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
61c0: 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
61d0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
61e0: 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c  te3BtreeEnterAll
61f0: 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  (db);.  for(i=0;
6200: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
6210: 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70 53  {.    Schema *pS
6220: 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b  chema = db->aDb[
6230: 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  i].pSchema;.    
6240: 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  if( db->aDb[i].p
6250: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
6260: 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20  HashElem *p;.   
6270: 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65 48     for(p=sqliteH
6280: 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65 6d  ashFirst(&pSchem
6290: 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b 20  a->tblHash); p; 
62a0: 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  p=sqliteHashNext
62b0: 28 70 29 29 7b 0a 20 20 20 20 20 20 20 20 54 61  (p)){.        Ta
62c0: 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61 62  ble *pTab = (Tab
62d0: 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44  le *)sqliteHashD
62e0: 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 20 20  ata(p);.        
62f0: 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70 54  if( IsVirtual(pT
6300: 61 62 29 20 29 20 73 71 6c 69 74 65 33 56 74 61  ab) ) sqlite3Vta
6310: 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20  bDisconnect(db, 
6320: 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  pTab);.      }. 
6330: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
6340: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
6350: 28 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 42  (db);.  sqlite3B
6360: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
6370: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
6380: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
6390: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
63a0: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 64  Return TRUE if d
63b0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
63c0: 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61  on db has unfina
63d0: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
63e0: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
63f0: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
6400: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
6410: 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s.  .*/.static i
6420: 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  nt connectionIsB
6430: 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29  usy(sqlite3 *db)
6440: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
6450: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6460: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
6470: 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  x) );.  if( db->
6480: 70 56 64 62 65 20 29 20 72 65 74 75 72 6e 20 31  pVdbe ) return 1
6490: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  ;.  for(j=0; j<d
64a0: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
64b0: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
64c0: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20  b->aDb[j].pBt;. 
64d0: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
64e0: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61  lite3BtreeIsInBa
64f0: 63 6b 75 70 28 70 42 74 29 20 29 20 72 65 74 75  ckup(pBt) ) retu
6500: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
6510: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
6520: 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  lose an existing
6530: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
6540: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
6550: 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69  qlite3Close(sqli
6560: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72  te3 *db, int for
6570: 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28  ceZombie){.  if(
6580: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
6590: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
65a0: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
65b0: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
65c0: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
65d0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
65e0: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
65f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6600: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
6610: 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73  .  /* Force xDis
6620: 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e  connect calls on
6630: 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62   all virtual tab
6640: 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e  les */.  disconn
6650: 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a  ectAllVtab(db);.
6660: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
6670: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
6680: 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  the disconnectAl
6690: 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f  lVtab() call abo
66a0: 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ve.  ** will not
66b0: 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65   have called the
66c0: 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d   xDisconnect() m
66d0: 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72  ethod on any vir
66e0: 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73  tual.  ** tables
66f0: 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72   in the db->aVTr
6700: 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65  ans[] array. The
6710: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
6720: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29  e3VtabRollback()
6730: 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20  .  ** call will 
6740: 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74  do so. We need t
6750: 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65  o do this before
6760: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
6770: 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73  ctive.  ** SQL s
6780: 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c  tatements below,
6790: 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20   as the v-table 
67a0: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
67b0: 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20  ay be storing.  
67c0: 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64  ** some prepared
67d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65   statements inte
67e0: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73  rnally..  */.  s
67f0: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
6800: 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65  ck(db);..  /* Le
6810: 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28 73  gacy behavior (s
6820: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62  qlite3_close() b
6830: 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72  ehavior) is to r
6840: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
6850: 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63 6f  E_BUSY if the co
6860: 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74  nnection can not
6870: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
6880: 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  iately..  */.  i
6890: 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20  f( !forceZombie 
68a0: 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  && connectionIsB
68b0: 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73  usy(db) ){.    s
68c0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
68d0: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e  SQLITE_BUSY, "un
68e0: 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75  able to close du
68f0: 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64  e to unfinalized
6900: 20 22 0a 20 20 20 20 20 20 20 22 73 74 61 74 65   ".       "state
6910: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
6920: 68 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20  hed backups");. 
6930: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
6940: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
6950: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
6960: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
6970: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6980: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66  ABLE_SQLLOG.  if
6990: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
69a0: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b  onfig.xSqllog ){
69b0: 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20  .    /* Closing 
69c0: 74 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72  the handle. Four
69d0: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  th parameter is 
69e0: 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65  passed the value
69f0: 20 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74   2. */.    sqlit
6a00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
6a10: 53 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c  Sqllog(sqlite3Gl
6a20: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
6a30: 6f 67 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29  ogArg, db, 0, 2)
6a40: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
6a50: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63  /* Convert the c
6a60: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61  onnection into a
6a70: 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e   zombie and then
6a80: 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a   close it..  */.
6a90: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
6aa0: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
6ab0: 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76  E;.  sqlite3Leav
6ac0: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
6ad0: 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75  mbie(db);.  retu
6ae0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6af0: 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61  ./*.** Two varia
6b00: 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62  tions on the pub
6b10: 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f  lic interface fo
6b20: 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61  r closing a data
6b30: 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
6b40: 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f  on. The sqlite3_
6b50: 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20  close() version 
6b60: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
6b70: 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65  USY and.** leave
6b80: 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  s the connection
6b90: 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65   option if there
6ba0: 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64   are unfinalized
6bb0: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
6bc0: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
6bd0: 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61  ished sqlite3_ba
6be0: 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69  ckups.  The sqli
6bf0: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a  te3_close_v2().*
6c00: 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73  * version forces
6c10: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
6c20: 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62  to become a zomb
6c30: 69 65 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  ie if there are.
6c40: 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f  ** unclosed reso
6c50: 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e  urces, and arran
6c60: 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61  ges for dealloca
6c70: 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61  tion when the la
6c80: 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74  st.** prepare st
6c90: 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74  atement or sqlit
6ca0: 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73  e3_backup closes
6cb0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6cc0: 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  _close(sqlite3 *
6cd0: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
6ce0: 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20  te3Close(db,0); 
6cf0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  }.int sqlite3_cl
6d00: 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a  ose_v2(sqlite3 *
6d10: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
6d20: 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20  te3Close(db,1); 
6d30: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  }.../*.** Close 
6d40: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  the mutex on dat
6d50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6d60: 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68   db..**.** Furth
6d70: 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62  ermore, if datab
6d80: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
6d90: 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d  b is a zombie (m
6da0: 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72  eaning that ther
6db0: 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20  e.** has been a 
6dc0: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71  prior call to sq
6dd0: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20  lite3_close(db) 
6de0: 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  or sqlite3_close
6df0: 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20  _v2(db)) and.** 
6e00: 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74  every sqlite3_st
6e10: 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20  mt has now been 
6e20: 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76  finalized and ev
6e30: 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  ery sqlite3_back
6e40: 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68  up has.** finish
6e50: 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c  ed, then free al
6e60: 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a  l resources..*/.
6e70: 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76  void sqlite3Leav
6e80: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
6e90: 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62  mbie(sqlite3 *db
6ea0: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
6eb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6ec0: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
6ed0: 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  le iterator */. 
6ee0: 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66   int j;..  /* If
6ef0: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
6f00: 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73  anding sqlite3_s
6f10: 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62  tmt or sqlite3_b
6f20: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20  ackup objects.  
6f30: 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e  ** or if the con
6f40: 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20  nection has not 
6f50: 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20  yet been closed 
6f60: 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  by sqlite3_close
6f70: 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e  _v2(),.  ** then
6f80: 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68 65 20   just leave the 
6f90: 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e  mutex and return
6fa0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
6fb0: 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d  >magic!=SQLITE_M
6fc0: 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63  AGIC_ZOMBIE || c
6fd0: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
6fe0: 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  db) ){.    sqlit
6ff0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
7000: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
7010: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
7020: 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
7030: 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
7040: 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
7050: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
7060: 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61  as.  ** closed a
7070: 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ll sqlite3_stmt 
7080: 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  and sqlite3_back
7090: 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68  up objects and h
70a0: 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73  as been.  ** pas
70b0: 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  sed to sqlite3_c
70c0: 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68  lose (meaning th
70d0: 61 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69  at it is a zombi
70e0: 65 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a  e).  Therefore,.
70f0: 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e    ** go ahead an
7100: 64 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75  d free all resou
7110: 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  rces..  */..  /*
7120: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
7130: 6e 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20  n is open, roll 
7140: 69 74 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c  it back. This al
7150: 73 6f 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  so ensures that 
7160: 69 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61  if.  ** any data
7170: 62 61 73 65 20 73 63 68 65 6d 61 73 20 68 61 76  base schemas hav
7180: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
7190: 62 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65  by an uncommitte
71a0: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d transaction.  
71b0: 2a 2a 20 74 68 65 79 20 61 72 65 20 72 65 73 65  ** they are rese
71c0: 74 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20  t. And that the 
71d0: 72 65 71 75 69 72 65 64 20 62 2d 74 72 65 65 20  required b-tree 
71e0: 6d 75 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f  mutex is held to
71f0: 20 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70   make.  ** the p
7200: 61 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ager rollback an
7210: 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 20 61  d schema reset a
7220: 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69  n atomic operati
7230: 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  on. */.  sqlite3
7240: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
7250: 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f  SQLITE_OK);..  /
7260: 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74  * Free any outst
7270: 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74  anding Savepoint
7280: 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a   structures. */.
7290: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
72a0: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20  vepoints(db);.. 
72b0: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61   /* Close all da
72c0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
72d0: 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b  ns */.  for(j=0;
72e0: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
72f0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
7300: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
7310: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  j];.    if( pDb-
7320: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71  >pBt ){.      sq
7330: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
7340: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
7350: 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20   pDb->pBt = 0;. 
7360: 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b       if( j!=1 ){
7370: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53  .        pDb->pS
7380: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
7390: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
73a0: 2a 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50  * Clear the TEMP
73b0: 20 73 63 68 65 6d 61 20 73 65 70 61 72 61 74 65   schema separate
73c0: 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20  ly and last */. 
73d0: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
73e0: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73  pSchema ){.    s
73f0: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
7400: 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  r(db->aDb[1].pSc
7410: 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  hema);.  }.  sql
7420: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
7430: 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72  st(db);..  /* Fr
7440: 65 65 20 75 70 20 74 68 65 20 61 72 72 61 79 20  ee up the array 
7450: 6f 66 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  of auxiliary dat
7460: 61 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69  abases */.  sqli
7470: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
7480: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20  aseArray(db);.  
7490: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
74a0: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
74b0: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
74c0: 53 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20  Static );..  /* 
74d0: 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e  Tell the code in
74e0: 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74   notify.c that t
74f0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f  he connection no
7500: 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e   longer holds an
7510: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64  y.  ** locks and
7520: 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
7530: 65 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e  e any further un
7540: 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
7550: 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  backs..  */.  sq
7560: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43  lite3ConnectionC
7570: 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f  losed(db);..  fo
7580: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
7590: 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b  ze(db->aFunc.a);
75a0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44   j++){.    FuncD
75b0: 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73  ef *pNext, *pHas
75c0: 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  h, *p;.    for(p
75d0: 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b  =db->aFunc.a[j];
75e0: 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20   p; p=pHash){.  
75f0: 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70      pHash = p->p
7600: 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c  Hash;.      whil
7610: 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e( p ){.        
7620: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
7630: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
7640: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
7650: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7660: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
7670: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
7680: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
7690: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c  .  }.  for(i=sql
76a0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
76b0: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20  ->aCollSeq); i; 
76c0: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
76d0: 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  (i)){.    CollSe
76e0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
76f0: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
7700: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20  Data(i);.    /* 
7710: 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72  Invoke any destr
7720: 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65  uctors registere
7730: 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20  d for collation 
7740: 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61  sequence user da
7750: 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ta. */.    for(j
7760: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
7770: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a       if( pColl[j
7780: 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ].xDel ){.      
7790: 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28    pColl[j].xDel(
77a0: 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b  pColl[j].pUser);
77b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
77c0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
77d0: 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, pColl);.  }
77e0: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
77f0: 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ear(&db->aCollSe
7800: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
7810: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7820: 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ABLE.  for(i=sql
7830: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
7840: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69  ->aModule); i; i
7850: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
7860: 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  i)){.    Module 
7870: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
7880: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
7890: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (i);.    if( pMo
78a0: 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  d->xDestroy ){. 
78b0: 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74       pMod->xDest
78c0: 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b  roy(pMod->pAux);
78d0: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
78e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f  e3DbFree(db, pMo
78f0: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
7900: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
7910: 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
7920: 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
7930: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
7940: 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  0); /* Deallocat
7950: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
7960: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
7970: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
7980: 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  ee(db->pErr);.  
7990: 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65  sqlite3CloseExte
79a0: 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64  nsions(db);..  d
79b0: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
79c0: 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a  E_MAGIC_ERROR;..
79d0: 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61    /* The temp-da
79e0: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73  tabase schema is
79f0: 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65   allocated diffe
7a00: 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rently from the 
7a10: 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a  other schema.  *
7a20: 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67  * objects (using
7a30: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
7a40: 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
7a50: 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  d of sqlite3Btre
7a60: 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a  eSchema())..  **
7a70: 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   So it needs to 
7a80: 62 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54  be freed here. T
7a90: 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c  odo: Why not rol
7aa0: 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d  l the temp schem
7ab0: 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  a into.  ** the 
7ac0: 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  same sqliteMallo
7ad0: 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74  c() as the one t
7ae0: 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68  hat allocates th
7af0: 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a  e database .  **
7b00: 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f   structure?.  */
7b10: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
7b20: 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  (db, db->aDb[1].
7b30: 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
7b40: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7b50: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
7b60: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
7b70: 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20  _MAGIC_CLOSED;. 
7b80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
7b90: 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ree(db->mutex);.
7ba0: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
7bb0: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20  okaside.nOut==0 
7bc0: 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20  );  /* Fails on 
7bd0: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  a lookaside memo
7be0: 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28  ry leak */.  if(
7bf0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
7c00: 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20  Malloced ){.    
7c10: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
7c20: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72  >lookaside.pStar
7c30: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
7c40: 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f  3_free(db);.}../
7c50: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
7c60: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  l database files
7c70: 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69  .  If tripCode i
7c80: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c  s not SQLITE_OK,
7c90: 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 6f 70 65   then.** any ope
7ca0: 6e 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  n cursors are in
7cb0: 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69 70  validated ("trip
7cc0: 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72  ped" - as in "tr
7cd0: 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69 74  ipping a circuit
7ce0: 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e  .** breaker") an
7cf0: 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e  d made to return
7d00: 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68 65   tripCode if the
7d10: 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74 68  re are any furth
7d20: 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  er.** attempts t
7d30: 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73 6f  o use that curso
7d40: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
7d50: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71  e3RollbackAll(sq
7d60: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 74  lite3 *db, int t
7d70: 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20  ripCode){.  int 
7d80: 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73  i;.  int inTrans
7d90: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
7da0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7db0: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
7dc0: 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
7dd0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
7de0: 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20    /* Obtain all 
7df0: 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 62  b-tree mutexes b
7e00: 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79  efore making any
7e10: 20 63 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52   calls to BtreeR
7e20: 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a  ollback(). .  **
7e30: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
7e40: 6e 74 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  nt in case the t
7e50: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
7e60: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73   rolled back has
7e70: 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74  .  ** modified t
7e80: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
7e90: 6d 61 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65  ma. If the b-tre
7ea0: 65 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f  e mutexes are no
7eb0: 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72  t taken.  ** her
7ec0: 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20  e, then another 
7ed0: 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e  shared-cache con
7ee0: 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e  nection might sn
7ef0: 65 61 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20  eak in between. 
7f00: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
7f10: 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63   rollback and sc
7f20: 68 65 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63  hema reset, whic
7f30: 68 20 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73  h can cause fals
7f40: 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f  e.  ** corruptio
7f50: 6e 20 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d  n reports in som
7f60: 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73  e cases.  */.  s
7f70: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
7f80: 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28  All(db);..  for(
7f90: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
7fa0: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
7fb0: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
7fc0: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29  pBt;.    if( p )
7fd0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
7fe0: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
7ff0: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s(p) ){.        
8000: 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20  inTrans = 1;.   
8010: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
8020: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
8030: 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20  p, tripCode);.  
8040: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
8050: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
8060: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
8070: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
8080: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
8090: 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
80a0: 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d  anges)!=0 && db-
80b0: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
80c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
80d0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
80e0: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71  ents(db);.    sq
80f0: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
8100: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
8110: 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
8120: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
8130: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20  (db);..  /* Any 
8140: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
8150: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68  int violations h
8160: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73  ave now been res
8170: 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e  olved. */.  db->
8180: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
8190: 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  0;.  db->nDeferr
81a0: 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
81b0: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
81c0: 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a  QLITE_DeferFKs;.
81d0: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73  .  /* If one has
81e0: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
81f0: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c  , invoke the rol
8200: 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62  lback-hook callb
8210: 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ack */.  if( db-
8220: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
8230: 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c  ck && (inTrans |
8240: 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  | !db->autoCommi
8250: 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52  t) ){.    db->xR
8260: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28  ollbackCallback(
8270: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
8280: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8290: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
82a0: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
82b0: 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65  g the name corre
82c0: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
82d0: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70  error code.** sp
82e0: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61  ecified in the a
82f0: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
8300: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
8310: 45 53 54 29 0a 63 6f 6e 73 74 20 63 68 61 72 20  EST).const char 
8320: 2a 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65 28  *sqlite3ErrName(
8330: 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74  int rc){.  const
8340: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30   char *zName = 0
8350: 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67 52  ;.  int i, origR
8360: 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d  c = rc;.  for(i=
8370: 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d  0; i<2 && zName=
8380: 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30  =0; i++, rc &= 0
8390: 78 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63 68  xff){.    switch
83a0: 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63 61  ( rc ){.      ca
83b0: 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20  se SQLITE_OK:   
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
83d0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b  ame = "SQLITE_OK
83e0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
83f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8400: 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  ase SQLITE_ERROR
8410: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  :              z
8420: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 45  Name = "SQLITE_E
8430: 52 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20 20  RROR";          
8440: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8450: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
8460: 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20 20  RNAL:           
8470: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8480: 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20 20  INTERNAL";      
8490: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
84a0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45 52   case SQLITE_PER
84b0: 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M:              
84c0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
84d0: 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20 20  _PERM";         
84e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
84f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42    case SQLITE_AB
8500: 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20 20  ORT:            
8510: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8520: 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20 20  E_ABORT";       
8530: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8540: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
8550: 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20  BORT_ROLLBACK:  
8560: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8570: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
8580: 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  K";    break;.  
8590: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
85a0: 42 55 53 59 3a 20 20 20 20 20 20 20 20 20 20 20  BUSY:           
85b0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
85c0: 49 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20 20  ITE_BUSY";      
85d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
85e0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
85f0: 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a 20  _BUSY_RECOVERY: 
8600: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8610: 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45  LITE_BUSY_RECOVE
8620: 52 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  RY";     break;.
8630: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8640: 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a  E_BUSY_SNAPSHOT:
8650: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8660: 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53  QLITE_BUSY_SNAPS
8670: 48 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  HOT";     break;
8680: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8690: 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20  TE_LOCKED:      
86a0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
86b0: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20  SQLITE_LOCKED"; 
86c0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
86d0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
86e0: 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45  ITE_LOCKED_SHARE
86f0: 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20  DCACHE: zName = 
8700: 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53  "SQLITE_LOCKED_S
8710: 48 41 52 45 44 43 41 43 48 45 22 3b 62 72 65 61  HAREDCACHE";brea
8720: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8730: 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20  LITE_NOMEM:     
8740: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8750: 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22 3b   "SQLITE_NOMEM";
8760: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
8770: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8780: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20  QLITE_READONLY: 
8790: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
87a0: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
87b0: 4c 59 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  LY";          br
87c0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
87d0: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f  SQLITE_READONLY_
87e0: 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65  RECOVERY:  zName
87f0: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
8800: 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 62  NLY_RECOVERY"; b
8810: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8820: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
8830: 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d  _CANTLOCK:  zNam
8840: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
8850: 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20  ONLY_CANTLOCK"; 
8860: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8870: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
8880: 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61  Y_ROLLBACK:  zNa
8890: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
88a0: 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b  DONLY_ROLLBACK";
88b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
88c0: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
88d0: 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a 4e  LY_DBMOVED:   zN
88e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
88f0: 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22 3b  ADONLY_DBMOVED";
8900: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8910: 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52  ase SQLITE_INTER
8920: 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 7a  RUPT:          z
8930: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8940: 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20 20 20  NTERRUPT";      
8950: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8960: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8970: 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R:              
8980: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8990: 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20 20  IOERR";         
89a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
89b0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
89c0: 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20 20  RR_READ:        
89d0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
89e0: 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20 20  _IOERR_READ";   
89f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8a00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8a10: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a 20  ERR_SHORT_READ: 
8a20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8a30: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
8a40: 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  AD";  break;.   
8a50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8a60: 4f 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20 20  OERR_WRITE:     
8a70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8a80: 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22 3b  TE_IOERR_WRITE";
8a90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8aa0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8ab0: 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20 20  IOERR_FSYNC:    
8ac0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8ad0: 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 22  ITE_IOERR_FSYNC"
8ae0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
8af0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8b00: 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
8b10: 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  :    zName = "SQ
8b20: 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46  LITE_IOERR_DIR_F
8b30: 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b 0a  SYNC";   break;.
8b40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8b50: 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
8b60: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
8b70: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e  QLITE_IOERR_TRUN
8b80: 43 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b 3b  CATE";    break;
8b90: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8ba0: 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a 20  TE_IOERR_FSTAT: 
8bb0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8bc0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54  SQLITE_IOERR_FST
8bd0: 41 54 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  AT";       break
8be0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8bf0: 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
8c00: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
8c10: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e  "SQLITE_IOERR_UN
8c20: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65 61  LOCK";      brea
8c30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8c40: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f 43  LITE_IOERR_RDLOC
8c50: 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  K:       zName =
8c60: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52   "SQLITE_IOERR_R
8c70: 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65  DLOCK";      bre
8c80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8c90: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
8ca0: 54 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  TE:       zName 
8cb0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8cc0: 44 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62 72  DELETE";      br
8cd0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8ce0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
8cf0: 43 4b 45 44 3a 20 20 20 20 20 20 7a 4e 61 6d 65  CKED:      zName
8d00: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8d10: 5f 42 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 62  _BLOCKED";     b
8d20: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8d30: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f   SQLITE_IOERR_NO
8d40: 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  MEM:        zNam
8d50: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8d60: 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  R_NOMEM";       
8d70: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8d80: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41  e SQLITE_IOERR_A
8d90: 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e 61  CCESS:       zNa
8da0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8db0: 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20 20  RR_ACCESS";     
8dc0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8dd0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8de0: 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43  CHECKRESERVEDLOC
8df0: 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K:.             
8e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8e10: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8e20: 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45  TE_IOERR_CHECKRE
8e30: 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72 65  SERVEDLOCK"; bre
8e40: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8e50: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
8e60: 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  :         zName 
8e70: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8e80: 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62 72  LOCK";        br
8e90: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8ea0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
8eb0: 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  SE:        zName
8ec0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8ed0: 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20 62  _CLOSE";       b
8ee0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8ef0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
8f00: 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61 6d  R_CLOSE:    zNam
8f10: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8f20: 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20 20  R_DIR_CLOSE";   
8f30: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8f40: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  e SQLITE_IOERR_S
8f50: 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e 61  HMOPEN:      zNa
8f60: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8f70: 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20 20  RR_SHMOPEN";    
8f80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8f90: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8fa0: 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a 4e  SHMSIZE:      zN
8fb0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8fc0: 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20 20  ERR_SHMSIZE";   
8fd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8fe0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8ff0: 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20 7a  _SHMLOCK:      z
9000: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
9010: 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20  OERR_SHMLOCK";  
9020: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9030: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
9040: 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20 20  R_SHMMAP:       
9050: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9060: 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20 20  IOERR_SHMMAP";  
9070: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9080: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
9090: 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20 20  RR_SEEK:        
90a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
90b0: 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20 20  _IOERR_SEEK";   
90c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
90d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
90e0: 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
90f0: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
9100: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e  E_IOERR_DELETE_N
9110: 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20 20  OENT";break;.   
9120: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
9130: 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20 20  OERR_MMAP:      
9140: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9150: 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b 20  TE_IOERR_MMAP"; 
9160: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9170: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9180: 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
9190: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
91a0: 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d  ITE_IOERR_GETTEM
91b0: 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  PPATH"; break;. 
91c0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
91d0: 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48 3a  _IOERR_CONVPATH:
91e0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
91f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50  LITE_IOERR_CONVP
9200: 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a  ATH";    break;.
9210: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9220: 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20 20  E_CORRUPT:      
9230: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9240: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b 20  QLITE_CORRUPT"; 
9250: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9260: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9270: 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 3a  TE_CORRUPT_VTAB:
9280: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9290: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56  SQLITE_CORRUPT_V
92a0: 54 41 42 22 3b 20 20 20 20 20 20 62 72 65 61 6b  TAB";      break
92b0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
92c0: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20 20  ITE_NOTFOUND:   
92d0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
92e0: 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44  "SQLITE_NOTFOUND
92f0: 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ";          brea
9300: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9310: 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20 20  LITE_FULL:      
9320: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9330: 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b 20   "SQLITE_FULL"; 
9340: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
9350: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9360: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a 20  QLITE_CANTOPEN: 
9370: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9380: 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  = "SQLITE_CANTOP
9390: 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  EN";          br
93a0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
93b0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
93c0: 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d 65  NOTEMPDIR: zName
93d0: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
93e0: 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b 62  PEN_NOTEMPDIR";b
93f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9400: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
9410: 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61 6d  _ISDIR:     zNam
9420: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
9430: 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20 20  OPEN_ISDIR";    
9440: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9450: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
9460: 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e 61  N_FULLPATH:  zNa
9470: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
9480: 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22 3b  TOPEN_FULLPATH";
9490: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
94a0: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
94b0: 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a 4e  EN_CONVPATH:  zN
94c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
94d0: 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 22  NTOPEN_CONVPATH"
94e0: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
94f0: 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f  ase SQLITE_PROTO
9500: 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a  COL:           z
9510: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50  Name = "SQLITE_P
9520: 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20 20  ROTOCOL";       
9530: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9540: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50 54  case SQLITE_EMPT
9550: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:              
9560: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9570: 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20 20  EMPTY";         
9580: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9590: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43 48   case SQLITE_SCH
95a0: 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20 20  EMA:            
95b0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
95c0: 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20 20  _SCHEMA";       
95d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
95e0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 4f    case SQLITE_TO
95f0: 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20 20 20  OBIG:           
9600: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9610: 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20 20  E_TOOBIG";      
9620: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9630: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
9640: 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20 20  ONSTRAINT:      
9650: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9660: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b 20  TE_CONSTRAINT"; 
9670: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9680: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9690: 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55  CONSTRAINT_UNIQU
96a0: 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  E:  zName = "SQL
96b0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55  ITE_CONSTRAINT_U
96c0: 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a 20  NIQUE"; break;. 
96d0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
96e0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47  _CONSTRAINT_TRIG
96f0: 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  GER: zName = "SQ
9700: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9710: 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b 0a  TRIGGER";break;.
9720: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9730: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52  E_CONSTRAINT_FOR
9740: 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20 20  EIGNKEY:.       
9750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9760: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9770: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
9780: 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22 3b  INT_FOREIGNKEY";
9790: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
97a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
97b0: 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20 20  TRAINT_CHECK:   
97c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
97d0: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b  CONSTRAINT_CHECK
97e0: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
97f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
9800: 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b  STRAINT_PRIMARYK
9810: 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  EY:.            
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9840: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50  ITE_CONSTRAINT_P
9850: 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62 72  RIMARYKEY";   br
9860: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9870: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9880: 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d 65  T_NOTNULL: zName
9890: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
98a0: 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b 62  RAINT_NOTNULL";b
98b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
98c0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
98d0: 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a 20  NT_COMMITHOOK:. 
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
9900: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9910: 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54  ONSTRAINT_COMMIT
9920: 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b 0a  HOOK";   break;.
9930: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9940: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41  E_CONSTRAINT_VTA
9950: 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  B:    zName = "S
9960: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9970: 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b 3b  _VTAB";   break;
9980: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9990: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55  TE_CONSTRAINT_FU
99a0: 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20 20  NCTION:.        
99b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99c0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
99d0: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
99e0: 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20 20  NT_FUNCTION";   
99f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9a00: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54  ase SQLITE_CONST
9a10: 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20 7a  RAINT_ROWID:   z
9a20: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9a30: 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 22  ONSTRAINT_ROWID"
9a40: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
9a50: 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53 4d  case SQLITE_MISM
9a60: 41 54 43 48 3a 20 20 20 20 20 20 20 20 20 20 20  ATCH:           
9a70: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9a80: 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20 20  MISMATCH";      
9a90: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9aa0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53   case SQLITE_MIS
9ab0: 55 53 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  USE:            
9ac0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9ad0: 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20 20  _MISUSE";       
9ae0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9af0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
9b00: 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20 20 20  LFS:            
9b10: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9b20: 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20 20  E_NOLFS";       
9b30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9b40: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
9b50: 55 54 48 3a 20 20 20 20 20 20 20 20 20 20 20 20  UTH:            
9b60: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9b70: 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20 20  TE_AUTH";       
9b80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9b90: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9ba0: 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20 20  FORMAT:         
9bb0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9bc0: 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20 20  ITE_FORMAT";    
9bd0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9be0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9bf0: 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20 20  _RANGE:         
9c00: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9c10: 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20 20  LITE_RANGE";    
9c20: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9c30: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9c40: 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20 20  E_NOTADB:       
9c50: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9c60: 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20 20  QLITE_NOTADB";  
9c70: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9c80: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9c90: 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20 20  TE_ROW:         
9ca0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9cb0: 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20 20  SQLITE_ROW";    
9cc0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9cd0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9ce0: 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20 20  ITE_NOTICE:     
9cf0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9d00: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22 3b  "SQLITE_NOTICE";
9d10: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9d20: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9d30: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
9d40: 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20 3d  VER_WAL: zName =
9d50: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f   "SQLITE_NOTICE_
9d60: 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72 65  RECOVER_WAL";bre
9d70: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9d80: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
9d90: 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a 20  OVER_ROLLBACK:. 
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
9dc0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
9dd0: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
9de0: 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  LLBACK"; break;.
9df0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9e00: 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20 20  E_WARNING:      
9e10: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9e20: 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b 20  QLITE_WARNING"; 
9e30: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9e40: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9e50: 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49  TE_WARNING_AUTOI
9e60: 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20 22  NDEX:  zName = "
9e70: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41  SQLITE_WARNING_A
9e80: 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61 6b  UTOINDEX"; break
9e90: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9ea0: 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20 20  ITE_DONE:       
9eb0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9ec0: 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20 20  "SQLITE_DONE";  
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9ee0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  k;.    }.  }.  i
9ef0: 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20  f( zName==0 ){. 
9f00: 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 7a     static char z
9f10: 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71 6c  Buf[50];.    sql
9f20: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
9f30: 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75 66  zeof(zBuf), zBuf
9f40: 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f 57  , "SQLITE_UNKNOW
9f50: 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29 3b  N(%d)", origRc);
9f60: 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42 75  .    zName = zBu
9f70: 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  f;.  }.  return 
9f80: 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66 0a  zName;.}.#endif.
9f90: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
9fa0: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74 68  static string th
9fb0: 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65  at describes the
9fc0: 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20 73   kind of error s
9fd0: 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 0a  pecified in the.
9fe0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
9ff0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
a000: 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72 63  te3ErrStr(int rc
a010: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
a020: 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61 4d  t char* const aM
a030: 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a 20  sg[] = {.    /* 
a040: 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20 20  SQLITE_OK       
a050: 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65 72     */ "not an er
a060: 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ror",.    /* SQL
a070: 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20 20  ITE_ERROR       
a080: 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65 72  */ "SQL logic er
a090: 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20 64  ror or missing d
a0a0: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
a0b0: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c   SQLITE_INTERNAL
a0c0: 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f 2a      */ 0,.    /*
a0d0: 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20 20   SQLITE_PERM    
a0e0: 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20 70      */ "access p
a0f0: 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65 64  ermission denied
a100: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a110: 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f 20  _ABORT       */ 
a120: 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65 73  "callback reques
a130: 74 65 64 20 71 75 65 72 79 20 61 62 6f 72 74 22  ted query abort"
a140: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a150: 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20 22  BUSY        */ "
a160: 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63 6b  database is lock
a170: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
a180: 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20 2a  TE_LOCKED      *
a190: 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62 6c  / "database tabl
a1a0: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
a1b0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45    /* SQLITE_NOME
a1c0: 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74 20  M       */ "out 
a1d0: 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20 20  of memory",.    
a1e0: 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  /* SQLITE_READON
a1f0: 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d 70  LY    */ "attemp
a200: 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65 61  t to write a rea
a210: 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22 2c  donly database",
a220: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49  .    /* SQLITE_I
a230: 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22 69  NTERRUPT   */ "i
a240: 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20 20  nterrupted",.   
a250: 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52 52   /* SQLITE_IOERR
a260: 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b 20         */ "disk 
a270: 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20 20  I/O error",.    
a280: 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  /* SQLITE_CORRUP
a290: 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61  T     */ "databa
a2a0: 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69 73  se disk image is
a2b0: 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20 20   malformed",.   
a2c0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f   /* SQLITE_NOTFO
a2d0: 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e 6f  UND    */ "unkno
a2e0: 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a 20  wn operation",. 
a2f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55 4c     /* SQLITE_FUL
a300: 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61 74  L        */ "dat
a310: 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69 73  abase or disk is
a320: 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20 53   full",.    /* S
a330: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20 20  QLITE_CANTOPEN  
a340: 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f 20    */ "unable to 
a350: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66 69  open database fi
a360: 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  le",.    /* SQLI
a370: 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20 2a  TE_PROTOCOL    *
a380: 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  / "locking proto
a390: 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  col",.    /* SQL
a3a0: 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20 20  ITE_EMPTY       
a3b0: 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61 69  */ "table contai
a3c0: 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20 20  ns no data",.   
a3d0: 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45 4d   /* SQLITE_SCHEM
a3e0: 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  A      */ "datab
a3f0: 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 63  ase schema has c
a400: 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a 20  hanged",.    /* 
a410: 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20 20  SQLITE_TOOBIG   
a420: 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f 72     */ "string or
a430: 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c 0a   blob too big",.
a440: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f      /* SQLITE_CO
a450: 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63 6f  NSTRAINT  */ "co
a460: 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64 22  nstraint failed"
a470: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a480: 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20 22  MISMATCH    */ "
a490: 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74 63  datatype mismatc
a4a0: 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  h",.    /* SQLIT
a4b0: 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a 2f  E_MISUSE      */
a4c0: 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69 6e   "library routin
a4d0: 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66 20  e called out of 
a4e0: 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20 2f  sequence",.    /
a4f0: 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20 20  * SQLITE_NOLFS  
a500: 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20 66       */ "large f
a510: 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20 64  ile support is d
a520: 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f 2a  isabled",.    /*
a530: 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20 20   SQLITE_AUTH    
a540: 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69 7a      */ "authoriz
a550: 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20  ation denied",. 
a560: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f 52     /* SQLITE_FOR
a570: 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75 78  MAT      */ "aux
a580: 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65 20  iliary database 
a590: 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a 20  format error",. 
a5a0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41 4e     /* SQLITE_RAN
a5b0: 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69 6e  GE       */ "bin
a5c0: 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64 65  d or column inde
a5d0: 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22 2c  x out of range",
a5e0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
a5f0: 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22 66  OTADB      */ "f
a600: 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65 64  ile is encrypted
a610: 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61 74   or is not a dat
a620: 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20 63  abase",.  };.  c
a630: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
a640: 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f 72  = "unknown error
a650: 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63 20  ";.  switch( rc 
a660: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
a670: 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43  TE_ABORT_ROLLBAC
a680: 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72 20  K: {.      zErr 
a690: 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f 20  = "abort due to 
a6a0: 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20 20  ROLLBACK";.     
a6b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a6c0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
a6d0: 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a 20     rc &= 0xff;. 
a6e0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
a6f0: 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41 72 72  rc>=0) && rc<Arr
a700: 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26 26 20  aySize(aMsg) && 
a710: 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a 20  aMsg[rc]!=0 ){. 
a720: 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 61 4d         zErr = aM
a730: 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d 0a  sg[rc];.      }.
a740: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a750: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a760: 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  zErr;.}../*.** T
a770: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70 6c  his routine impl
a780: 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63 61  ements a busy ca
a790: 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65 65  llback that slee
a7a0: 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a 20  ps and tries.** 
a7b0: 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74 69  again until a ti
a7c0: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20 72  meout value is r
a7d0: 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69 6d  eached.  The tim
a7e0: 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a 2a  eout value is.**
a7f0: 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d 62   an integer numb
a800: 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e  er of millisecon
a810: 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73 20  ds passed in as 
a820: 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72 67  the first.** arg
a830: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
a840: 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61 75   int sqliteDefau
a850: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28 0a  ltBusyCallback(.
a860: 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20 20   void *ptr,     
a870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
a880: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
a890: 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20 20   */. int count  
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a8b0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65 73   Number of times
a8c0: 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e 20   table has been 
a8d0: 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20 53  busy */.){.#if S
a8e0: 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c 20  QLITE_OS_WIN || 
a8f0: 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55 53  (defined(HAVE_US
a900: 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55 53  LEEP) && HAVE_US
a910: 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63 20 63  LEEP).  static c
a920: 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b 5d  onst u8 delays[]
a930: 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c 20   =.     { 1, 2, 
a940: 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20 32  5, 10, 15, 20, 2
a950: 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30 2c  5, 25,  25,  50,
a960: 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20 73    50, 100 };.  s
a970: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 74  tatic const u8 t
a980: 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20 7b  otals[] =.     {
a990: 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31 38   0, 1, 3,  8, 18
a9a0: 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31 30  , 33, 53, 78, 10
a9b0: 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32 38  3, 128, 178, 228
a9c0: 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44 45   };.# define NDE
a9d0: 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64 65  LAY ArraySize(de
a9e0: 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33 20  lays).  sqlite3 
a9f0: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
aa00: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
aa10: 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54 69  out = db->busyTi
aa20: 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65 6c  meout;.  int del
aa30: 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61 73  ay, prior;..  as
aa40: 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20 29  sert( count>=0 )
aa50: 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c 20  ;.  if( count < 
aa60: 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64 65  NDELAY ){.    de
aa70: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f 75  lay = delays[cou
aa80: 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20 3d  nt];.    prior =
aa90: 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b 0a   totals[count];.
aaa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65 6c    }else{.    del
aab0: 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45 4c  ay = delays[NDEL
aac0: 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f 72  AY-1];.    prior
aad0: 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41 59   = totals[NDELAY
aae0: 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f 75  -1] + delay*(cou
aaf0: 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b 0a  nt-(NDELAY-1));.
ab00: 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72 20    }.  if( prior 
ab10: 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f 75  + delay > timeou
ab20: 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d  t ){.    delay =
ab30: 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f 72   timeout - prior
ab40: 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79 3c  ;.    if( delay<
ab50: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
ab60: 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c   }.  sqlite3OsSl
ab70: 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64 65  eep(db->pVfs, de
ab80: 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65 74  lay*1000);.  ret
ab90: 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20 73  urn 1;.#else.  s
aba0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71  qlite3 *db = (sq
abb0: 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69  lite3 *)ptr;.  i
abc0: 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28 73  nt timeout = ((s
abd0: 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e 62  qlite3 *)ptr)->b
abe0: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 66  usyTimeout;.  if
abf0: 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30 30  ( (count+1)*1000
ac00: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
ac10: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
ac20: 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70    sqlite3OsSleep
ac30: 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30 30  (db->pVfs, 10000
ac40: 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b  00);.  return 1;
ac50: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
ac60: 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76 65   Invoke the give
ac70: 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e 0a  n busy handler..
ac80: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ac90: 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ne is called whe
aca0: 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20 66  n an operation f
acb0: 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f 63  ailed with a loc
acc0: 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72 6f  k..** If this ro
acd0: 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e 6f  utine returns no
ace0: 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
acf0: 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49 66   is retried.  If
ad00: 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20 30   it.** returns 0
ad10: 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  , the operation 
ad20: 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20 53  aborts with an S
ad30: 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72  QLITE_BUSY error
ad40: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
ad50: 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65  InvokeBusyHandle
ad60: 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70  r(BusyHandler *p
ad70: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
ad80: 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20 7c  f( NEVER(p==0) |
ad90: 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c 7c  | p->xFunc==0 ||
ada0: 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72 65   p->nBusy<0 ) re
adb0: 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 70  turn 0;.  rc = p
adc0: 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67 2c  ->xFunc(p->pArg,
add0: 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69 66   p->nBusy);.  if
ade0: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70  ( rc==0 ){.    p
adf0: 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20 20  ->nBusy = -1;.  
ae00: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e 42  }else{.    p->nB
ae10: 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74  usy++;.  }.  ret
ae20: 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a 2a  urn rc; .}../*.*
ae30: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
ae40: 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61 6c  ets the busy cal
ae50: 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c  lback for an Sql
ae60: 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  ite database to 
ae70: 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c  the.** given cal
ae80: 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77  lback function w
ae90: 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61 72  ith the given ar
aea0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
aeb0: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
aec0: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
aed0: 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75 73  db,.  int (*xBus
aee0: 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a 20  y)(void*,int),. 
aef0: 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20   void *pArg.){. 
af00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
af10: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
af20: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
af30: 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73 79  er.xFunc = xBusy
af40: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
af50: 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67 3b  ler.pArg = pArg;
af60: 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64 6c  .  db->busyHandl
af70: 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  er.nBusy = 0;.  
af80: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20  db->busyTimeout 
af90: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
afa0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
afb0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
afc0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
afd0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
afe0: 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42  T_PROGRESS_CALLB
aff0: 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ACK./*.** This r
b000: 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65 20  outine sets the 
b010: 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63  progress callbac
b020: 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65 20  k for an Sqlite 
b030: 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65 0a  database to the.
b040: 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61 63  ** given callbac
b050: 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  k function with 
b060: 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d 65  the given argume
b070: 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73 73  nt. The progress
b080: 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a 2a   callback will.*
b090: 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76 65  * be invoked eve
b0a0: 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73 2e  ry nOps opcodes.
b0b0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b0c0: 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c 65  _progress_handle
b0d0: 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  r(.  sqlite3 *db
b0e0: 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a 20  , .  int nOps,. 
b0f0: 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73 73   int (*xProgress
b100: 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f 69  )(void*), .  voi
b110: 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c  d *pArg.){.  sql
b120: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
b130: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
b140: 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20 20  f( nOps>0 ){.   
b150: 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d   db->xProgress =
b160: 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20 20   xProgress;.    
b170: 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73  db->nProgressOps
b180: 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f 70   = (unsigned)nOp
b190: 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  s;.    db->pProg
b1a0: 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b 0a  ressArg = pArg;.
b1b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62 2d    }else{.    db-
b1c0: 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  >xProgress = 0;.
b1d0: 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73      db->nProgres
b1e0: 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64 62  sOps = 0;.    db
b1f0: 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d  ->pProgressArg =
b200: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
b210: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
b220: 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e 64  ->mutex);.}.#end
b230: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  if.../*.** This 
b240: 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c 73  routine installs
b250: 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79 20   a default busy 
b260: 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61 69  handler that wai
b270: 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73 70  ts for the.** sp
b280: 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20 6f  ecified number o
b290: 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20 62  f milliseconds b
b2a0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20  efore returning 
b2b0: 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  0..*/.int sqlite
b2c0: 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 73  3_busy_timeout(s
b2d0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
b2e0: 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30 20  ms){.  if( ms>0 
b2f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  ){.    sqlite3_b
b300: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
b310: 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73  sqliteDefaultBus
b320: 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69 64  yCallback, (void
b330: 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e 62  *)db);.    db->b
b340: 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b  usyTimeout = ms;
b350: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71  .  }else{.    sq
b360: 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c  lite3_busy_handl
b370: 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  er(db, 0, 0);.  
b380: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
b390: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
b3a0: 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e 67  ause any pending
b3b0: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73 74   operation to st
b3c0: 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69 65  op at its earlie
b3d0: 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e 0a  st opportunity..
b3e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f  */.void sqlite3_
b3f0: 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74 65  interrupt(sqlite
b400: 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75 31  3 *db){.  db->u1
b410: 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20 3d  .isInterrupted =
b420: 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68   1;.}.../*.** Th
b430: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  is function is e
b440: 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65 20  xactly the same 
b450: 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  as sqlite3_creat
b460: 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65 78  e_function(), ex
b470: 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74 20  cept.** that it 
b480: 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20 62  is designed to b
b490: 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74 65  e called by inte
b4a0: 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20 64  rnal code. The d
b4b0: 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a 20  ifference is.** 
b4c0: 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f 63  that if a malloc
b4d0: 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c 69  () fails in sqli
b4e0: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
b4f0: 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72 20  ion(), an error 
b500: 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75 72  code.** is retur
b510: 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c 6c  ned and the mall
b520: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63 6c  ocFailed flag cl
b530: 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20 73  eared. .*/.int s
b540: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
b550: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
b560: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b570: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
b580: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
b590: 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55 73  enc,.  void *pUs
b5a0: 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20 28  erData,.  void (
b5b0: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
b5c0: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
b5d0: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
b5e0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
b5f0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
b600: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
b610: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
b620: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
b630: 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46 75  _context*),.  Fu
b640: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
b650: 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20 46  estructor.){.  F
b660: 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e 74  uncDef *p;.  int
b670: 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20 65 78   nName;.  int ex
b680: 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61 73 73  traFlags;..  ass
b690: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
b6a0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
b6b0: 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e  x) );.  if( zFun
b6c0: 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a  ctionName==0 ||.
b6d0: 20 20 20 20 20 20 28 78 46 75 6e 63 20 26 26 20        (xFunc && 
b6e0: 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70  (xFinal || xStep
b6f0: 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78  )) || .      (!x
b700: 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20  Func && (xFinal 
b710: 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20  && !xStep)) ||. 
b720: 20 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20       (!xFunc && 
b730: 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65  (!xFinal && xSte
b740: 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41  p)) ||.      (nA
b750: 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51  rg<-1 || nArg>SQ
b760: 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
b770: 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20  N_ARG) ||.      
b780: 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71  (255<(nName = sq
b790: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a  lite3Strlen30( z
b7a0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20  FunctionName))) 
b7b0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
b7c0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
b7d0: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
b7e0: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e   SQLITE_FUNC_CON
b7f0: 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f 44 45  STANT==SQLITE_DE
b800: 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b 0a 20  TERMINISTIC );. 
b810: 20 65 78 74 72 61 46 6c 61 67 73 20 3d 20 65 6e   extraFlags = en
b820: 63 20 26 20 20 53 51 4c 49 54 45 5f 44 45 54 45  c &  SQLITE_DETE
b830: 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65 6e 63  RMINISTIC;.  enc
b840: 20 26 3d 20 28 53 51 4c 49 54 45 5f 46 55 4e 43   &= (SQLITE_FUNC
b850: 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54 45 5f  _ENCMASK|SQLITE_
b860: 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64 65 66  ANY);.  .#ifndef
b870: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
b880: 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54  16.  /* If SQLIT
b890: 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69  E_UTF16 is speci
b8a0: 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f  fied as the enco
b8b0: 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73  ding type, trans
b8c0: 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74  form this.  ** t
b8d0: 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f  o one of SQLITE_
b8e0: 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54  UTF16LE or SQLIT
b8f0: 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20  E_UTF16BE using 
b900: 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  the.  ** SQLITE_
b910: 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72  UTF16NATIVE macr
b920: 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  o. SQLITE_UTF16 
b930: 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65  is not used inte
b940: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a  rnally..  **.  *
b950: 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20  * If SQLITE_ANY 
b960: 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64  is specified, ad
b970: 64 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73  d three versions
b980: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
b990: 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73  .  ** to the has
b9a0: 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20  h table..  */.  
b9b0: 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  if( enc==SQLITE_
b9c0: 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63  UTF16 ){.    enc
b9d0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
b9e0: 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69  ATIVE;.  }else i
b9f0: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41  f( enc==SQLITE_A
ba00: 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  NY ){.    int rc
ba10: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
ba20: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
ba30: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20   zFunctionName, 
ba40: 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46  nArg, SQLITE_UTF
ba50: 38 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a 20 20  8|extraFlags,.  
ba60: 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61         pUserData
ba70: 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20  , xFunc, xStep, 
ba80: 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63  xFinal, pDestruc
ba90: 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tor);.    if( rc
baa0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
bab0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
bac0: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
bad0: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
bae0: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  Arg, SQLITE_UTF1
baf0: 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a  6LE|extraFlags,.
bb00: 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44            pUserD
bb10: 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65  ata, xFunc, xSte
bb20: 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74  p, xFinal, pDest
bb30: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
bb40: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
bb50: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
bb60: 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
bb70: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
bb80: 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c  UTF16BE;.  }.#el
bb90: 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  se.  enc = SQLIT
bba0: 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20  E_UTF8;.#endif. 
bbb0: 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20   .  /* Check if 
bbc0: 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e 63  an existing func
bbd0: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f 76  tion is being ov
bbe0: 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c 65  erridden or dele
bbf0: 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a  ted. If so,.  **
bc00: 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61   and there are a
bc10: 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e 20  ctive VMs, then 
bc20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55  return SQLITE_BU
bc30: 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69 6f  SY. If a functio
bc40: 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  n.  ** is being 
bc50: 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65 74  overridden/delet
bc60: 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72 65  ed but there are
bc70: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
bc80: 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f  allow the.  ** o
bc90: 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74  peration to cont
bca0: 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69 64  inue but invalid
bcb0: 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69  ate all precompi
bcc0: 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  led statements..
bcd0: 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74    */.  p = sqlit
bce0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64  e3FindFunction(d
bcf0: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
bd00: 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28  , nName, nArg, (
bd10: 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66  u8)enc, 0);.  if
bd20: 28 20 70 20 26 26 20 28 70 2d 3e 66 75 6e 63 46  ( p && (p->funcF
bd30: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
bd40: 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65 6e 63  NC_ENCMASK)==enc
bd50: 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72   && p->nArg==nAr
bd60: 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  g ){.    if( db-
bd70: 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a  >nVdbeActive ){.
bd80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
bd90: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
bda0: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
bdb0: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
bdc0: 6f 64 69 66 79 20 75 73 65 72 2d 66 75 6e 63 74  odify user-funct
bdd0: 69 6f 6e 20 64 75 65 20 74 6f 20 61 63 74 69 76  ion due to activ
bde0: 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a  e statements");.
bdf0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 64        assert( !d
be00: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
be10: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
be20: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
be30: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
be40: 6c 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61  lite3ExpirePrepa
be50: 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62  redStatements(db
be60: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
be70: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
be80: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
be90: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
bea0: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
beb0: 20 31 29 3b 0a 20 20 61 73 73 65 72 74 28 70 20   1);.  assert(p 
bec0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
bed0: 6c 65 64 29 3b 0a 20 20 69 66 28 20 21 70 20 29  led);.  if( !p )
bee0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
bef0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a  ITE_NOMEM;.  }..
bf00: 20 20 2f 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72    /* If an older
bf10: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
bf20: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 61 20  function with a 
bf30: 63 6f 6e 66 69 67 75 72 65 64 20 64 65 73 74 72  configured destr
bf40: 75 63 74 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65  uctor is.  ** be
bf50: 69 6e 67 20 72 65 70 6c 61 63 65 64 20 69 6e 76  ing replaced inv
bf60: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
bf70: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 68 65 72 65  or function here
bf80: 2e 20 2a 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44  . */.  functionD
bf90: 65 73 74 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a  estroy(db, p);..
bfa0: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
bfb0: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
bfc0: 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ctor->nRef++;.  
bfd0: 7d 0a 20 20 70 2d 3e 70 44 65 73 74 72 75 63 74  }.  p->pDestruct
bfe0: 6f 72 20 3d 20 70 44 65 73 74 72 75 63 74 6f 72  or = pDestructor
bff0: 3b 0a 20 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73  ;.  p->funcFlags
c000: 20 3d 20 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73   = (p->funcFlags
c010: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45   & SQLITE_FUNC_E
c020: 4e 43 4d 41 53 4b 29 20 7c 20 65 78 74 72 61 46  NCMASK) | extraF
c030: 6c 61 67 73 3b 0a 20 20 74 65 73 74 63 61 73 65  lags;.  testcase
c040: 28 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26  ( p->funcFlags &
c050: 20 53 51 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e   SQLITE_DETERMIN
c060: 49 53 54 49 43 20 29 3b 0a 20 20 70 2d 3e 78 46  ISTIC );.  p->xF
c070: 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70  unc = xFunc;.  p
c080: 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65 70 3b  ->xStep = xStep;
c090: 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20  .  p->xFinalize 
c0a0: 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70  = xFinal;.  p->p
c0b0: 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65 72  UserData = pUser
c0c0: 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20  Data;.  p->nArg 
c0d0: 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20 72  = (u16)nArg;.  r
c0e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c0f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65  .}../*.** Create
c100: 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74 69   new user functi
c110: 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ons..*/.int sqli
c120: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
c130: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
c140: 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
c150: 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e   *zFunc,.  int n
c160: 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a  Arg,.  int enc,.
c170: 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69    void *p,.  voi
c180: 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74  d (*xFunc)(sqlit
c190: 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c  e3_context*,int,
c1a0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
c1b0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65  ),.  void (*xSte
c1c0: 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  p)(sqlite3_conte
c1d0: 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f  xt*,int,sqlite3_
c1e0: 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69  value **),.  voi
c1f0: 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69  d (*xFinal)(sqli
c200: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b  te3_context*).){
c210: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
c220: 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
c230: 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20  n_v2(db, zFunc, 
c240: 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46  nArg, enc, p, xF
c250: 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20 20  unc, xStep,.    
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69  xFinal, 0);.}..i
c290: 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
c2a0: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20  e_function_v2(. 
c2b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
c2c0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e  const char *zFun
c2d0: 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  c,.  int nArg,. 
c2e0: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
c2f0: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
c300: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
c310: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
c320: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
c330: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
c340: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
c350: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
c360: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  **),.  void (*xF
c370: 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f  inal)(sqlite3_co
c380: 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20  ntext*),.  void 
c390: 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69 64  (*xDestroy)(void
c3a0: 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   *).){.  int rc 
c3b0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
c3c0: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
c3d0: 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20 73 71   *pArg = 0;.  sq
c3e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
c3f0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
c400: 69 66 28 20 78 44 65 73 74 72 6f 79 20 29 7b 0a  if( xDestroy ){.
c410: 20 20 20 20 70 41 72 67 20 3d 20 28 46 75 6e 63      pArg = (Func
c420: 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73 71 6c  Destructor *)sql
c430: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
c440: 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63  (db, sizeof(Func
c450: 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20 20  Destructor));.  
c460: 20 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a 20    if( !pArg ){. 
c470: 20 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29       xDestroy(p)
c480: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 75 74  ;.      goto out
c490: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72 67  ;.    }.    pArg
c4a0: 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44 65  ->xDestroy = xDe
c4b0: 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d  stroy;.    pArg-
c4c0: 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b 0a  >pUserData = p;.
c4d0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
c4e0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
c4f0: 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e   zFunc, nArg, en
c500: 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74  c, p, xFunc, xSt
c510: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 41 72 67  ep, xFinal, pArg
c520: 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20 26 26  );.  if( pArg &&
c530: 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29   pArg->nRef==0 )
c540: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63  {.    assert( rc
c550: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
c560: 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a     xDestroy(p);.
c570: 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
c580: 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d  e(db, pArg);.  }
c590: 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73  .. out:.  rc = s
c5a0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
c5b0: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
c5c0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
c5d0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
c5e0: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
c5f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
c600: 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  16.int sqlite3_c
c610: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36  reate_function16
c620: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
c630: 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
c640: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20  FunctionName,.  
c650: 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20  int nArg,.  int 
c660: 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69 64  eTextRep,.  void
c670: 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46   *p,.  void (*xF
c680: 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  unc)(sqlite3_con
c690: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
c6a0: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
c6b0: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
c6c0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
c6d0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a  ,sqlite3_value**
c6e0: 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e  ),.  void (*xFin
c6f0: 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  al)(sqlite3_cont
c700: 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  ext*).){.  int r
c710: 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e 63  c;.  char *zFunc
c720: 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  8;.  sqlite3_mut
c730: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
c740: 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
c750: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
c760: 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73   );.  zFunc8 = s
c770: 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28 64  qlite3Utf16to8(d
c780: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
c790: 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54 46  , -1, SQLITE_UTF
c7a0: 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63 20  16NATIVE);.  rc 
c7b0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
c7c0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20  unc(db, zFunc8, 
c7d0: 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c 20  nArg, eTextRep, 
c7e0: 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  p, xFunc, xStep,
c7f0: 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71   xFinal,0);.  sq
c800: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
c810: 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20  zFunc8);.  rc = 
c820: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
c830: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
c840: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
c850: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
c860: 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a  rn rc;.}.#endif.
c870: 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20  ../*.** Declare 
c880: 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e 20  that a function 
c890: 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61  has been overloa
c8a0: 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61 6c  ded by a virtual
c8b0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   table..**.** If
c8c0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c   the function al
c8d0: 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73 20  ready exists as 
c8e0: 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c  a regular global
c8f0: 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a   function, then.
c900: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
c910: 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20  is a no-op.  If 
c920: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65  the function doe
c930: 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 65  s not exist, the
c940: 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65  n create.** a ne
c950: 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61 79  w one that alway
c960: 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d 74  s throws a run-t
c970: 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a  ime error.  .**.
c980: 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c 20  ** When virtual 
c990: 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f  tables intend to
c9a0: 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65 72   provide an over
c9b0: 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c  loaded function,
c9c0: 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20   they.** should 
c9d0: 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  call this routin
c9e0: 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  e to make sure t
c9f0: 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  he global functi
ca00: 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20  on exists..** A 
ca10: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
ca20: 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f 72  must exist in or
ca30: 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65 73  der for name res
ca40: 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a  olution to work.
ca50: 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a  ** properly..*/.
ca60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65 72  int sqlite3_over
ca70: 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20  load_function(. 
ca80: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
ca90: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
caa0: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b  e,.  int nArg.){
cab0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73  .  int nName = s
cac0: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
cad0: 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63 20  Name);.  int rc 
cae0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  = SQLITE_OK;.  s
caf0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
cb00: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
cb10: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e 64   if( sqlite3Find
cb20: 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61  Function(db, zNa
cb30: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
cb40: 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 29   SQLITE_UTF8, 0)
cb50: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
cb60: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
cb70: 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72  c(db, zName, nAr
cb80: 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a  g, SQLITE_UTF8,.
cb90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cba0: 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73 71             0, sq
cbb0: 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e 63  lite3InvalidFunc
cbc0: 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tion, 0, 0, 0);.
cbd0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
cbe0: 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
cbf0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
cc00: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
cc10: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
cc20: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
cc30: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f  ITE_OMIT_TRACE./
cc40: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
cc50: 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20  trace function. 
cc60: 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20 74   The pArg from t
cc70: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72 65  he previously re
cc80: 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a 2a  gistered trace.*
cc90: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20  * is returned.  
cca0: 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72  .**.** A NULL tr
ccb0: 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61  ace function mea
ccc0: 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63 69  ns that no traci
ccd0: 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e 20  ng is executes. 
cce0: 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74   A non-NULL.** t
ccf0: 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74 65  race is a pointe
cd00: 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20  r to a function 
cd10: 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20  that is invoked 
cd20: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
cd30: 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74  each.** SQL stat
cd40: 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ement..*/.void *
cd50: 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73 71  sqlite3_trace(sq
cd60: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
cd70: 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a 2c  (*xTrace)(void*,
cd80: 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76 6f  const char*), vo
cd90: 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69  id *pArg){.  voi
cda0: 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74  d *pOld;.  sqlit
cdb0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
cdc0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c  b->mutex);.  pOl
cdd0: 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41 72  d = db->pTraceAr
cde0: 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65 20  g;.  db->xTrace 
cdf0: 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e  = xTrace;.  db->
ce00: 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72 67  pTraceArg = pArg
ce10: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
ce20: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
ce30: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
ce40: 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  d;.}./*.** Regis
ce50: 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66 75  ter a profile fu
ce60: 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41 72  nction.  The pAr
ce70: 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76 69  g from the previ
ce80: 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65 64  ously registered
ce90: 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e   .** profile fun
cea0: 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e 65  ction is returne
ceb0: 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  d.  .**.** A NUL
cec0: 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  L profile functi
ced0: 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f  on means that no
cee0: 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65 78   profiling is ex
cef0: 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e  ecutes.  A non-N
cf00: 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69  ULL.** profile i
cf10: 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
cf20: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69   function that i
cf30: 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65  s invoked at the
cf40: 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a   conclusion of.*
cf50: 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  * each SQL state
cf60: 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75 6e  ment that is run
cf70: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
cf80: 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73 71  e3_profile(.  sq
cf90: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69  lite3 *db,.  voi
cfa0: 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f  d (*xProfile)(vo
cfb0: 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c  id*,const char*,
cfc0: 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a  sqlite_uint64),.
cfd0: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
cfe0: 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20    void *pOld;.  
cff0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
d000: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
d010: 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72    pOld = db->pPr
d020: 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e  ofileArg;.  db->
d030: 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66  xProfile = xProf
d040: 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66  ile;.  db->pProf
d050: 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ileArg = pArg;. 
d060: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d070: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d080: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
d090: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
d0a0: 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f  TE_OMIT_TRACE */
d0b0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
d0c0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62   a function to b
d0d0: 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61  e invoked when a
d0e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d   transaction com
d0f0: 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20  mits..** If the 
d100: 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e  invoked function
d110: 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72   returns non-zer
d120: 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d  o, then the comm
d130: 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20  it becomes a.** 
d140: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  rollback..*/.voi
d150: 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69  d *sqlite3_commi
d160: 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  t_hook(.  sqlite
d170: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
d180: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
d190: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
d1a0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
d1b0: 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f   (*xCallback)(vo
d1c0: 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69  id*),  /* Functi
d1d0: 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20  on to invoke on 
d1e0: 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20  each commit */. 
d1f0: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
d200: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
d210: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
d220: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
d230: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
d240: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d250: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
d260: 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69  Old = db->pCommi
d270: 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d  tArg;.  db->xCom
d280: 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  mitCallback = xC
d290: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
d2a0: 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72 67  CommitArg = pArg
d2b0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
d2c0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
d2d0: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c  x);.  return pOl
d2e0: 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  d;.}../*.** Regi
d2f0: 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20  ster a callback 
d300: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61  to be invoked ea
d310: 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69 73  ch time a row is
d320: 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73   updated,.** ins
d330: 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65 64  erted or deleted
d340: 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74 61   using this data
d350: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
d360: 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
d370: 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20  3_update_hook(. 
d380: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
d390: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
d3a0: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
d3b0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
d3c0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
d3d0: 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c  back)(void*,int,
d3e0: 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61  char const *,cha
d3f0: 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65  r const *,sqlite
d400: 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  _int64),.  void 
d410: 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20  *pArg           
d420: 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74       /* Argument
d430: 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   to the function
d440: 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70   */.){.  void *p
d450: 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Ret;.  sqlite3_m
d460: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
d470: 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20  utex);.  pRet = 
d480: 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b 0a  db->pUpdateArg;.
d490: 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61 6c    db->xUpdateCal
d4a0: 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63  lback = xCallbac
d4b0: 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74 65  k;.  db->pUpdate
d4c0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
d4d0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
d4e0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
d4f0: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
d500: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
d510: 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20   callback to be 
d520: 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d  invoked each tim
d530: 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  e a transaction 
d540: 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63  is rolled.** bac
d550: 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  k by this databa
d560: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
d570: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
d580: 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20  rollback_hook(. 
d590: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
d5a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
d5b0: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
d5c0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 2a   this database *
d5d0: 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c  /.  void (*xCall
d5e0: 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a  back)(void*), /*
d5f0: 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69   Callback functi
d600: 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41  on */.  void *pA
d610: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
d620: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
d630: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
d640: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
d650: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
d660: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
d670: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
d680: 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20  >pRollbackArg;. 
d690: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
d6a0: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
d6b0: 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62  ck;.  db->pRollb
d6c0: 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  ackArg = pArg;. 
d6d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d6e0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d6f0: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
d700: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
d710: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a  E_OMIT_WAL./*.**
d720: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61 6c   The sqlite3_wal
d730: 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b  _hook() callback
d740: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 73   registered by s
d750: 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
d760: 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20  heckpoint()..** 
d770: 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77  Invoke sqlite3_w
d780: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69 66  al_checkpoint if
d790: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 66   the number of f
d7a0: 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f 67  rames in the log
d7b0: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
d7c0: 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65 33  ter than sqlite3
d7d0: 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20 74 6f  .pWalArg cast to
d7e0: 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68 65   an integer (the
d7f0: 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72 65   value configure
d800: 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f  d by.** wal_auto
d810: 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a  checkpoint())..*
d820: 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57 61  / .int sqlite3Wa
d830: 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20  lDefaultHook(.  
d840: 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74  void *pClientDat
d850: 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65  a,     /* Argume
d860: 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  nt */.  sqlite3 
d870: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 2f  *db,           /
d880: 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  * Connection */.
d890: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
d8a0: 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b,       /* Data
d8b0: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  base */.  int nF
d8c0: 72 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20  rame            
d8d0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c 20   /* Size of WAL 
d8e0: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72 61  */.){.  if( nFra
d8f0: 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54  me>=SQLITE_PTR_T
d900: 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61 74  O_INT(pClientDat
d910: 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  a) ){.    sqlite
d920: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
d930: 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc();.    sqlite
d940: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
d950: 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73  (db, zDb);.    s
d960: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
d970: 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72  alloc();.  }.  r
d980: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
d990: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
d9a0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a  ITE_OMIT_WAL */.
d9b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65  ./*.** Configure
d9c0: 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f   an sqlite3_wal_
d9d0: 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20  hook() callback 
d9e0: 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  to automatically
d9f0: 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61   checkpoint.** a
da00: 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72 20   database after 
da10: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
da20: 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65 72  nsaction if ther
da30: 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a  e are nFrame or.
da40: 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20 69  ** more frames i
da50: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20  n the log file. 
da60: 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20  Passing zero or 
da70: 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65  a negative value
da80: 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d   as the.** nFram
da90: 65 20 70 61 72 61 6d 65 74 65 72 20 64 69 73 61  e parameter disa
daa0: 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20 63  bles automatic c
dab0: 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72  heckpoints entir
dac0: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ely..**.** The c
dad0: 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65 72  allback register
dae0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
daf0: 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e 79  ion replaces any
db00: 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62 61   existing callba
db10: 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65 64  ck.** registered
db20: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77   using sqlite3_w
db30: 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77  al_hook(). Likew
db40: 69 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e 67  ise, registering
db50: 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75   a callback.** u
db60: 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c  sing sqlite3_wal
db70: 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65 73  _hook() disables
db80: 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20 63   the automatic c
db90: 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e  heckpoint mechan
dba0: 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65  ism.** configure
dbb0: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
dbc0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
dbd0: 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b  e3_wal_autocheck
dbe0: 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64  point(sqlite3 *d
dbf0: 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a  b, int nFrame){.
dc00: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
dc10: 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f  IT_WAL.  UNUSED_
dc20: 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
dc30: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
dc40: 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65  R(nFrame);.#else
dc50: 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30 20  .  if( nFrame>0 
dc60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  ){.    sqlite3_w
dc70: 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69  al_hook(db, sqli
dc80: 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f  te3WalDefaultHoo
dc90: 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f  k, SQLITE_INT_TO
dca0: 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20  _PTR(nFrame));. 
dcb0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
dcc0: 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c  te3_wal_hook(db,
dcd0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64   0, 0);.  }.#end
dce0: 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  if.  return SQLI
dcf0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
dd00: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
dd10: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
dd20: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72  d each time a tr
dd30: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72 69  ansaction is wri
dd40: 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65  tten.** into the
dd50: 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67   write-ahead-log
dd60: 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61 73   by this databas
dd70: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
dd80: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 77  .void *sqlite3_w
dd90: 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  al_hook(.  sqlit
dda0: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
ddb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 74             /* At
ddc0: 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f  tach the hook to
ddd0: 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65 20   this db handle 
dde0: 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62  */.  int(*xCallb
ddf0: 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c  ack)(void *, sql
de00: 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61  ite3*, const cha
de10: 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64  r*, int),.  void
de20: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
de30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
de40: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70 61  irst argument pa
de50: 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61 63  ssed to xCallbac
de60: 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65  k() */.){.#ifnde
de70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
de80: 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a  L.  void *pRet;.
de90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
dea0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
deb0: 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70  ;.  pRet = db->p
dec0: 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57  WalArg;.  db->xW
ded0: 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  alCallback = xCa
dee0: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57  llback;.  db->pW
def0: 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20  alArg = pArg;.  
df00: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
df10: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
df20: 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 23    return pRet;.#
df30: 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30 3b  else.  return 0;
df40: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
df50: 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61   Checkpoint data
df60: 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74  base zDb..*/.int
df70: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65   sqlite3_wal_che
df80: 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71  ckpoint_v2(.  sq
df90: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
dfa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dfb0: 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   Database handle
dfc0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
dfd0: 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20 20   *zDb,          
dfe0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
dff0: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
e000: 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a  se (or NULL) */.
e010: 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20    int eMode,    
e020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e030: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43    /* SQLITE_CHEC
e040: 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a  KPOINT_* value *
e050: 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20  /.  int *pnLog, 
e060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e070: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65      /* OUT: Size
e080: 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66   of WAL log in f
e090: 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  rames */.  int *
e0a0: 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20 20  pnCkpt          
e0b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
e0c0: 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  T: Total number 
e0d0: 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b 70  of frames checkp
e0e0: 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66  ointed */.){.#if
e0f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
e100: 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  WAL.  return SQL
e110: 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20  ITE_OK;.#else.  
e120: 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
e130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e140: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
e150: 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53 51  /.  int iDb = SQ
e160: 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
e170: 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61  D;  /* sqlite3.a
e180: 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64 62  Db[] index of db
e190: 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a   to checkpoint *
e1a0: 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  /..  /* Initiali
e1b0: 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  ze the output va
e1c0: 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e  riables to -1 in
e1d0: 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
e1e0: 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20  ccurs. */.  if( 
e1f0: 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d  pnLog ) *pnLog =
e200: 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70   -1;.  if( pnCkp
e210: 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31  t ) *pnCkpt = -1
e220: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  ;..  assert( SQL
e230: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46  ITE_CHECKPOINT_F
e240: 55 4c 4c 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b  ULL>SQLITE_CHECK
e250: 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 29 3b  POINT_PASSIVE );
e260: 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
e270: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c  E_CHECKPOINT_FUL
e280: 4c 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  L<SQLITE_CHECKPO
e290: 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a 20  INT_RESTART );. 
e2a0: 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
e2b0: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
e2c0: 56 45 2b 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45  VE+2==SQLITE_CHE
e2d0: 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20  CKPOINT_RESTART 
e2e0: 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c 53  );.  if( eMode<S
e2f0: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e300: 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64  _PASSIVE || eMod
e310: 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  e>SQLITE_CHECKPO
e320: 49 4e 54 5f 52 45 53 54 41 52 54 20 29 7b 0a 20  INT_RESTART ){. 
e330: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
e340: 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20  _MISUSE;.  }..  
e350: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
e360: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
e370: 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44 62    if( zDb && zDb
e380: 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20 3d  [0] ){.    iDb =
e390: 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e 61   sqlite3FindDbNa
e3a0: 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d  me(db, zDb);.  }
e3b0: 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b 0a  .  if( iDb<0 ){.
e3c0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
e3d0: 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74  ERROR;.    sqlit
e3e0: 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
e3f0: 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f  TE_ERROR, "unkno
e400: 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22  wn database: %s"
e410: 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  , zDb);.  }else{
e420: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e430: 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  3Checkpoint(db, 
e440: 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  iDb, eMode, pnLo
e450: 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
e460: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
e470: 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72   rc, 0);.  }.  r
e480: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
e490: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
e4a0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
e4b0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
e4c0: 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69  return rc;.#endi
e4d0: 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  f.}.../*.** Chec
e4e0: 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20  kpoint database 
e4f0: 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20 4e  zDb. If zDb is N
e500: 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20 62  ULL, or if the b
e510: 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74 73  uffer zDb points
e520: 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20  .** to contains 
e530: 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74  a zero-length st
e540: 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63 68  ring, all attach
e550: 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65  ed databases are
e560: 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65   .** checkpointe
e570: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
e580: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
e590: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
e5a0: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a  nst char *zDb){.
e5b0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
e5c0: 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f  _wal_checkpoint_
e5d0: 76 32 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49  v2(db, zDb, SQLI
e5e0: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
e5f0: 53 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a  SSIVE, 0, 0);.}.
e600: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
e610: 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52  OMIT_WAL./*.** R
e620: 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  un a checkpoint 
e630: 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62 2e  on database iDb.
e640: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
e650: 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44 62   if database iDb
e660: 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65   is.** not curre
e670: 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c  ntly open in WAL
e680: 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   mode..**.** If 
e690: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
e6a0: 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
e6b0: 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65 63  abase being chec
e6c0: 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20 0a  kpointed, this .
e6d0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  ** function retu
e6e0: 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rns SQLITE_LOCKE
e6f0: 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f 69  D and a checkpoi
e700: 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70  nt is not attemp
e710: 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65  ted. If .** an e
e720: 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
e730: 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63 68  e running the ch
e740: 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c  eckpoint, an SQL
e750: 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
e760: 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 28  s .** returned (
e770: 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52  i.e. SQLITE_IOER
e780: 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  R). Otherwise, S
e790: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20  QLITE_OK..**.** 
e7a0: 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  The mutex on dat
e7b0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 20  abase handle db 
e7c0: 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20 62  should be held b
e7d0: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68  y the caller. Th
e7e0: 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63  e mutex.** assoc
e7f0: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20 73  iated with the s
e800: 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20 62  pecific b-tree b
e810: 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
e820: 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a  d is taken by.**
e830: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   this function w
e840: 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70 6f  hile the checkpo
e850: 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a  int is running..
e860: 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73 20  **.** If iDb is 
e870: 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d 41  passed SQLITE_MA
e880: 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65 6e  X_ATTACHED, then
e890: 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61   all attached da
e8a0: 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20 63  tabases are.** c
e8b0: 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20  heckpointed. If 
e8c0: 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
e8d0: 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72 65  untered it is re
e8e0: 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74 65  turned immediate
e8f0: 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d  ly -.** no attem
e900: 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63 68  pt is made to ch
e910: 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d  eckpoint any rem
e920: 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65 73  aining databases
e930: 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ..**.** Paramete
e940: 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f  r eMode is one o
e950: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  f SQLITE_CHECKPO
e960: 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55 4c  INT_PASSIVE, FUL
e970: 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f  L or RESTART..*/
e980: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65 63  .int sqlite3Chec
e990: 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
e9a0: 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e 74  db, int iDb, int
e9b0: 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c   eMode, int *pnL
e9c0: 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29  og, int *pnCkpt)
e9d0: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
e9e0: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
e9f0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
ea00: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  de */.  int i;  
ea10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ea20: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
ea30: 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f 75  to iterate throu
ea40: 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73 20  gh attached dbs 
ea50: 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20 3d  */.  int bBusy =
ea60: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
ea70: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
ea80: 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73 20  SQLITE_BUSY has 
ea90: 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64  been encountered
eaa0: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73   */..  assert( s
eab0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c  qlite3_mutex_hel
eac0: 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a  d(db->mutex) );.
ead0: 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f 67    assert( !pnLog
eae0: 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29   || *pnLog==-1 )
eaf0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 43  ;.  assert( !pnC
eb00: 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d  kpt || *pnCkpt==
eb10: 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30  -1 );..  for(i=0
eb20: 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72  ; i<db->nDb && r
eb30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b  c==SQLITE_OK; i+
eb40: 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d 69  +){.    if( i==i
eb50: 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54  Db || iDb==SQLIT
eb60: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
eb70: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
eb80: 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70 6f  ite3BtreeCheckpo
eb90: 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  int(db->aDb[i].p
eba0: 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67  Bt, eMode, pnLog
ebb0: 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20  , pnCkpt);.     
ebc0: 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20   pnLog = 0;.    
ebd0: 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20    pnCkpt = 0;.  
ebe0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ebf0: 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20  TE_BUSY ){.     
ec00: 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20 20     bBusy = 1;.  
ec10: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
ec20: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
ec30: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
ec40: 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  n (rc==SQLITE_OK
ec50: 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51 4c   && bBusy) ? SQL
ec60: 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d  ITE_BUSY : rc;.}
ec70: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
ec80: 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f  E_OMIT_WAL */../
ec90: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
eca0: 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65 20  on returns true 
ecb0: 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73  if main-memory s
ecc0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69 6e  hould be used in
ecd0: 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65  stead of.** a te
ece0: 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f 72  mporary file for
ecf0: 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65 72   transient pager
ed00: 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74 65   files and state
ed10: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a  ment journals..*
ed20: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
ed30: 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  rned depends on 
ed40: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62 2d  the value of db-
ed50: 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e  >temp_store (run
ed60: 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65  time.** paramete
ed70: 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  r) and the compi
ed80: 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f 66  le time value of
ed90: 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f   SQLITE_TEMP_STO
eda0: 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f  RE. The.** follo
edb0: 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63 72  wing table descr
edc0: 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69 6f  ibes the relatio
edd0: 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74 68  nship between th
ede0: 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a  ese two values.*
edf0: 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74  * and this funct
ee00: 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c 75  ions return valu
ee10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54  e..**.**   SQLIT
ee20: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20 20  E_TEMP_STORE    
ee30: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
ee40: 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20      Location of 
ee50: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
ee60: 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  se.**   --------
ee70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
ee80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20  ------------    
ee90: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
eea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
eeb0: 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20 20  **   0          
eec0: 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20 20             any  
eed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
eee0: 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
eef0: 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  0).**   1       
ef00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31 20                1 
ef10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef20: 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75   file      (retu
ef30: 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 0).**   1    
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef50: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
ef60: 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
ef70: 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20  eturn 1).**   1 
ef80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef90: 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20 20      0           
efa0: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
efb0: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
efc0: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
efd0: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
efe0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
eff0: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
f000: 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
f010: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
f020: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
f030: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
f040: 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20  ).**   2        
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f070: 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
f080: 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20 20  n 1).**   3     
f090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0a0: 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20  any             
f0b0: 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65     memory    (re
f0c0: 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73  turn 1).*/.int s
f0d0: 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f  qlite3TempInMemo
f0e0: 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65 33  ry(const sqlite3
f0f0: 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49 54   *db){.#if SQLIT
f100: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a  E_TEMP_STORE==1.
f110: 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
f120: 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a  emp_store==2 );.
f130: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
f140: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a  E_TEMP_STORE==2.
f150: 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e 74    return ( db->t
f160: 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a  emp_store!=1 );.
f170: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
f180: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a  E_TEMP_STORE==3.
f190: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64    return 1;.#end
f1a0: 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45  if.#if SQLITE_TE
f1b0: 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51  MP_STORE<1 || SQ
f1c0: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e  LITE_TEMP_STORE>
f1d0: 33 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  3.  return 0;.#e
f1e0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ndif.}../*.** Re
f1f0: 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64  turn UTF-8 encod
f200: 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
f210: 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
f220: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
f230: 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
f240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
f250: 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69 74  te3_errmsg(sqlit
f260: 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74  e3 *db){.  const
f270: 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20   char *z;.  if( 
f280: 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !db ){.    retur
f290: 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  n sqlite3ErrStr(
f2a0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
f2b0: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
f2c0: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
f2d0: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
f2e0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72  return sqlite3Er
f2f0: 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53 55  rStr(SQLITE_MISU
f300: 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20  SE_BKPT);.  }.  
f310: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f320: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
f330: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
f340: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
f350: 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28  = sqlite3ErrStr(
f360: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20  SQLITE_NOMEM);. 
f370: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73 74   }else{.    test
f380: 63 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d  case( db->pErr==
f390: 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68  0 );.    z = (ch
f3a0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
f3b0: 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29  e_text(db->pErr)
f3c0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64  ;.    assert( !d
f3d0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f3e0: 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
f3f0: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
f400: 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
f410: 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  rrCode);.    }. 
f420: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
f430: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
f440: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  ex);.  return z;
f450: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
f460: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
f470: 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31  .** Return UTF-1
f480: 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  6 encoded Englis
f490: 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
f4a0: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
f4b0: 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
f4c0: 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  or..*/.const voi
f4d0: 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  d *sqlite3_errms
f4e0: 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29  g16(sqlite3 *db)
f4f0: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
f500: 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20   u16 outOfMem[] 
f510: 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27  = {.    'o', 'u'
f520: 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c  , 't', ' ', 'o',
f530: 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20   'f', ' ', 'm', 
f540: 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27  'e', 'm', 'o', '
f550: 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a  r', 'y', 0.  };.
f560: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
f570: 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a  16 misuse[] = {.
f580: 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62      'l', 'i', 'b
f590: 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27  ', 'r', 'a', 'r'
f5a0: 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'y', ' ', .   
f5b0: 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20   'r', 'o', 'u', 
f5c0: 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27  't', 'i', 'n', '
f5d0: 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63  e', ' ', .    'c
f5e0: 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27  ', 'a', 'l', 'l'
f5f0: 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c  , 'e', 'd', ' ',
f600: 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20   .    'o', 'u', 
f610: 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  't', ' ', .    '
f620: 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20  o', 'f', ' ', . 
f630: 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27     's', 'e', 'q'
f640: 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c  , 'u', 'e', 'n',
f650: 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d   'c', 'e', 0.  }
f660: 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ;..  const void 
f670: 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
f680: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
f690: 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20  d *)outOfMem;.  
f6a0: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
f6b0: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
f6c0: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
f6d0: 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69  eturn (void *)mi
f6e0: 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  suse;.  }.  sqli
f6f0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
f700: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
f710: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
f720: 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76  ed ){.    z = (v
f730: 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a  oid *)outOfMem;.
f740: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d    }else{.    z =
f750: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
f760: 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b  ext16(db->pErr);
f770: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
f780: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
f790: 72 6f 72 28 64 62 2c 20 64 62 2d 3e 65 72 72 43  ror(db, db->errC
f7a0: 6f 64 65 2c 20 73 71 6c 69 74 65 33 45 72 72 53  ode, sqlite3ErrS
f7b0: 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 29  tr(db->errCode))
f7c0: 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  ;.      z = sqli
f7d0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36  te3_value_text16
f7e0: 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20  (db->pErr);.    
f7f0: 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f  }.    /* A mallo
f800: 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61 69  c() may have fai
f810: 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20 63  led within the c
f820: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76  all to sqlite3_v
f830: 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20  alue_text16().  
f840: 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74    ** above. If t
f850: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2c  his is the case,
f860: 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61   then the db->ma
f870: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
f880: 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20  needs to.    ** 
f890: 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72  be cleared befor
f8a0: 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20  e returning. Do 
f8b0: 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69  this directly, i
f8c0: 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20  nstead of via.  
f8d0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45    ** sqlite3ApiE
f8e0: 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20  xit(), to avoid 
f8f0: 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74 61  setting the data
f900: 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f  base handle erro
f910: 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a  r message..    *
f920: 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63  /.    db->malloc
f930: 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a  Failed = 0;.  }.
f940: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f950: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
f960: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
f970: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
f980: 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a  _OMIT_UTF16 */..
f990: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
f9a0: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72   most recent err
f9b0: 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65  or code generate
f9c0: 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72  d by an SQLite r
f9d0: 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20  outine. If NULL 
f9e0: 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  is.** passed to 
f9f0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77  this function, w
fa00: 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f  e assume a mallo
fa10: 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e  c() failed durin
fa20: 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  g sqlite3_open()
fa30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
fa40: 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33  _errcode(sqlite3
fa50: 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20   *db){.  if( db 
fa60: 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74  && !sqlite3Safet
fa70: 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64  yCheckSickOrOk(d
fa80: 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  b) ){.    return
fa90: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
faa0: 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  KPT;.  }.  if( !
fab0: 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  db || db->malloc
fac0: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65  Failed ){.    re
fad0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
fae0: 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  M;.  }.  return 
faf0: 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62  db->errCode & db
fb00: 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74  ->errMask;.}.int
fb10: 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
fb20: 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  d_errcode(sqlite
fb30: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
fb40: 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
fb50: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
fb60: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
fb70: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
fb80: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
fb90: 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !db || db->mallo
fba0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
fbb0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
fbc0: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
fbd0: 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a   db->errCode;.}.
fbe0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
fbf0: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
fc00: 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f  ribes the kind o
fc10: 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65  f error specifie
fc20: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75  d in the.** argu
fc30: 6d 65 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20  ment.  For now, 
fc40: 74 68 69 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c  this simply call
fc50: 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73  s the internal s
fc60: 71 6c 69 74 65 33 45 72 72 53 74 72 28 29 0a 2a  qlite3ErrStr().*
fc70: 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63  * function..*/.c
fc80: 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74  onst char *sqlit
fc90: 65 33 5f 65 72 72 73 74 72 28 69 6e 74 20 72 63  e3_errstr(int rc
fca0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
fcb0: 74 65 33 45 72 72 53 74 72 28 72 63 29 3b 0a 7d  te3ErrStr(rc);.}
fcc0: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61 6c 69 64 61  ../*.** Invalida
fcd0: 74 65 20 61 6c 6c 20 63 61 63 68 65 64 20 4b 65  te all cached Ke
fce0: 79 49 6e 66 6f 20 6f 62 6a 65 63 74 73 20 66 6f  yInfo objects fo
fcf0: 72 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  r database conne
fd00: 63 74 69 6f 6e 20 22 64 62 22 0a 2a 2f 0a 73 74  ction "db".*/.st
fd10: 61 74 69 63 20 76 6f 69 64 20 69 6e 76 61 6c 69  atic void invali
fd20: 64 61 74 65 43 61 63 68 65 64 4b 65 79 49 6e 66  dateCachedKeyInf
fd30: 6f 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  o(sqlite3 *db){.
fd40: 20 20 44 62 20 2a 70 44 62 3b 20 20 20 20 20 20    Db *pDb;      
fd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fd60: 20 41 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   A single databa
fd70: 73 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 3b  se */.  int iDb;
fd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fd90: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
fda0: 61 73 65 20 69 6e 64 65 78 20 6e 75 6d 62 65 72  ase index number
fdb0: 20 2a 2f 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a   */.  HashElem *
fdc0: 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k;              
fdd0: 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
fde0: 20 6f 76 65 72 20 74 61 62 6c 65 73 20 69 6e 20   over tables in 
fdf0: 70 44 62 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  pDb */.  Table *
fe00: 70 54 61 62 3b 20 20 20 20 20 20 20 20 20 20 20  pTab;           
fe10: 20 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20       /* A table 
fe20: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
fe30: 2a 2f 0a 20 20 49 6e 64 65 78 20 2a 70 49 64 78  */.  Index *pIdx
fe40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
fe50: 20 2f 2a 20 45 61 63 68 20 69 6e 64 65 78 20 2a   /* Each index *
fe60: 2f 0a 0a 20 20 66 6f 72 28 69 44 62 3d 30 2c 20  /..  for(iDb=0, 
fe70: 70 44 62 3d 64 62 2d 3e 61 44 62 3b 20 69 44 62  pDb=db->aDb; iDb
fe80: 3c 64 62 2d 3e 6e 44 62 3b 20 69 44 62 2b 2b 2c  <db->nDb; iDb++,
fe90: 20 70 44 62 2b 2b 29 7b 0a 20 20 20 20 69 66 28   pDb++){.    if(
fea0: 20 70 44 62 2d 3e 70 42 74 3d 3d 30 20 29 20 63   pDb->pBt==0 ) c
feb0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c  ontinue;.    sql
fec0: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 28 70  ite3BtreeEnter(p
fed0: 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 66 6f  Db->pBt);.    fo
fee0: 72 28 6b 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(k=sqliteHashFi
fef0: 72 73 74 28 26 70 44 62 2d 3e 70 53 63 68 65 6d  rst(&pDb->pSchem
ff00: 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 20 6b 3b  a->tblHash);  k;
ff10: 20 6b 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   k=sqliteHashNex
ff20: 74 28 6b 29 29 7b 0a 20 20 20 20 20 20 70 54 61  t(k)){.      pTa
ff30: 62 20 3d 20 28 54 61 62 6c 65 2a 29 73 71 6c 69  b = (Table*)sqli
ff40: 74 65 48 61 73 68 44 61 74 61 28 6b 29 3b 0a 20  teHashData(k);. 
ff50: 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d 70 54       for(pIdx=pT
ff60: 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49 64 78  ab->pIndex; pIdx
ff70: 3b 20 70 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65  ; pIdx=pIdx->pNe
ff80: 78 74 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  xt){.        if(
ff90: 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 20   pIdx->pKeyInfo 
ffa0: 26 26 20 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66  && pIdx->pKeyInf
ffb0: 6f 2d 3e 64 62 3d 3d 64 62 20 29 7b 0a 20 20 20  o->db==db ){.   
ffc0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4b 65         sqlite3Ke
ffd0: 79 49 6e 66 6f 55 6e 72 65 66 28 70 49 64 78 2d  yInfoUnref(pIdx-
ffe0: 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a 20 20 20 20  >pKeyInfo);.    
fff0: 20 20 20 20 20 20 70 49 64 78 2d 3e 70 4b 65 79        pIdx->pKey
10000 49 6e 66 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20  Info = 0;.      
10010 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10020 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  }.    sqlite3Btr
10030 65 65 4c 65 61 76 65 28 70 44 62 2d 3e 70 42 74  eeLeave(pDb->pBt
10040 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
10050 43 72 65 61 74 65 20 61 20 6e 65 77 20 63 6f 6c  Create a new col
10060 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20  lating function 
10070 66 6f 72 20 64 61 74 61 62 61 73 65 20 22 64 62  for database "db
10080 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69 73 20  ".  The name is 
10090 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74 68 65  zName.** and the
100a0 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65 6e 63   encoding is enc
100b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
100c0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
100d0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 0a  .  sqlite3* db,.
100e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
100f0 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63 2c 0a  ame, .  u8 enc,.
10100 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
10110 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
10120 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
10130 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
10140 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
10150 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
10160 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 3b   CollSeq *pColl;
10170 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20 20 69  .  int enc2;.  i
10180 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74  nt nName = sqlit
10190 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65  e3Strlen30(zName
101a0 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20  );.  .  assert( 
101b0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
101c0 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
101d0 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  ..  /* If SQLITE
101e0 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
101f0 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
10200 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
10210 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
10220 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
10230 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
10240 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
10250 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
10260 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
10270 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
10280 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
10290 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e  nally..  */.  en
102a0 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74  c2 = enc;.  test
102b0 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49  case( enc2==SQLI
102c0 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65  TE_UTF16 );.  te
102d0 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
102e0 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
102f0 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32  ED );.  if( enc2
10300 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c  ==SQLITE_UTF16 |
10310 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  | enc2==SQLITE_U
10320 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a  TF16_ALIGNED ){.
10330 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54      enc2 = SQLIT
10340 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
10350 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51   }.  if( enc2<SQ
10360 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63  LITE_UTF8 || enc
10370 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  2>SQLITE_UTF16BE
10380 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
10390 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
103a0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65  T;.  }..  /* Che
103b0 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20  ck if this call 
103c0 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72  is removing or r
103d0 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73  eplacing an exis
103e0 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a  ting collation .
103f0 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49    ** sequence. I
10400 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20  f so, and there 
10410 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20  are active VMs, 
10420 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20  return busy. If 
10430 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e  there.  ** are n
10440 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e  o active VMs, in
10450 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65  validate any pre
10460 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  -compiled statem
10470 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f  ents..  */.  pCo
10480 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
10490 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
104a0 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b  enc2, zName, 0);
104b0 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20  .  if( pColl && 
104c0 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20  pColl->xCmp ){. 
104d0 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65     if( db->nVdbe
104e0 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20  Active ){.      
104f0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
10500 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20   SQLITE_BUSY, . 
10510 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74         "unable t
10520 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20  o delete/modify 
10530 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
10540 63 65 20 64 75 65 20 74 6f 20 61 63 74 69 76 65  ce due to active
10550 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20   statements");. 
10560 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
10570 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 0a 20  TE_BUSY;.    }. 
10580 20 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65     sqlite3Expire
10590 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e  PreparedStatemen
105a0 74 73 28 64 62 29 3b 0a 20 20 20 20 69 6e 76 61  ts(db);.    inva
105b0 6c 69 64 61 74 65 43 61 63 68 65 64 4b 65 79 49  lidateCachedKeyI
105c0 6e 66 6f 28 64 62 29 3b 0a 0a 20 20 20 20 2f 2a  nfo(db);..    /*
105d0 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65   If collation se
105e0 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61 73  quence pColl was
105f0 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74 6c   created directl
10600 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a 20  y by a call to. 
10610 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63 72     ** sqlite3_cr
10620 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c 20  eate_collation, 
10630 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74 65  and not generate
10640 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  d by synthCollSe
10650 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e  q(),.    ** then
10660 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64 65   any copies made
10670 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65 71   by synthCollSeq
10680 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69 6e  () need to be in
10690 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20 2a  validated..    *
106a0 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69 6f  * Also, collatio
106b0 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20 43  n destructor - C
106c0 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d 20  ollSeq.xDel() - 
106d0 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65 65  function may nee
106e0 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20 63  d.    ** to be c
106f0 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a 20  alled..    */ . 
10700 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e 65     if( (pColl->e
10710 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54 46  nc & ~SQLITE_UTF
10720 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e 63  16_ALIGNED)==enc
10730 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  2 ){.      CollS
10740 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c 69  eq *aColl = sqli
10750 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
10760 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d 65  >aCollSeq, zName
10770 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , nName);.      
10780 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72  int j;.      for
10790 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
107a0 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  .        CollSeq
107b0 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b   *p = &aColl[j];
107c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
107d0 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20  enc==pColl->enc 
107e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
107f0 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20   p->xDel ){.    
10800 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28          p->xDel(
10810 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20  p->pUser);.     
10820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10830 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20   p->xCmp = 0;.  
10840 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10850 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f      }.  }..  pCo
10860 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ll = sqlite3Find
10870 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29  CollSeq(db, (u8)
10880 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b  enc2, zName, 1);
10890 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20  .  if( pColl==0 
108a0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
108b0 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e  NOMEM;.  pColl->
108c0 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b  xCmp = xCompare;
108d0 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20  .  pColl->pUser 
108e0 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d  = pCtx;.  pColl-
108f0 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20  >xDel = xDel;.  
10900 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38  pColl->enc = (u8
10910 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20  )(enc2 | (enc & 
10920 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
10930 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65  GNED));.  sqlite
10940 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
10950 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74 75  E_OK, 0);.  retu
10960 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
10970 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72  ../*.** This arr
10980 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64 20  ay defines hard 
10990 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20  upper bounds on 
109a0 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54  limit values.  T
109b0 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65  he.** initialize
109c0 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69  r must be kept i
109d0 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20  n sync with the 
109e0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a  SQLITE_LIMIT_*.*
109f0 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71  * #defines in sq
10a00 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74  lite3.h..*/.stat
10a10 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61  ic const int aHa
10a20 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20  rdLimit[] = {.  
10a30 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
10a40 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
10a50 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  SQL_LENGTH,.  SQ
10a60 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c  LITE_MAX_COLUMN,
10a70 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  .  SQLITE_MAX_EX
10a80 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49  PR_DEPTH,.  SQLI
10a90 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f  TE_MAX_COMPOUND_
10aa0 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45  SELECT,.  SQLITE
10ab0 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20  _MAX_VDBE_OP,.  
10ac0 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
10ad0 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54  ION_ARG,.  SQLIT
10ae0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a  E_MAX_ATTACHED,.
10af0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b    SQLITE_MAX_LIK
10b00 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
10b10 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ,.  SQLITE_MAX_V
10b20 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 0a  ARIABLE_NUMBER,.
10b30 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49    SQLITE_MAX_TRI
10b40 47 47 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a 0a  GGER_DEPTH,.};..
10b50 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
10b60 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73 20  the hard limits 
10b70 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73 6f  are set to reaso
10b80 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f 0a  nable values.*/.
10b90 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  #if SQLITE_MAX_L
10ba0 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f  ENGTH<100.# erro
10bb0 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  r SQLITE_MAX_LEN
10bc0 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  GTH must be at l
10bd0 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a  east 100.#endif.
10be0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  #if SQLITE_MAX_S
10bf0 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20  QL_LENGTH<100.# 
10c00 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
10c10 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
10c20 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30 30   be at least 100
10c30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
10c40 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
10c50 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e  H>SQLITE_MAX_LEN
10c60 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  GTH.# error SQLI
10c70 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
10c80 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67 72  H must not be gr
10c90 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49 54  eater than SQLIT
10ca0 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65 6e  E_MAX_LENGTH.#en
10cb0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
10cc0 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45  AX_COMPOUND_SELE
10cd0 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51 4c  CT<2.# error SQL
10ce0 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
10cf0 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65 20  _SELECT must be 
10d00 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64 69  at least 2.#endi
10d10 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10d20 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65 72  _VDBE_OP<40.# er
10d30 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56  ror SQLITE_MAX_V
10d40 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20 61  DBE_OP must be a
10d50 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64 69  t least 40.#endi
10d60 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10d70 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30 20  _FUNCTION_ARG<0 
10d80 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  || SQLITE_MAX_FU
10d90 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30 0a  NCTION_ARG>1000.
10da0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
10db0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20  AX_FUNCTION_ARG 
10dc0 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20  must be between 
10dd0 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64 69  0 and 1000.#endi
10de0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10df0 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20 53  _ATTACHED<0 || S
10e00 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
10e10 45 44 3e 36 32 0a 23 20 65 72 72 6f 72 20 53 51  ED>62.# error SQ
10e20 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45  LITE_MAX_ATTACHE
10e30 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65  D must be betwee
10e40 6e 20 30 20 61 6e 64 20 36 32 0a 23 65 6e 64 69  n 0 and 62.#endi
10e50 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10e60 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45  _LIKE_PATTERN_LE
10e70 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53  NGTH<1.# error S
10e80 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
10e90 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d 75  ATTERN_LENGTH mu
10ea0 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
10eb0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
10ec0 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32  TE_MAX_COLUMN>32
10ed0 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  767.# error SQLI
10ee0 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75  TE_MAX_COLUMN mu
10ef0 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33 32  st not exceed 32
10f00 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  767.#endif.#if S
10f10 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
10f20 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72 6f  R_DEPTH<1.# erro
10f30 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49  r SQLITE_MAX_TRI
10f40 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74 20  GGER_DEPTH must 
10f50 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65  be at least 1.#e
10f60 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  ndif.../*.** Cha
10f70 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  nge the value of
10f80 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72   a limit.  Repor
10f90 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e  t the old value.
10fa0 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69  .** If an invali
10fb0 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73  d limit index is
10fc0 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72   supplied, repor
10fd0 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  t -1..** Make no
10fe0 20 63 68 61 6e 67 65 73 20 62 75 74 20 73 74 69   changes but sti
10ff0 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c  ll report the ol
11000 64 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a  d value if the.*
11010 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e  * new limit is n
11020 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41  egative..**.** A
11030 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74   new lower limit
11040 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b   does not shrink
11050 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72   existing constr
11060 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65  ucts..** It mere
11070 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20  ly prevents new 
11080 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74 20  constructs that 
11090 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74  exceed the limit
110a0 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67  .** from forming
110b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
110c0 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a  _limit(sqlite3 *
110d0 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c  db, int limitId,
110e0 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a   int newLimit){.
110f0 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a    int oldLimit;.
11100 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d  ..  /* EVIDENCE-
11110 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39  OF: R-30189-5409
11120 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74  7 For each limit
11130 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45   category SQLITE
11140 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a  _LIMIT_NAME.  **
11150 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72 64   there is a hard
11160 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74   upper bound set
11170 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
11180 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63 65   by a C preproce
11190 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20  ssor.  ** macro 
111a0 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41  called SQLITE_MA
111b0 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c  X_NAME. (The "_L
111c0 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61  IMIT_" in the na
111d0 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  me is changed to
111e0 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a  .  ** "_MAX_".).
111f0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61    */.  assert( a
11200 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
11210 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d  _LIMIT_LENGTH]==
11220 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
11230 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
11240 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
11250 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54  _LIMIT_SQL_LENGT
11260 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53  H]==SQLITE_MAX_S
11270 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61  QL_LENGTH );.  a
11280 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
11290 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43  t[SQLITE_LIMIT_C
112a0 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d  OLUMN]==SQLITE_M
112b0 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61  AX_COLUMN );.  a
112c0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
112d0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45  t[SQLITE_LIMIT_E
112e0 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49  XPR_DEPTH]==SQLI
112f0 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
11300 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  H );.  assert( a
11310 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
11320 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f  _LIMIT_COMPOUND_
11330 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f  SELECT]==SQLITE_
11340 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
11350 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ECT);.  assert( 
11360 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
11370 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d  E_LIMIT_VDBE_OP]
11380 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42  ==SQLITE_MAX_VDB
11390 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74  E_OP );.  assert
113a0 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
113b0 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49  ITE_LIMIT_FUNCTI
113c0 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f  ON_ARG]==SQLITE_
113d0 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
113e0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48   );.  assert( aH
113f0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
11400 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d  LIMIT_ATTACHED]=
11410 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41  =SQLITE_MAX_ATTA
11420 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  CHED );.  assert
11430 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
11440 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50  ITE_LIMIT_LIKE_P
11450 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d  ATTERN_LENGTH]==
11460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11490 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
114a0 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29  PATTERN_LENGTH )
114b0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
114c0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
114d0 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MIT_VARIABLE_NUM
114e0 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  BER]==SQLITE_MAX
114f0 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
11500 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
11510 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
11520 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50  IMIT_TRIGGER_DEP
11530 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
11540 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b  TRIGGER_DEPTH );
11550 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
11560 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
11570 44 45 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f 4e  DEPTH==(SQLITE_N
11580 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20  _LIMIT-1) );... 
11590 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c   if( limitId<0 |
115a0 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54  | limitId>=SQLIT
115b0 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20  E_N_LIMIT ){.   
115c0 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a   return -1;.  }.
115d0 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d    oldLimit = db-
115e0 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
115f0 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74  ;.  if( newLimit
11600 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20  >=0 ){          
11610 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a           /* IMP:
11620 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a   R-52476-28732 *
11630 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d  /.    if( newLim
11640 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69  it>aHardLimit[li
11650 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20  mitId] ){.      
11660 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64  newLimit = aHard
11670 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20  Limit[limitId]; 
11680 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33   /* IMP: R-51463
11690 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a  -25634 */.    }.
116a0 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c      db->aLimit[l
116b0 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d  imitId] = newLim
116c0 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  it;.  }.  return
116d0 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20   oldLimit;      
116e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
116f0 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33  * IMP: R-53341-3
11700 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a  5419 */.}../*.**
11710 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
11720 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20  s used to parse 
11730 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f  both URIs and no
11740 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20  n-URI filenames 
11750 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a  passed by the.**
11760 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e   user to API fun
11770 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f  ctions sqlite3_o
11780 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33  pen() or sqlite3
11790 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20  _open_v2(), and 
117a0 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  for database.** 
117b0 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61  URIs specified a
117c0 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48  s part of ATTACH
117d0 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
117e0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67  ** The first arg
117f0 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
11800 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61  nction is the na
11810 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
11820 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55   use (or.** a NU
11830 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68  LL to signify th
11840 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69  e default VFS) i
11850 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e  f the URI does n
11860 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66  ot contain a "vf
11870 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20  s=xxx".** query 
11880 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73  parameter. The s
11890 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63  econd argument c
118a0 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20  ontains the URI 
118b0 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65  (or non-URI file
118c0 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e  name).** itself.
118d0 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   When this funct
118e0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68  ion is called th
118f0 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62  e *pFlags variab
11900 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69  le should contai
11910 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74  n.** the default
11920 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74   flags to open t
11930 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
11940 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c  le with. The val
11950 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20  ue stored in.** 
11960 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75  *pFlags may be u
11970 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65  pdated before re
11980 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55  turning if the U
11990 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74  RI filename cont
119a0 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d  ains .** "cache=
119b0 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78  xxx" or "mode=xx
119c0 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  x" query paramet
119d0 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ers..**.** If su
119e0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
119f0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
11a00 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70   In this case *p
11a10 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70  pVfs is set to p
11a20 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56  oint to.** the V
11a30 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  FS that should b
11a40 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74  e used to open t
11a50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
11a60 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74  . *pzFile is set
11a70 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20   to.** point to 
11a80 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
11a90 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ing the name of 
11aa0 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  the file to open
11ab0 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20  . It is the .** 
11ac0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
11ad0 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
11ae0 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20  eventually call 
11af0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74  sqlite3_free() t
11b00 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  o release.** thi
11b10 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20  s buffer..**.** 
11b20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
11b30 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69  rs, then an SQLi
11b40 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
11b50 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
11b60 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62  zErrMsg.** may b
11b70 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
11b80 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
11b90 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68  ining an English
11ba0 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20   language error 
11bb0 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20  .** message. It 
11bc0 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
11bd0 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c  ility of the cal
11be0 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
11bf0 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69  y release.** thi
11c00 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c  s buffer by call
11c10 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ing sqlite3_free
11c20 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ()..*/.int sqlit
11c30 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f  e3ParseUri(.  co
11c40 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75  nst char *zDefau
11c50 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a  ltVfs,        /*
11c60 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e   VFS to use if n
11c70 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72  o "vfs=xxx" quer
11c80 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f  y option */.  co
11c90 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20  nst char *zUri, 
11ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11cb0 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20   Nul-terminated 
11cc0 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a  URI to parse */.
11cd0 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a    unsigned int *
11ce0 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20  pFlags,         
11cf0 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c    /* IN/OUT: SQL
11d00 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61  ITE_OPEN_XXX fla
11d10 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  gs */.  sqlite3_
11d20 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20  vfs **ppVfs,    
11d30 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
11d40 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20  VFS to use */ . 
11d50 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20   char **pzFile, 
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d70 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d   /* OUT: Filenam
11d80 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55  e component of U
11d90 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  RI */.  char **p
11da0 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20  zErrMsg         
11db0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
11dc0 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69  Error message (i
11dd0 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  f rc!=SQLITE_OK)
11de0 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
11df0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75  = SQLITE_OK;.  u
11e00 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
11e10 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63  s = *pFlags;.  c
11e20 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20  onst char *zVfs 
11e30 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20  = zDefaultVfs;. 
11e40 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20   char *zFile;.  
11e50 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55  char c;.  int nU
11e60 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  ri = sqlite3Strl
11e70 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61  en30(zUri);..  a
11e80 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67  ssert( *pzErrMsg
11e90 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28  ==0 );..  if( ((
11ea0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
11eb0 50 45 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c 69  PEN_URI) || sqli
11ec0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
11ed0 62 4f 70 65 6e 55 72 69 29 20 0a 20 20 20 26 26  bOpenUri) .   &&
11ee0 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63   nUri>=5 && memc
11ef0 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22  mp(zUri, "file:"
11f00 2c 20 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20  , 5)==0 .  ){.  
11f10 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20    char *zOpt;.  
11f20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20    int eState;   
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f40 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20  /* Parser state 
11f50 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49  when parsing URI
11f60 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b   */.    int iIn;
11f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f80 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63        /* Input c
11f90 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
11fa0 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d  /.    int iOut =
11fb0 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
11fc0 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68      /* Output ch
11fd0 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
11fe0 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d  .    int nByte =
11ff0 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20   nUri+2;        
12000 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73     /* Bytes of s
12010 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  pace to allocate
12020 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65   */..    /* Make
12030 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45   sure the SQLITE
12040 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69  _OPEN_URI flag i
12050 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74  s set to indicat
12060 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70  e to the VFS xOp
12070 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f  en .    ** metho
12080 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79  d that there may
12090 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65   be extra parame
120a0 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ters following t
120b0 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a  he file-name.  *
120c0 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53  /.    flags |= S
120d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a  QLITE_OPEN_URI;.
120e0 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20  .    for(iIn=0; 
120f0 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29  iIn<nUri; iIn++)
12100 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b   nByte += (zUri[
12110 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20  iIn]=='&');.    
12120 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
12130 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20  malloc(nByte);. 
12140 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20     if( !zFile ) 
12150 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
12160 4d 45 4d 3b 0a 0a 20 20 20 20 69 49 6e 20 3d 20  MEM;..    iIn = 
12170 35 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  5;.#ifndef SQLIT
12180 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48  E_ALLOW_URI_AUTH
12190 4f 52 49 54 59 0a 20 20 20 20 2f 2a 20 44 69 73  ORITY.    /* Dis
121a0 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20  card the scheme 
121b0 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65  and authority se
121c0 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52  gments of the UR
121d0 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55  I. */.    if( zU
121e0 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55  ri[5]=='/' && zU
121f0 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20  ri[6]=='/' ){.  
12200 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
12210 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69     while( zUri[i
12220 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d  In] && zUri[iIn]
12230 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20  !='/' ) iIn++;. 
12240 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20       if( iIn!=7 
12250 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d  && (iIn!=16 || m
12260 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74  emcmp("localhost
12270 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29  ", &zUri[7], 9))
12280 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45   ){.        *pzE
12290 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
122a0 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64  mprintf("invalid
122b0 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20   uri authority: 
122c0 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20  %.*s", .        
122d0 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69      iIn-7, &zUri
122e0 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [7]);.        rc
122f0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
12300 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
12310 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
12320 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
12330 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74  f..    /* Copy t
12340 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20  he filename and 
12350 61 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d 65  any query parame
12360 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46  ters into the zF
12370 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20  ile buffer. .   
12380 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65   ** Decode %HH e
12390 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e  scape codes alon
123a0 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20  g the way. .    
123b0 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e  **.    ** Within
123c0 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69   this loop, vari
123d0 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20  able eState may 
123e0 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f  be set to 0, 1 o
123f0 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20  r 2, depending. 
12400 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72     ** on the par
12410 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73  sing context. As
12420 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a   follows:.    **
12430 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72  .    **   0: Par
12440 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a  sing file-name..
12450 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73      **   1: Pars
12460 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e  ing name section
12470 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65   of a name=value
12480 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
12490 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61  ..    **   2: Pa
124a0 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74  rsing value sect
124b0 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
124c0 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
124d0 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ter..    */.    
124e0 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20  eState = 0;.    
124f0 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69  while( (c = zUri
12500 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d  [iIn])!=0 && c!=
12510 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e  '#' ){.      iIn
12520 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ++;.      if( c=
12530 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26 26 20  ='%' .       && 
12540 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28  sqlite3Isxdigit(
12550 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20  zUri[iIn]) .    
12560 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78     && sqlite3Isx
12570 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31  digit(zUri[iIn+1
12580 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ]) .      ){.   
12590 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d       int octet =
125a0 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e   (sqlite3HexToIn
125b0 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c  t(zUri[iIn++]) <
125c0 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63  < 4);.        oc
125d0 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65  tet += sqlite3He
125e0 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b  xToInt(zUri[iIn+
125f0 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  +]);..        as
12600 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26  sert( octet>=0 &
12610 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20  & octet<256 );. 
12620 20 20 20 20 20 20 20 69 66 28 20 6f 63 74 65 74         if( octet
12630 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
12640 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
12650 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25  is taken when "%
12660 30 30 22 20 61 70 70 65 61 72 73 20 77 69 74 68  00" appears with
12670 69 6e 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74  in the URI. In t
12680 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  his.          **
12690 20 63 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20   case we ignore 
126a0 61 6c 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20  all text in the 
126b0 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
126c0 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20   path, name or. 
126d0 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75           ** valu
126e0 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e  e currently bein
126f0 67 20 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e  g parsed. So ign
12700 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ore the current 
12710 63 68 61 72 61 63 74 65 72 0a 20 20 20 20 20 20  character.      
12720 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20      ** and skip 
12730 74 6f 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c  to the next "?",
12740 20 22 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20   "=" or "&", as 
12750 61 70 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a  appropriate. */.
12760 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28            while(
12770 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29   (c = zUri[iIn])
12780 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20  !=0 && c!='#' . 
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
127a0 28 65 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21  (eState!=0 || c!
127b0 3d 27 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20  ='?').          
127c0 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d      && (eState!=
127d0 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20  1 || (c!='=' && 
127e0 63 21 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20  c!='&')).       
127f0 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
12800 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a  e!=2 || c!='&').
12810 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20            ){.   
12820 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a           iIn++;.
12830 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12840 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
12850 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12860 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20    c = octet;.   
12870 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74     }else if( eSt
12880 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26  ate==1 && (c=='&
12890 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a  ' || c=='=') ){.
128a0 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c          if( zFil
128b0 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a  e[iOut-1]==0 ){.
128c0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
128d0 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d  empty option nam
128e0 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f  e. Ignore this o
128f0 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72  ption altogether
12900 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77  . */.          w
12910 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20  hile( zUri[iIn] 
12920 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23  && zUri[iIn]!='#
12930 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d  ' && zUri[iIn-1]
12940 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20  !='&' ) iIn++;. 
12950 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
12960 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
12970 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20       if( c=='&' 
12980 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69  ){.          zFi
12990 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30  le[iOut++] = '\0
129a0 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ';.        }else
129b0 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61  {.          eSta
129c0 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  te = 2;.        
129d0 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b  }.        c = 0;
129e0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
129f0 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63   (eState==0 && c
12a00 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74  =='?') || (eStat
12a10 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20  e==2 && c=='&') 
12a20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30  ){.        c = 0
12a30 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65  ;.        eState
12a40 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
12a50 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
12a60 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20  ] = c;.    }.   
12a70 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29   if( eState==1 )
12a80 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
12a90 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65   '\0';.    zFile
12aa0 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
12ab0 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b  .    zFile[iOut+
12ac0 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20  +] = '\0';..    
12ad0 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 72  /* Check if ther
12ae0 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f  e were any optio
12af0 6e 73 20 73 70 65 63 69 66 69 65 64 20 74 68 61  ns specified tha
12b00 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65  t should be inte
12b10 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20  rpreted .    ** 
12b20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68  here. Options th
12b30 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65 74  at are interpret
12b40 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20  ed here include 
12b50 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20  "vfs" and those 
12b60 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72  that.    ** corr
12b70 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20  espond to flags 
12b80 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73 73  that may be pass
12b90 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65  ed to the sqlite
12ba0 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20  3_open_v2().    
12bb0 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20  ** method. */.  
12bc0 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b    zOpt = &zFile[
12bd0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12be0 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77  zFile)+1];.    w
12bf0 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b  hile( zOpt[0] ){
12c00 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20  .      int nOpt 
12c10 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
12c20 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63  0(zOpt);.      c
12c30 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70  har *zVal = &zOp
12c40 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20  t[nOpt+1];.     
12c50 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69   int nVal = sqli
12c60 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c  te3Strlen30(zVal
12c70 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f  );..      if( nO
12c80 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28  pt==3 && memcmp(
12c90 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d  "vfs", zOpt, 3)=
12ca0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56  =0 ){.        zV
12cb0 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20  fs = zVal;.     
12cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
12cd0 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
12ce0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
12cf0 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20  t char *z;.     
12d00 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20       int mode;. 
12d10 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20         } *aMode 
12d20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61  = 0;.        cha
12d30 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30  r *zModeType = 0
12d40 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61  ;.        int ma
12d50 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sk = 0;.        
12d60 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a  int limit = 0;..
12d70 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74          if( nOpt
12d80 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63  ==5 && memcmp("c
12d90 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d  ache", zOpt, 5)=
12da0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
12db0 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70  static struct Op
12dc0 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64  enMode aCacheMod
12dd0 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  e[] = {.        
12de0 20 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20      { "shared", 
12df0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
12e00 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20  REDCACHE },.    
12e10 20 20 20 20 20 20 20 20 7b 20 22 70 72 69 76 61          { "priva
12e20 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  te", SQLITE_OPEN
12e30 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c  _PRIVATECACHE },
12e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30  .            { 0
12e50 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20  , 0 }.          
12e60 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61  };..          ma
12e70 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  sk = SQLITE_OPEN
12e80 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c  _SHAREDCACHE|SQL
12e90 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
12ea0 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20  CACHE;.         
12eb0 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d   aMode = aCacheM
12ec0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  ode;.          l
12ed0 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20  imit = mask;.   
12ee0 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
12ef0 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20   = "cache";.    
12f00 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
12f10 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d  ( nOpt==4 && mem
12f20 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74  cmp("mode", zOpt
12f30 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , 4)==0 ){.     
12f40 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75       static stru
12f50 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65  ct OpenMode aOpe
12f60 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  nMode[] = {.    
12f70 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20          { "ro", 
12f80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
12f90 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20  DONLY },.       
12fa0 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51       { "rw",  SQ
12fb0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
12fc0 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20  ITE }, .        
12fd0 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c      { "rwc", SQL
12fe0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
12ff0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
13000 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20  _CREATE },.     
13010 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79         { "memory
13020 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  ", SQLITE_OPEN_M
13030 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20  EMORY },.       
13040 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20       { 0, 0 }.  
13050 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20          };..    
13060 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c        mask = SQL
13070 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
13080 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  Y | SQLITE_OPEN_
13090 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20 20  READWRITE.      
130a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
130b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
130c0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
130d0 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20  MEMORY;.        
130e0 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d    aMode = aOpenM
130f0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c  ode;.          l
13100 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c  imit = mask & fl
13110 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ags;.          z
13120 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63 65  ModeType = "acce
13130 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ss";.        }..
13140 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64          if( aMod
13150 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  e ){.          i
13160 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
13170 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20  int mode = 0;.  
13180 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
13190 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b   aMode[i].z; i++
131a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
131b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
131c0 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20  Mode[i].z;.     
131d0 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d         if( nVal=
131e0 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  =sqlite3Strlen30
131f0 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  (z) && 0==memcmp
13200 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20  (zVal, z, nVal) 
13210 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
13220 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d   mode = aMode[i]
13230 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20  .mode;.         
13240 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
13250 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13260 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13270 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20  if( mode==0 ){. 
13280 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
13290 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
132a0 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20  printf("no such 
132b0 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d  %s mode: %s", zM
132c0 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a  odeType, zVal);.
132d0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
132e0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
132f0 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20             goto 
13300 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20  parse_uri_out;. 
13310 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13320 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26       if( (mode &
13330 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45   ~SQLITE_OPEN_ME
13340 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20  MORY)>limit ){. 
13350 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72             *pzEr
13360 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
13370 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20  printf("%s mode 
13380 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22  not allowed: %s"
13390 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
133a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133b0 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
133c0 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20  ype, zVal);.    
133d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
133e0 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20  ITE_PERM;.      
133f0 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65        goto parse
13400 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20  _uri_out;.      
13410 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
13420 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26  flags = (flags &
13430 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a   ~mask) | mode;.
13440 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13450 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20  }..      zOpt = 
13460 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20  &zVal[nVal+1];. 
13470 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20     }..  }else{. 
13480 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74     zFile = sqlit
13490 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b 32  e3_malloc(nUri+2
134a0 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c  );.    if( !zFil
134b0 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  e ) return SQLIT
134c0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d  E_NOMEM;.    mem
134d0 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c  cpy(zFile, zUri,
134e0 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c   nUri);.    zFil
134f0 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a  e[nUri] = '\0';.
13500 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31      zFile[nUri+1
13510 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c  ] = '\0';.    fl
13520 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
13530 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20  PEN_URI;.  }..  
13540 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33  *ppVfs = sqlite3
13550 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b  _vfs_find(zVfs);
13560 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30  .  if( *ppVfs==0
13570 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73   ){.    *pzErrMs
13580 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
13590 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73  ntf("no such vfs
135a0 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20  : %s", zVfs);.  
135b0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
135c0 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f  ROR;.  }. parse_
135d0 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72  uri_out:.  if( r
135e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
135f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
13600 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69  (zFile);.    zFi
13610 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70  le = 0;.  }.  *p
13620 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20  Flags = flags;. 
13630 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65   *pzFile = zFile
13640 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
13650 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
13660 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77  utine does the w
13670 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61  ork of opening a
13680 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68   database on beh
13690 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65  alf of.** sqlite
136a0 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c  3_open() and sql
136b0 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54  ite3_open16(). T
136c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
136d0 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22  name "zFilename"
136e0 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65    .** is UTF-8 e
136f0 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ncoded..*/.stati
13700 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61  c int openDataba
13710 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  se(.  const char
13720 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20   *zFilename, /* 
13730 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
13740 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  e UTF-8 encoded 
13750 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70  */.  sqlite3 **p
13760 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f  pDb,        /* O
13770 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74  UT: Returned dat
13780 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a  abase handle */.
13790 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66    unsigned int f
137a0 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72  lags,    /* Oper
137b0 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f  ational flags */
137c0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
137d0 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  Vfs       /* Nam
137e0 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
137f0 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  use */.){.  sqli
13800 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
13810 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
13820 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68  tore allocated h
13830 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20  andle here */.  
13840 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
13850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13860 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
13870 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64  /.  int isThread
13880 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20 20  safe;           
13890 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
138a0 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65  threadsafe conne
138b0 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72  ctions */.  char
138c0 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20   *zOpen = 0;    
138d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
138e0 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74  ilename argument
138f0 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65   to pass to Btre
13900 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61  eOpen() */.  cha
13910 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20  r *zErrMsg = 0; 
13920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13930 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72  Error message fr
13940 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55  om sqlite3ParseU
13950 72 69 28 29 20 2a 2f 0a 0a 20 20 2a 70 70 44 62  ri() */..  *ppDb
13960 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
13970 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
13980 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
13990 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
139a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
139b0 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20  n rc;.#endif..  
139c0 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65  /* Only allow se
139d0 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69  nsible combinati
139e0 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74  ons of bits in t
139f0 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e  he flags argumen
13a00 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20  t.  .  ** Throw 
13a10 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20  an error if any 
13a20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e  non-sense combin
13a30 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20  ation is used.  
13a40 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f  If we.  ** do no
13a50 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20  t block illegal 
13a60 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72  combinations her
13a70 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67  e, it could trig
13a80 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  ger.  ** assert(
13a90 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20  ) statements in 
13aa0 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20  deeper layers.  
13ab0 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61  Sensible combina
13ac0 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a  tions.  ** are:.
13ad0 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53    **.  **  1:  S
13ae0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
13af0 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51  NLY.  **  2:  SQ
13b00 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
13b10 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51  ITE.  **  6:  SQ
13b20 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
13b30 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
13b40 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20  N_CREATE.  */.  
13b50 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f  assert( SQLITE_O
13b60 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d  PEN_READONLY  ==
13b70 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72   0x01 );.  asser
13b80 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  t( SQLITE_OPEN_R
13b90 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32  EADWRITE == 0x02
13ba0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51   );.  assert( SQ
13bb0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
13bc0 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20      == 0x04 );. 
13bd0 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
13be0 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20  flags&7))==0x02 
13bf0 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a  ); /* READONLY *
13c00 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  /.  testcase( (1
13c10 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
13c20 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49  04 ); /* READWRI
13c30 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  TE */.  testcase
13c40 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29  ( (1<<(flags&7))
13c50 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41  ==0x40 ); /* REA
13c60 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20  DWRITE | CREATE 
13c70 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66  */.  if( ((1<<(f
13c80 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36 29  lags&7)) & 0x46)
13c90 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
13ca0 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
13cb0 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ..  if( sqlite3G
13cc0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
13cd0 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20  eMutex==0 ){.   
13ce0 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
13cf0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
13d00 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
13d10 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20  EN_NOMUTEX ){.  
13d20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
13d30 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
13d40 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
13d50 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b  PEN_FULLMUTEX ){
13d60 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
13d70 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e = 1;.  }else{.
13d80 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
13d90 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c   = sqlite3Global
13da0 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
13db0 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61  x;.  }.  if( fla
13dc0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
13dd0 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 29 7b  _PRIVATECACHE ){
13de0 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53  .    flags &= ~S
13df0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
13e00 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20  DCACHE;.  }else 
13e10 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
13e20 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61  lConfig.sharedCa
13e30 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20  cheEnabled ){.  
13e40 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54    flags |= SQLIT
13e50 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
13e60 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  HE;.  }..  /* Re
13e70 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74  move harmful bit
13e80 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73  s from the flags
13e90 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a   parameter.  **.
13ea0 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f    ** The SQLITE_
13eb0 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64  OPEN_NOMUTEX and
13ec0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
13ed0 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65 72  LMUTEX flags wer
13ee0 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74  e.  ** dealt wit
13ef0 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75  h in the previou
13f00 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42  s code block.  B
13f10 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74 68  esides these, th
13f20 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69  e only.  ** vali
13f30 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f  d input flags fo
13f40 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
13f50 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f  2() are SQLITE_O
13f60 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20  PEN_READONLY,.  
13f70 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ** SQLITE_OPEN_R
13f80 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45  EADWRITE, SQLITE
13f90 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51  _OPEN_CREATE, SQ
13fa0 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
13fb0 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49  CACHE,.  ** SQLI
13fc0 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
13fd0 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72  ACHE, and some r
13fe0 65 73 65 72 76 65 64 20 62 69 74 73 2e 20 20 53  eserved bits.  S
13ff0 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a  ilently mask.  *
14000 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20  * off all other 
14010 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c  flags..  */.  fl
14020 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54  ags &=  ~( SQLIT
14030 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43  E_OPEN_DELETEONC
14040 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20  LOSE |.         
14050 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
14060 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20  N_EXCLUSIVE |.  
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
14080 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
14090 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
140a0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45    SQLITE_OPEN_TE
140b0 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20  MP_DB | .       
140c0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
140d0 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42  PEN_TRANSIENT_DB
140e0 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
140f0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
14100 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20  AIN_JOURNAL | . 
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
14120 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a  LITE_OPEN_TEMP_J
14130 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20  OURNAL | .      
14140 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
14150 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20  OPEN_SUBJOURNAL 
14160 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
14170 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
14180 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20  STER_JOURNAL |. 
14190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
141a0 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45  LITE_OPEN_NOMUTE
141b0 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X |.            
141c0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46     SQLITE_OPEN_F
141d0 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20  ULLMUTEX |.     
141e0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
141f0 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20  _OPEN_WAL.      
14200 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20         );..  /* 
14210 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c  Allocate the sql
14220 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75  ite data structu
14230 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c  re */.  db = sql
14240 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
14250 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20  sizeof(sqlite3) 
14260 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29  );.  if( db==0 )
14270 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
14280 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64  ;.  if( isThread
14290 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e  safe ){.    db->
142a0 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d  mutex = sqlite3M
142b0 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45  utexAlloc(SQLITE
142c0 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45  _MUTEX_RECURSIVE
142d0 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d  );.    if( db->m
142e0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20  utex==0 ){.     
142f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
14300 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b  );.      db = 0;
14310 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  .      goto open
14320 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  db_out;.    }.  
14330 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
14340 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
14350 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73  x);.  db->errMas
14360 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e  k = 0xff;.  db->
14370 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d  nDb = 2;.  db->m
14380 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
14390 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e  GIC_BUSY;.  db->
143a0 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61  aDb = db->aDbSta
143b0 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  tic;..  assert( 
143c0 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69  sizeof(db->aLimi
143d0 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64  t)==sizeof(aHard
143e0 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63  Limit) );.  memc
143f0 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61  py(db->aLimit, a
14400 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f  HardLimit, sizeo
14410 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a  f(db->aLimit));.
14420 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74    db->autoCommit
14430 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74   = 1;.  db->next
14440 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20  Autovac = -1;.  
14450 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c  db->szMmap = sql
14460 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
14470 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e  .szMmap;.  db->n
14480 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b  extPagesize = 0;
14490 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20  .  db->flags |= 
144a0 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e  SQLITE_ShortColN
144b0 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e  ames | SQLITE_En
144c0 61 62 6c 65 54 72 69 67 67 65 72 20 7c 20 53 51  ableTrigger | SQ
144d0 4c 49 54 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a  LITE_CacheSpill.
144e0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
144f0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
14500 4d 41 54 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20  MATIC_INDEX) || 
14510 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 41  SQLITE_DEFAULT_A
14520 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20  UTOMATIC_INDEX. 
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14540 7c 20 53 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64  | SQLITE_AutoInd
14550 65 78 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  ex.#endif.#if SQ
14560 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c  LITE_DEFAULT_FIL
14570 45 5f 46 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20  E_FORMAT<4.     
14580 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
14590 4c 49 54 45 5f 4c 65 67 61 63 79 46 69 6c 65 46  LITE_LegacyFileF
145a0 6d 74 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  mt.#endif.#ifdef
145b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c   SQLITE_ENABLE_L
145c0 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20  OAD_EXTENSION.  
145d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
145e0 20 53 51 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65   SQLITE_LoadExte
145f0 6e 73 69 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66  nsion.#endif.#if
14600 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
14610 52 45 43 55 52 53 49 56 45 5f 54 52 49 47 47 45  RECURSIVE_TRIGGE
14620 52 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  RS.             
14630 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 52 65 63      | SQLITE_Rec
14640 54 72 69 67 67 65 72 73 0a 23 65 6e 64 69 66 0a  Triggers.#endif.
14650 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
14660 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
14670 47 4e 5f 4b 45 59 53 29 20 26 26 20 53 51 4c 49  GN_KEYS) && SQLI
14680 54 45 5f 44 45 46 41 55 4c 54 5f 46 4f 52 45 49  TE_DEFAULT_FOREI
14690 47 4e 5f 4b 45 59 53 0a 20 20 20 20 20 20 20 20  GN_KEYS.        
146a0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
146b0 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65  E_ForeignKeys.#e
146c0 6e 64 69 66 0a 20 20 20 20 20 20 3b 0a 20 20 73  ndif.      ;.  s
146d0 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
146e0 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23  db->aCollSeq);.#
146f0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14700 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
14710 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 69    sqlite3HashIni
14720 74 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b  t(&db->aModule);
14730 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64  .#endif..  /* Ad
14740 64 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  d the default co
14750 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
14760 20 42 49 4e 41 52 59 2e 20 42 49 4e 41 52 59 20   BINARY. BINARY 
14770 77 6f 72 6b 73 20 66 6f 72 20 62 6f 74 68 20 55  works for both U
14780 54 46 2d 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54  TF-8.  ** and UT
14790 46 2d 31 36 2c 20 73 6f 20 61 64 64 20 61 20 76  F-16, so add a v
147a0 65 72 73 69 6f 6e 20 66 6f 72 20 65 61 63 68 20  ersion for each 
147b0 74 6f 20 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e  to avoid any unn
147c0 65 63 65 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f  ecessary.  ** co
147d0 6e 76 65 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f  nversions. The o
147e0 6e 6c 79 20 65 72 72 6f 72 20 74 68 61 74 20 63  nly error that c
147f0 61 6e 20 6f 63 63 75 72 20 68 65 72 65 20 69 73  an occur here is
14800 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
14810 75 72 65 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61  ure..  */.  crea
14820 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
14830 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45  "BINARY", SQLITE
14840 5f 55 54 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c  _UTF8, 0, binCol
14850 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65  lFunc, 0);.  cre
14860 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
14870 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54   "BINARY", SQLIT
14880 45 5f 55 54 46 31 36 42 45 2c 20 30 2c 20 62 69  E_UTF16BE, 0, bi
14890 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
148a0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
148b0 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53  (db, "BINARY", S
148c0 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c 20 30  QLITE_UTF16LE, 0
148d0 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
148e0 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
148f0 74 69 6f 6e 28 64 62 2c 20 22 52 54 52 49 4d 22  tion(db, "RTRIM"
14900 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 28  , SQLITE_UTF8, (
14910 76 6f 69 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c  void*)1, binColl
14920 46 75 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20  Func, 0);.  if( 
14930 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14940 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
14950 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64  ndb_out;.  }.  d
14960 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73  b->pDfltColl = s
14970 71 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65  qlite3FindCollSe
14980 71 28 64 62 2c 20 53 51 4c 49 54 45 5f 55 54 46  q(db, SQLITE_UTF
14990 38 2c 20 22 42 49 4e 41 52 59 22 2c 20 30 29 3b  8, "BINARY", 0);
149a0 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 70  .  assert( db->p
149b0 44 66 6c 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a  DfltColl!=0 );..
149c0 20 20 2f 2a 20 41 6c 73 6f 20 61 64 64 20 61 20    /* Also add a 
149d0 55 54 46 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e  UTF-8 case-insen
149e0 73 69 74 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e  sitive collation
149f0 20 73 65 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20   sequence. */.  
14a00 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
14a10 64 62 2c 20 22 4e 4f 43 41 53 45 22 2c 20 53 51  db, "NOCASE", SQ
14a20 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f  LITE_UTF8, 0, no
14a30 63 61 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e  caseCollatingFun
14a40 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 50 61 72  c, 0);..  /* Par
14a50 73 65 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f  se the filename/
14a60 55 52 49 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f  URI argument. */
14a70 0a 20 20 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73  .  db->openFlags
14a80 20 3d 20 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d   = flags;.  rc =
14a90 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
14aa0 28 7a 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (zVfs, zFilename
14ab0 2c 20 26 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70  , &flags, &db->p
14ac0 56 66 73 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45  Vfs, &zOpen, &zE
14ad0 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 72 63  rrMsg);.  if( rc
14ae0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14af0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14b00 45 5f 4e 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61  E_NOMEM ) db->ma
14b10 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a  llocFailed = 1;.
14b20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
14b30 28 64 62 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67  (db, rc, zErrMsg
14b40 20 3f 20 22 25 73 22 20 3a 20 30 2c 20 7a 45 72   ? "%s" : 0, zEr
14b50 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
14b60 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
14b70 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
14b80 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  b_out;.  }..  /*
14b90 20 4f 70 65 6e 20 74 68 65 20 62 61 63 6b 65 6e   Open the backen
14ba0 64 20 64 61 74 61 62 61 73 65 20 64 72 69 76 65  d database drive
14bb0 72 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69  r */.  rc = sqli
14bc0 74 65 33 42 74 72 65 65 4f 70 65 6e 28 64 62 2d  te3BtreeOpen(db-
14bd0 3e 70 56 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62  >pVfs, zOpen, db
14be0 2c 20 26 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  , &db->aDb[0].pB
14bf0 74 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  t, 0,.          
14c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6c                fl
14c10 61 67 73 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ags | SQLITE_OPE
14c20 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66  N_MAIN_DB);.  if
14c30 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14c40 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
14c50 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
14c60 4d 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  M ){.      rc = 
14c70 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14c80 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
14c90 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b  rror(db, rc, 0);
14ca0 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
14cb0 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  _out;.  }.  db->
14cc0 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d  aDb[0].pSchema =
14cd0 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65   sqlite3SchemaGe
14ce0 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d  t(db, db->aDb[0]
14cf0 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62  .pBt);.  db->aDb
14d00 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [1].pSchema = sq
14d10 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
14d20 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68  b, 0);...  /* Th
14d30 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74 79  e default safety
14d40 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20 6d  _level for the m
14d50 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73 20  ain database is 
14d60 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20  'full'; for the 
14d70 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62 61  temp.  ** databa
14d80 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e  se it is 'NONE'.
14d90 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74 68   This matches th
14da0 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64 65  e pager layer de
14db0 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20  faults.  .  */. 
14dc0 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d   db->aDb[0].zNam
14dd0 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62  e = "main";.  db
14de0 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f  ->aDb[0].safety_
14df0 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d  level = 3;.  db-
14e00 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20  >aDb[1].zName = 
14e10 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44  "temp";.  db->aD
14e20 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65  b[1].safety_leve
14e30 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61  l = 1;..  db->ma
14e40 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
14e50 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64  IC_OPEN;.  if( d
14e60 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14e70 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e  ){.    goto open
14e80 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f  db_out;.  }..  /
14e90 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20 62  * Register all b
14ea0 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e  uilt-in function
14eb0 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61 74  s, but do not at
14ec0 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74 68  tempt to read th
14ed0 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
14ee0 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69 73  schema yet. This
14ef0 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69   is delayed unti
14f00 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  l the first time
14f10 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
14f20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e 0a  ** is accessed..
14f30 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 72    */.  sqlite3Er
14f40 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f  ror(db, SQLITE_O
14f50 4b 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  K, 0);.  sqlite3
14f60 52 65 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46  RegisterBuiltinF
14f70 75 6e 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20  unctions(db);.. 
14f80 20 2f 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74   /* Load automat
14f90 69 63 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20  ic extensions - 
14fa0 65 78 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20  extensions that 
14fb0 68 61 76 65 20 62 65 65 6e 20 72 65 67 69 73 74  have been regist
14fc0 65 72 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20  ered.  ** using 
14fd0 74 68 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f  the sqlite3_auto
14fe0 6d 61 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28  matic_extension(
14ff0 29 20 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63  ) API..  */.  rc
15000 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f   = sqlite3_errco
15010 64 65 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63  de(db);.  if( rc
15020 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15030 20 20 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f     sqlite3AutoLo
15040 61 64 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29  adExtensions(db)
15050 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
15060 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
15070 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15080 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
15090 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
150a0 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65      }.  }..#ifde
150b0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
150c0 46 54 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS1.  if( !db->
150d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
150e0 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
150f0 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28 73  qlite3Fts1Init(s
15100 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63  qlite3*);.    rc
15110 20 3d 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e   = sqlite3Fts1In
15120 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
15130 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  if..#ifdef SQLIT
15140 45 5f 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20  E_ENABLE_FTS2.  
15150 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
15160 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
15170 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78  ITE_OK ){.    ex
15180 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
15190 46 74 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts2Init(sqlite3
151a0 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
151b0 69 74 65 33 46 74 73 32 49 6e 69 74 28 64 62 29  ite3Fts2Init(db)
151c0 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
151d0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
151e0 4c 45 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64  LE_FTS3.  if( !d
151f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15200 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
15210 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
15220 69 74 65 33 46 74 73 33 49 6e 69 74 28 64 62 29  ite3Fts3Init(db)
15230 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
15240 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
15250 4c 45 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62  LE_ICU.  if( !db
15260 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
15270 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
15280 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
15290 74 65 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a  te3IcuInit(db);.
152a0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
152b0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
152c0 5f 52 54 52 45 45 0a 20 20 69 66 28 20 21 64 62  _RTREE.  if( !db
152d0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
152e0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  & rc==SQLITE_OK)
152f0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
15300 65 33 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b  e3RtreeInit(db);
15310 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  .  }.#endif..  /
15320 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55  * -DSQLITE_DEFAU
15330 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
15340 31 20 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56  1 makes EXCLUSIV
15350 45 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  E the default lo
15360 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
15370 20 20 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55    -DSQLITE_DEFAU
15380 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d  LT_LOCKING_MODE=
15390 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68  0 make NORMAL th
153a0 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e  e default lockin
153b0 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f  g.  ** mode.  Do
153c0 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61  ing nothing at a
153d0 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f  ll also makes NO
153e0 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74  RMAL the default
153f0 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ..  */.#ifdef SQ
15400 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43  LITE_DEFAULT_LOC
15410 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e  KING_MODE.  db->
15420 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53  dfltLockMode = S
15430 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f  QLITE_DEFAULT_LO
15440 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71  CKING_MODE;.  sq
15450 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
15460 67 4d 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72  gMode(sqlite3Btr
15470 65 65 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b  eePager(db->aDb[
15480 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20  0].pBt),.       
15490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154a0 20 20 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c     SQLITE_DEFAUL
154b0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b  T_LOCKING_MODE);
154c0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72  .#endif..  if( r
154d0 63 20 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72  c ) sqlite3Error
154e0 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 0a 20 20  (db, rc, 0);..  
154f0 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f  /* Enable the lo
15500 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73  okaside-malloc s
15510 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65  ubsystem */.  se
15520 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c  tupLookaside(db,
15530 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   0, sqlite3Globa
15540 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73  lConfig.szLookas
15550 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ide,.           
15560 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
15570 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
15580 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20  .nLookaside);.. 
15590 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74   sqlite3_wal_aut
155a0 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  ocheckpoint(db, 
155b0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57  SQLITE_DEFAULT_W
155c0 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e  AL_AUTOCHECKPOIN
155d0 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a  T);..opendb_out:
155e0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
155f0 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20 64 62  zOpen);.  if( db
15600 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15610 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20  db->mutex!=0 || 
15620 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20  isThreadsafe==0 
15630 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  || sqlite3Global
15640 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65  Config.bFullMute
15650 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  x==0 );.    sqli
15660 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
15670 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  db->mutex);.  }.
15680 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
15690 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73  rrcode(db);.  as
156a0 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72  sert( db!=0 || r
156b0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
156c0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
156d0 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20  ITE_NOMEM ){.   
156e0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64   sqlite3_close(d
156f0 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a  b);.    db = 0;.
15700 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d    }else if( rc!=
15710 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15720 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
15730 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a  ITE_MAGIC_SICK;.
15740 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62    }.  *ppDb = db
15750 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
15760 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20  ENABLE_SQLLOG.  
15770 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
15780 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
15790 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69 6e  ){.    /* Openin
157a0 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20 46  g a db handle. F
157b0 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72 20  ourth parameter 
157c0 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f 0a  is passed 0. */.
157d0 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20 3d      void *pArg =
157e0 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
157f0 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 3b  nfig.pSqllogArg;
15800 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
15810 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
15820 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c 65  (pArg, db, zFile
15830 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23 65  name, 0);.  }.#e
15840 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 73 71  ndif.  return sq
15850 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20  lite3ApiExit(0, 
15860 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  rc);.}../*.** Op
15870 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
15880 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
15890 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a 20   sqlite3_open(. 
158a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
158b0 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74  lename, .  sqlit
158c0 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20 20  e3 **ppDb .){.  
158d0 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62  return openDatab
158e0 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  ase(zFilename, p
158f0 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pDb,.           
15900 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
15910 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
15920 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
15930 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e 74  REATE, 0);.}.int
15940 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
15950 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
15960 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 44  filename,   /* D
15970 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
15980 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73 71   (UTF-8) */.  sq
15990 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
159a0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 51        /* OUT: SQ
159b0 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20 2a  Lite db handle *
159c0 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
159d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
159e0 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  lags */.  const 
159f0 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20 20  char *zVfs      
15a00 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53    /* Name of VFS
15a10 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20 2a   module to use *
15a20 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70  /.){.  return op
15a30 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65 6e  enDatabase(filen
15a40 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e 73 69  ame, ppDb, (unsi
15a50 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c 20  gned int)flags, 
15a60 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  zVfs);.}..#ifnde
15a70 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
15a80 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  F16./*.** Open a
15a90 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61   new database ha
15aa0 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ndle..*/.int sql
15ab0 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20 63  ite3_open16(.  c
15ac0 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c 65  onst void *zFile
15ad0 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65 33  name, .  sqlite3
15ae0 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68 61   **ppDb.){.  cha
15af0 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e 61  r const *zFilena
15b00 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65 6e  me8;   /* zFilen
15b10 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20 55  ame encoded in U
15b20 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66 20  TF-8 instead of 
15b30 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c 69  UTF-16 */.  sqli
15b40 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c 3b  te3_value *pVal;
15b50 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
15b60 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65 20  sert( zFilename 
15b70 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70 44  );.  assert( ppD
15b80 62 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d 20 30  b );.  *ppDb = 0
15b90 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
15ba0 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20  _OMIT_AUTOINIT. 
15bb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e   rc = sqlite3_in
15bc0 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66  itialize();.  if
15bd0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
15be0 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56 61 6c 20  ;.#endif.  pVal 
15bf0 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e 65  = sqlite3ValueNe
15c00 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 56  w(0);.  sqlite3V
15c10 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c 2c  alueSetStr(pVal,
15c20 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20   -1, zFilename, 
15c30 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
15c40 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  VE, SQLITE_STATI
15c50 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 38  C);.  zFilename8
15c60 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 54   = sqlite3ValueT
15c70 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54 45  ext(pVal, SQLITE
15c80 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a 46  _UTF8);.  if( zF
15c90 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20 20  ilename8 ){.    
15ca0 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61 73  rc = openDatabas
15cb0 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70 70  e(zFilename8, pp
15cc0 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  Db,.            
15cd0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
15ce0 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
15cf0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
15d00 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61 73  EATE, 0);.    as
15d10 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20 72  sert( *ppDb || r
15d20 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
15d30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
15d40 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62 48  QLITE_OK && !DbH
15d50 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44 62  asProperty(*ppDb
15d60 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c 6f  , 0, DB_SchemaLo
15d70 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20 45  aded) ){.      E
15d80 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c 49  NC(*ppDb) = SQLI
15d90 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a  TE_UTF16NATIVE;.
15da0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
15db0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
15dc0 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  OMEM;.  }.  sqli
15dd0 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56 61  te3ValueFree(pVa
15de0 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73 71  l);..  return sq
15df0 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c 20  lite3ApiExit(0, 
15e00 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  rc);.}.#endif /*
15e10 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
15e20 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  16 */../*.** Reg
15e30 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
15e40 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
15e50 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
15e60 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
15e70 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
15e80 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73  e_collation(.  s
15e90 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
15ea0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
15eb0 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
15ec0 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
15ed0 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
15ee0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
15ef0 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
15f00 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
15f10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
15f20 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
15f30 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
15f40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
15f50 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
15f60 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
15f70 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  ame, (u8)enc, pC
15f80 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
15f90 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
15fa0 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
15fb0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15fc0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
15fd0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
15fe0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
15ff0 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f  r a new collatio
16000 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20  n sequence with 
16010 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
16020 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73  dle db..*/.int s
16030 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
16040 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71  llation_v2(.  sq
16050 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63 6f  lite3* db, .  co
16060 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
16070 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20   .  int enc, .  
16080 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
16090 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
160a0 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
160b0 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
160c0 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44 65  d*),.  void(*xDe
160d0 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69  l)(void*).){.  i
160e0 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33  nt rc;.  sqlite3
160f0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
16100 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
16110 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
16120 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63  iled );.  rc = c
16130 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
16140 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e  b, zName, (u8)en
16150 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72  c, pCtx, xCompar
16160 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20 3d  e, xDel);.  rc =
16170 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
16180 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
16190 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
161a0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
161b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64  urn rc;.}..#ifnd
161c0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
161d0 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  TF16./*.** Regis
161e0 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
161f0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
16200 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
16210 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
16220 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
16230 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20 73  collation16(.  s
16240 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
16250 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d 65  onst void *zName
16260 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20 20  ,.  int enc, .  
16270 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69 6e  void* pCtx,.  in
16280 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f 69  t(*xCompare)(voi
16290 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
162a0 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f 69  d*,int,const voi
162b0 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  d*).){.  int rc 
162c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
162d0 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20 73  har *zName8;.  s
162e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
162f0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
16300 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
16310 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
16320 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33  zName8 = sqlite3
16330 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e 61  Utf16to8(db, zNa
16340 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55  me, -1, SQLITE_U
16350 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 69  TF16NATIVE);.  i
16360 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20 20  f( zName8 ){.   
16370 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c   rc = createColl
16380 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 38  ation(db, zName8
16390 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c  , (u8)enc, pCtx,
163a0 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20   xCompare, 0);. 
163b0 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
163c0 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20 20  (db, zName8);.  
163d0 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
163e0 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
163f0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16400 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
16410 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16420 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
16430 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
16440 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
16450 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71   a collation seq
16460 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61  uence factory ca
16470 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65 20  llback with the 
16480 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a  database handle.
16490 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61  ** db. Replace a
164a0 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e  ny previously in
164b0 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f  stalled collatio
164c0 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
164d0 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ry..*/.int sqlit
164e0 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65  e3_collation_nee
164f0 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ded(.  sqlite3 *
16500 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  db, .  void *pCo
16510 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20  llNeededArg, .  
16520 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65  void(*xCollNeede
16530 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65 33  d)(void*,sqlite3
16540 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c 63  *,int eTextRep,c
16550 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20  onst char*).){. 
16560 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
16570 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
16580 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
16590 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64  ed = xCollNeeded
165a0 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
165b0 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62 2d  ded16 = 0;.  db-
165c0 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20  >pCollNeededArg 
165d0 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  = pCollNeededArg
165e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
165f0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
16600 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
16610 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64  ITE_OK;.}..#ifnd
16620 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
16630 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  TF16./*.** Regis
16640 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20  ter a collation 
16650 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
16660 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
16670 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
16680 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63  le.** db. Replac
16690 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79  e any previously
166a0 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61   installed colla
166b0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61  tion sequence fa
166c0 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ctory..*/.int sq
166d0 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f  lite3_collation_
166e0 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c 69  needed16(.  sqli
166f0 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64  te3 *db, .  void
16700 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67   *pCollNeededArg
16710 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c  , .  void(*xColl
16720 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a 2c  Needed16)(void*,
16730 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54 65  sqlite3*,int eTe
16740 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69 64  xtRep,const void
16750 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  *).){.  sqlite3_
16760 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
16770 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43  mutex);.  db->xC
16780 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a 20  ollNeeded = 0;. 
16790 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64   db->xCollNeeded
167a0 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65 64  16 = xCollNeeded
167b0 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c 4e  16;.  db->pCollN
167c0 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c 6c  eededArg = pColl
167d0 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71 6c  NeededArg;.  sql
167e0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
167f0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
16800 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16810 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
16820 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
16830 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  /..#ifndef SQLIT
16840 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45  E_OMIT_DEPRECATE
16850 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  D./*.** This fun
16860 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e 20  ction is now an 
16870 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74 20  anachronism. It 
16880 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  used to be used 
16890 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d 20  to recover from 
168a0 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66 61  a.** malloc() fa
168b0 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69 74  ilure, but SQLit
168c0 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73 20  e now does this 
168d0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a 2a  automatically..*
168e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67 6c  /.int sqlite3_gl
168f0 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f 69  obal_recover(voi
16900 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  d){.  return SQL
16910 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
16920 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20  ../*.** Test to 
16930 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  see whether or n
16940 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
16950 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69 6e  connection is in
16960 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20 6d   autocommit.** m
16970 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ode.  Return TRU
16980 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20 46  E if it is and F
16990 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41 75  ALSE if not.  Au
169a0 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69 73  tocommit mode is
169b0 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75 6c   on.** by defaul
169c0 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 69  t.  Autocommit i
169d0 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61 20  s disabled by a 
169e0 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74 20  BEGIN statement 
169f0 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a 2a  and reenabled.**
16a00 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f 4d   by the next COM
16a10 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 2e  MIT or ROLLBACK.
16a20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
16a30 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 73  get_autocommit(s
16a40 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72  qlite3 *db){.  r
16a50 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43 6f  eturn db->autoCo
16a60 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  mmit;.}../*.** T
16a70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75  he following rou
16a80 74 69 6e 65 73 20 61 72 65 20 73 75 62 74 69 74  tines are subtit
16a90 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61 6e  utes for constan
16aa0 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  ts SQLITE_CORRUP
16ab0 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49 53  T,.** SQLITE_MIS
16ac0 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54  USE, SQLITE_CANT
16ad0 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49 4f 45  OPEN, SQLITE_IOE
16ae0 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c 79 20  RR and possibly 
16af0 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20 63  other error.** c
16b00 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79 20  onstants.  They 
16b10 73 65 72 76 65 72 20 74 77 6f 20 70 75 72 70 6f  server two purpo
16b20 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e 20  ses:.**.**   1. 
16b30 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e 76   Serve as a conv
16b40 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f 20  enient place to 
16b50 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74  set a breakpoint
16b60 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a 2a   in a debugger.*
16b70 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65 63  *       to detec
16b80 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20 65  t when version e
16b90 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  rror conditions 
16ba0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  occurs..**.**   
16bb0 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  2.  Invoke sqlit
16bc0 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f 76  e3_log() to prov
16bd0 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20 63  ide the source c
16be0 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68 65  ode location whe
16bf0 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c 6f  re.**       a lo
16c00 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69 73  w-level error is
16c10 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64 2e   first detected.
16c20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
16c30 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74 20  orruptError(int 
16c40 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74 63  lineno){.  testc
16c50 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  ase( sqlite3Glob
16c60 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d 30  alConfig.xLog!=0
16c70 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c 6f   );.  sqlite3_lo
16c80 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  g(SQLITE_CORRUPT
16c90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16ca0 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70  "database corrup
16cb0 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25 64 20  tion at line %d 
16cc0 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
16cd0 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
16ce0 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
16cf0 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
16d00 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
16d10 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  PT;.}.int sqlite
16d20 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e 74  3MisuseError(int
16d30 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
16d40 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
16d50 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
16d60 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
16d70 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  og(SQLITE_MISUSE
16d80 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
16d90 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69 6e 65   "misuse at line
16da0 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c   %d of [%.10s]",
16db0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
16dc0 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
16dd0 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
16de0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
16df0 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71 6c  ISUSE;.}.int sql
16e00 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72 6f  ite3CantopenErro
16e10 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20  r(int lineno){. 
16e20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74   testcase( sqlit
16e30 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
16e40 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69  Log!=0 );.  sqli
16e50 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43  te3_log(SQLITE_C
16e60 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20 20 20  ANTOPEN, .      
16e70 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74 20          "cannot 
16e80 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c 69 6e  open file at lin
16e90 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
16ea0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
16eb0 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
16ec0 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
16ed0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
16ee0 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23 69  CANTOPEN;.}...#i
16ef0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16f00 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
16f10 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f 6e  ** This is a con
16f20 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e 65  venience routine
16f30 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72 65   that makes sure
16f40 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61 64   that all thread
16f50 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61 74  -specific.** dat
16f60 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65 61  a for this threa
16f70 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c 6c  d has been deall
16f80 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 51  ocated..**.** SQ
16f90 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20 75  Lite no longer u
16fa0 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63 69  ses thread-speci
16fb0 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69 73  fic data so this
16fc0 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77 20   routine is now 
16fd0 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74 20  a.** no-op.  It 
16fe0 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72 20  is retained for 
16ff0 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70 61  historical compa
17000 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f 69  tibility..*/.voi
17010 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61 64  d sqlite3_thread
17020 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b 0a  _cleanup(void){.
17030 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
17040 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66 6f  Return meta info
17050 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20  rmation about a 
17060 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e 20  specific column 
17070 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74 61  of a database ta
17080 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d 6d  ble..** See comm
17090 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  ent in sqlite3.h
170a0 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20 66   (sqlite.h.in) f
170b0 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 23  or details..*/.#
170c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
170d0 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
170e0 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ATA.int sqlite3_
170f0 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
17100 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65 33  adata(.  sqlite3
17110 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
17120 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69       /* Connecti
17130 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  on handle */.  c
17140 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
17150 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44 61  me,        /* Da
17160 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20 4e  tabase name or N
17170 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
17180 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65 2c  har *zTableName,
17190 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e 61       /* Table na
171a0 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  me */.  const ch
171b0 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 2c  ar *zColumnName,
171c0 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61      /* Column na
171d0 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  me */.  char con
171e0 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65 2c  st **pzDataType,
171f0 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 44      /* OUTPUT: D
17200 65 63 6c 61 72 65 64 20 64 61 74 61 20 74 79 70  eclared data typ
17210 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e 73  e */.  char cons
17220 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20 20  t **pzCollSeq,  
17230 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43 6f     /* OUTPUT: Co
17240 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
17250 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 2a   name */.  int *
17260 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20 20  pNotNull,       
17270 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
17280 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e 55  : True if NOT NU
17290 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65 78  LL constraint ex
172a0 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ists */.  int *p
172b0 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20 20  PrimaryKey,     
172c0 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a        /* OUTPUT:
172d0 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e 20   True if column 
172e0 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20 20  part of PK */.  
172f0 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20 20  int *pAutoinc   
17300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
17310 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 63  UTPUT: True if c
17320 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69 6e  olumn is auto-in
17330 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20 20  crement */.){.  
17340 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a  int rc;.  char *
17350 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 54  zErrMsg = 0;.  T
17360 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
17370 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
17380 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 0a   0;.  int iCol;.
17390 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a  .  char const *z
173a0 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20 20  DataType = 0;.  
173b0 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f 6c  char const *zCol
173c0 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lSeq = 0;.  int 
173d0 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20 69  notnull = 0;.  i
173e0 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d 20  nt primarykey = 
173f0 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e 63  0;.  int autoinc
17400 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75   = 0;..  /* Ensu
17410 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  re the database 
17420 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e 20  schema has been 
17430 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c 69  loaded */.  sqli
17440 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
17450 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73 71  db->mutex);.  sq
17460 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41  lite3BtreeEnterA
17470 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20 73  ll(db);.  rc = s
17480 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20 26  qlite3Init(db, &
17490 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20  zErrMsg);.  if( 
174a0 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29 7b  SQLITE_OK!=rc ){
174b0 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
174c0 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4c  out;.  }..  /* L
174d0 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65 20  ocate the table 
174e0 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a 20  in question */. 
174f0 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33 46   pTab = sqlite3F
17500 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54 61  indTable(db, zTa
17510 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d 65  bleName, zDbName
17520 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20 7c  );.  if( !pTab |
17530 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 20  | pTab->pSelect 
17540 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30 3b  ){.    pTab = 0;
17550 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f  .    goto error_
17560 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 46  out;.  }..  /* F
17570 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 66  ind the column f
17580 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69 73  or which info is
17590 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
175a0 69 66 28 20 73 71 6c 69 74 65 33 49 73 52 6f 77  if( sqlite3IsRow
175b0 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20  id(zColumnName) 
175c0 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70 54  ){.    iCol = pT
175d0 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20 69  ab->iPKey;.    i
175e0 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20 20  f( iCol>=0 ){.  
175f0 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62      pCol = &pTab
17600 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20  ->aCol[iCol];.  
17610 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
17620 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43 6f   for(iCol=0; iCo
17630 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43  l<pTab->nCol; iC
17640 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43 6f  ol++){.      pCo
17650 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c 5b  l = &pTab->aCol[
17660 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66 28  iCol];.      if(
17670 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49 43   0==sqlite3StrIC
17680 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  mp(pCol->zName, 
17690 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a  zColumnName) ){.
176a0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
176b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
176c0 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d   if( iCol==pTab-
176d0 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70  >nCol ){.      p
176e0 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67  Tab = 0;.      g
176f0 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a 20  oto error_out;. 
17700 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54     }.  }..  /* T
17710 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
17720 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d 65  ck stores the me
17730 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 74  ta information t
17740 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74 75  hat will be retu
17750 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68 65  rned.  ** to the
17760 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61 6c   caller in local
17770 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74 61   variables zData
17780 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c 20  Type, zCollSeq, 
17790 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72 79  notnull, primary
177a0 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75 74  key.  ** and aut
177b0 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70 6f  oinc. At this po
177c0 69 6e 74 20 74 68 65 72 65 20 61 72 65 20 74 77  int there are tw
177d0 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 3a  o possibilities:
177e0 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20 20  .  ** .  **     
177f0 31 2e 20 54 68 65 20 73 70 65 63 69 66 69 65 64  1. The specified
17800 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61 73   column name was
17810 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20 6f   rowid", "oid" o
17820 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20 2a  r "_rowid_" .  *
17830 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 65  *        and the
17840 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63 69  re is no explici
17850 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50 4b  tly declared IPK
17860 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a 20   column. .  **. 
17870 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20 74   **     2. The t
17880 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76 69  able is not a vi
17890 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75 6d  ew and the colum
178a0 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69 65  n name identifie
178b0 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20 20  d an .  **      
178c0 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65 63    explicitly dec
178d0 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43 6f  lared column. Co
178e0 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74  py meta informat
178f0 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e 0a  ion from *pCol..
17900 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f 6c    */ .  if( pCol
17910 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79 70   ){.    zDataTyp
17920 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65 3b  e = pCol->zType;
17930 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20  .    zCollSeq = 
17940 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20 20  pCol->zColl;.   
17950 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c 2d   notnull = pCol-
17960 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20 20  >notNull!=0;.   
17970 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20 28   primarykey  = (
17980 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20 26  pCol->colFlags &
17990 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45 59   COLFLAG_PRIMKEY
179a0 29 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e  )!=0;.    autoin
179b0 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d  c = pTab->iPKey=
179c0 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e  =iCol && (pTab->
179d0 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75  tabFlags & TF_Au
179e0 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b  toincrement)!=0;
179f0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44  .  }else{.    zD
17a00 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47  ataType = "INTEG
17a10 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79  ER";.    primary
17a20 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  key = 1;.  }.  i
17a30 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a  f( !zCollSeq ){.
17a40 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22      zCollSeq = "
17a50 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72  BINARY";.  }..er
17a60 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74  ror_out:.  sqlit
17a70 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
17a80 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68  db);..  /* Wheth
17a90 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  er the function 
17aa0 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f  call succeeded o
17ab0 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68  r failed, set th
17ac0 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74  e output paramet
17ad0 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74  ers.  ** to what
17ae0 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c  ever their local
17af0 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f   counterparts co
17b00 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72  ntain. If an err
17b10 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20  or did occur,.  
17b20 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65 20  ** this has the 
17b30 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e  effect of zeroin
17b40 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72  g all output par
17b50 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20  ameters..  */.  
17b60 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20 29  if( pzDataType )
17b70 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a   *pzDataType = z
17b80 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20  DataType;.  if( 
17b90 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43  pzCollSeq ) *pzC
17ba0 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65  ollSeq = zCollSe
17bb0 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c  q;.  if( pNotNul
17bc0 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20  l ) *pNotNull = 
17bd0 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70  notnull;.  if( p
17be0 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50  PrimaryKey ) *pP
17bf0 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d  rimaryKey = prim
17c00 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41  arykey;.  if( pA
17c10 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69  utoinc ) *pAutoi
17c20 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20  nc = autoinc;.. 
17c30 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
17c40 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20  rc && !pTab ){. 
17c50 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
17c60 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  (db, zErrMsg);. 
17c70 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c     zErrMsg = sql
17c80 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20  ite3MPrintf(db, 
17c90 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63  "no such table c
17ca0 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a  olumn: %s.%s", z
17cb0 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20  TableName,.     
17cc0 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b     zColumnName);
17cd0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17ce0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71  _ERROR;.  }.  sq
17cf0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
17d00 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22  c, (zErrMsg?"%s"
17d10 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  :0), zErrMsg);. 
17d20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
17d30 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72  b, zErrMsg);.  r
17d40 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
17d50 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
17d60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
17d70 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
17d80 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
17d90 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70  dif../*.** Sleep
17da0 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68   for a little wh
17db0 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ile.  Return the
17dc0 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20   amount of time 
17dd0 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  slept..*/.int sq
17de0 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20  lite3_sleep(int 
17df0 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ms){.  sqlite3_v
17e00 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20  fs *pVfs;.  int 
17e10 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c  rc;.  pVfs = sql
17e20 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
17e30 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20  ;.  if( pVfs==0 
17e40 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
17e50 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
17e60 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65  works in millise
17e70 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75  conds, but the u
17e80 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65  nderlying OsSlee
17e90 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73  p() .  ** API us
17ea0 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e  es microseconds.
17eb0 20 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27   Hence the 1000'
17ec0 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28  s..  */.  rc = (
17ed0 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70  sqlite3OsSleep(p
17ee0 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30  Vfs, 1000*ms)/10
17ef0 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  00);.  return rc
17f00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c  ;.}../*.** Enabl
17f10 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65  e or disable the
17f20 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74   extended result
17f30 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   codes..*/.int s
17f40 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
17f50 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c  result_codes(sql
17f60 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e  ite3 *db, int on
17f70 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  off){.  sqlite3_
17f80 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
17f90 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72  mutex);.  db->er
17fa0 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20  rMask = onoff ? 
17fb0 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66  0xffffffff : 0xf
17fc0 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  f;.  sqlite3_mut
17fd0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
17fe0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
17ff0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
18000 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69  * Invoke the xFi
18010 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64  leControl method
18020 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72   on a particular
18030 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e   database..*/.in
18040 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63  t sqlite3_file_c
18050 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a  ontrol(sqlite3 *
18060 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
18070 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c  zDbName, int op,
18080 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
18090 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
180a0 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a  ERROR;.  Btree *
180b0 70 42 74 72 65 65 3b 0a 0a 20 20 73 71 6c 69 74  pBtree;..  sqlit
180c0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
180d0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74  b->mutex);.  pBt
180e0 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  ree = sqlite3DbN
180f0 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
18100 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70  DbName);.  if( p
18110 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67  Btree ){.    Pag
18120 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20  er *pPager;.    
18130 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
18140 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
18150 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b  eeEnter(pBtree);
18160 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71  .    pPager = sq
18170 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28  lite3BtreePager(
18180 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73  pBtree);.    ass
18190 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
181a0 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74  ;.    fd = sqlit
181b0 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67  e3PagerFile(pPag
181c0 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  er);.    assert(
181d0 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66   fd!=0 );.    if
181e0 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e  ( op==SQLITE_FCN
181f0 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20  TL_FILE_POINTER 
18200 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74  ){.      *(sqlit
18210 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d  e3_file**)pArg =
18220 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20   fd;.      rc = 
18230 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d  SQLITE_OK;.    }
18240 65 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65  else if( fd->pMe
18250 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72  thods ){.      r
18260 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
18270 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c  eControl(fd, op,
18280 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73   pArg);.    }els
18290 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  e{.      rc = SQ
182a0 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20  LITE_NOTFOUND;. 
182b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
182c0 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65  BtreeLeave(pBtre
182d0 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  e);.  }.  sqlite
182e0 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
182f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
18300 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a  rn rc;   .}../*.
18310 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20  ** Interface to 
18320 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69  the testing logi
18330 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  c..*/.int sqlite
18340 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
18350 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69  nt op, ...){.  i
18360 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64  nt rc = 0;.#ifnd
18370 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42  ef SQLITE_OMIT_B
18380 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61  UILTIN_TEST.  va
18390 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73  _list ap;.  va_s
183a0 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
183b0 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
183c0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76     /*.    ** Sav
183d0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  e the current st
183e0 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e  ate of the PRNG.
183f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
18400 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
18410 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20  _PRNG_SAVE: {.  
18420 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53      sqlite3PrngS
18430 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20  aveState();.    
18440 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
18450 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65      /*.    ** Re
18460 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65 20  store the state 
18470 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74  of the PRNG to t
18480 68 65 20 6c 61 73 74 20 73 74 61 74 65 20 73 61  he last state sa
18490 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a  ved using.    **
184a0 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20   PRNG_SAVE.  If 
184b0 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65  PRNG_SAVE has ne
184c0 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20  ver before been 
184d0 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20  called, then.   
184e0 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61 63   ** this verb ac
184f0 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53  ts like PRNG_RES
18500 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ET..    */.    c
18510 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
18520 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45  TRL_PRNG_RESTORE
18530 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
18540 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74  3PrngRestoreStat
18550 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
18560 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
18570 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65      ** Reset the
18580 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74   PRNG back to it
18590 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20  s uninitialized 
185a0 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74  state.  The next
185b0 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20   call.    ** to 
185c0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
185d0 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64  ss() will reseed
185e0 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20   the PRNG using 
185f0 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20  a single call.  
18600 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e    ** to the xRan
18610 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f  domness method o
18620 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  f the default VF
18630 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  S..    */.    ca
18640 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
18650 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b  RL_PRNG_RESET: {
18660 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
18670 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29 3b 0a  andomness(0,0);.
18680 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18690 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
186a0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
186b0 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54  control(BITVEC_T
186c0 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72  EST, size, progr
186d0 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  am).    **.    *
186e0 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61 67 61  * Run a test aga
186f0 69 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f 62  inst a Bitvec ob
18700 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54  ject of size.  T
18710 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d  he program argum
18720 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e  ent.    ** is an
18730 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65   array of intege
18740 72 73 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  rs that defines 
18750 74 68 65 20 74 65 73 74 2e 20 20 52 65 74 75 72  the test.  Retur
18760 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a  n -1 on a.    **
18770 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
18780 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73  on error, 0 on s
18790 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a  uccess, or non-z
187a0 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72  ero for an error
187b0 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65  ..    ** See the
187c0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75   sqlite3BitvecBu
187d0 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20  iltinTest() for 
187e0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
187f0 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
18800 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
18810 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54  ESTCTRL_BITVEC_T
18820 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  EST: {.      int
18830 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c   sz = va_arg(ap,
18840 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74   int);.      int
18850 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67   *aProg = va_arg
18860 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20  (ap, int*);.    
18870 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69    rc = sqlite3Bi
18880 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28  tvecBuiltinTest(
18890 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20  sz, aProg);.    
188a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
188b0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73      /*.    **  s
188c0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
188d0 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  rol(BENIGN_MALLO
188e0 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c  C_HOOKS, xBegin,
188f0 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20   xEnd).    **.  
18900 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f    ** Register ho
18910 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69  oks to call to i
18920 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61  ndicate which ma
18930 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20  lloc() failures 
18940 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69  .    ** are beni
18950 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  gn..    */.    c
18960 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
18970 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f  TRL_BENIGN_MALLO
18980 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20  C_HOOKS: {.     
18990 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
189a0 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76  void_function)(v
189b0 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64  oid);.      void
189c0 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67  _function xBenig
189d0 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f  nBegin;.      vo
189e0 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e  id_function xBen
189f0 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42  ignEnd;.      xB
18a00 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f  enignBegin = va_
18a10 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e  arg(ap, void_fun
18a20 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42  ction);.      xB
18a30 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72  enignEnd = va_ar
18a40 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74  g(ap, void_funct
18a50 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ion);.      sqli
18a60 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48  te3BenignMallocH
18a70 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69  ooks(xBenignBegi
18a80 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a  n, xBenignEnd);.
18a90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18aa0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
18ab0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
18ac0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
18ad0 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f  ESTCTRL_PENDING_
18ae0 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69  BYTE, unsigned i
18af0 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
18b00 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44   ** Set the PEND
18b10 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20  ING byte to the 
18b20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67  value in the arg
18b30 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20  ument, if X>0.. 
18b40 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68     ** Make no ch
18b50 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20  anges if X==0.  
18b60 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65  Return the value
18b70 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20   of the pending 
18b80 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69  byte.    ** as i
18b90 74 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72  t existing befor
18ba0 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  e this routine w
18bb0 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a  as called..    *
18bc0 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41  *.    ** IMPORTA
18bd0 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68  NT:  Changing th
18be0 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66  e PENDING byte f
18bf0 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72  rom 0x40000000 r
18c00 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a  esults in.    **
18c10 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65   an incompatible
18c20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66   database file f
18c30 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67  ormat.  Changing
18c40 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74   the PENDING byt
18c50 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61  e.    ** while a
18c60 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ny database conn
18c70 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72  ection is open r
18c80 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69  esults in undefi
18c90 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64  ned and.    ** d
18ca0 69 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76  ileterious behav
18cb0 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ior..    */.    
18cc0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
18cd0 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54  CTRL_PENDING_BYT
18ce0 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  E: {.      rc = 
18cf0 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69  PENDING_BYTE;.#i
18d00 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
18d10 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20  T_WSD.      {.  
18d20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
18d30 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61  nt newVal = va_a
18d40 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20  rg(ap, unsigned 
18d50 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66  int);.        if
18d60 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74  ( newVal ) sqlit
18d70 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20  e3PendingByte = 
18d80 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a  newVal;.      }.
18d90 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
18da0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
18db0 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65  *.    **  sqlite
18dc0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
18dd0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
18de0 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20  SSERT, int X).  
18df0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73    **.    ** This
18e00 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73   action provides
18e10 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74   a run-time test
18e20 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
18e30 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73  or not.    ** as
18e40 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c  sert() was enabl
18e50 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69  ed at compile-ti
18e60 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75  me.  If X is tru
18e70 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20  e and assert(). 
18e80 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64     ** is enabled
18e90 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72  , then the retur
18ea0 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e  n value is true.
18eb0 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61    If X is true a
18ec0 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74  nd.    ** assert
18ed0 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
18ee0 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
18ef0 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20  value is zero.  
18f00 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66  If X is.    ** f
18f10 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
18f20 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68  ) is enabled, th
18f30 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e  en the assertion
18f40 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20   fires and the. 
18f50 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62     ** process ab
18f60 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66  orts.  If X is f
18f70 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28  alse and assert(
18f80 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
18f90 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  hen the.    ** r
18fa0 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a  eturn value is z
18fb0 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ero..    */.    
18fc0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
18fd0 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20  CTRL_ASSERT: {. 
18fe0 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e       volatile in
18ff0 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61  t x = 0;.      a
19000 73 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61  ssert( (x = va_a
19010 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29  rg(ap,int))!=0 )
19020 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a  ;.      rc = x;.
19030 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19040 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   }...    /*.    
19050 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
19060 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
19070 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
19080 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20   int X).    **. 
19090 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f     ** This actio
190a0 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e  n provides a run
190b0 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65  -time test to se
190c0 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53  e how the ALWAYS
190d0 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45   and.    ** NEVE
190e0 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65  R macros were de
190f0 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  fined at compile
19100 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20  -time..    **.  
19110 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20    ** The return 
19120 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28  value is ALWAYS(
19130 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20  X).  .    **.   
19140 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e   ** The recommen
19150 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32  ded test is X==2
19160 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e  .  If the return
19170 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61   value is 2, tha
19180 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41  t means.    ** A
19190 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45  LWAYS() and NEVE
191a0 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d  R() are both no-
191b0 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20  op pass-through 
191c0 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73  macros, which is
191d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61   the.    ** defa
191e0 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66  ult setting.  If
191f0 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
19200 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57  e is 1, then ALW
19210 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a  AYS() is either.
19220 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65      ** hard-code
19230 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73  d to true or els
19240 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20  e it asserts if 
19250 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20  its argument is 
19260 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68  false..    ** Th
19270 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72  e first behavior
19280 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20   (hard-coded to 
19290 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73  true) is the cas
192a0 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49  e if.    ** SQLI
192b0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
192c0 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73  RT shows that as
192d0 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
192e0 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e  ed and the secon
192f0 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f  d.    ** behavio
19300 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65  r (assert if the
19310 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57   argument to ALW
19320 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20  AYS() is false) 
19330 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20  is the case if. 
19340 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53     ** SQLITE_TES
19350 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f  TCTRL_ASSERT sho
19360 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29  ws that assert()
19370 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20   is enabled..   
19380 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72   **.    ** The r
19390 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f  un-time test pro
193a0 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f  cedure might loo
193b0 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65  k something like
193c0 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20   this:.    **.  
193d0 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69    **    if( sqli
193e0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
193f0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
19400 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29  _ALWAYS, 2)==2 )
19410 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
19420 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45   ALWAYS() and NE
19430 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20  VER() are no-op 
19440 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63  pass-through mac
19450 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65  ros.    **    }e
19460 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f  lse if( sqlite3_
19470 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
19480 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
19490 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a  ERT, 1) ){.    *
194a0 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
194b0 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74  (x) asserts that
194c0 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45   x is true. NEVE
194d0 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69  R(x) asserts x i
194e0 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20  s false..    ** 
194f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a     }else{.    **
19500 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
19510 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  x) is a constant
19520 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73   1.  NEVER(x) is
19530 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20   a constant 0.. 
19540 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a     **    }.    *
19550 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
19560 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59  E_TESTCTRL_ALWAY
19570 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78  S: {.      int x
19580 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
19590 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c  );.      rc = AL
195a0 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62  WAYS(x);.      b
195b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
195c0 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
195d0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
195e0 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52  E_TESTCTRL_RESER
195f0 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  VE, sqlite3 *db,
19600 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
19610 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52     ** Set the nR
19620 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e  eserve size to N
19630 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
19640 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61  tabase on the da
19650 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f  tabase.    ** co
19660 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20  nnection db..   
19670 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
19680 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
19690 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  ERVE: {.      sq
196a0 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
196b0 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
196c0 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20  ;.      int x = 
196d0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a  va_arg(ap,int);.
196e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
196f0 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
19700 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  tex);.      sqli
19710 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53  te3BtreeSetPageS
19720 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  ize(db->aDb[0].p
19730 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20  Bt, 0, x, 0);.  
19740 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
19750 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
19760 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  x);.      break;
19770 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
19780 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
19790 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
197a0 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f  CTRL_OPTIMIZATIO
197b0 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  NS, sqlite3 *db,
197c0 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20   int N).    **. 
197d0 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20     ** Enable or 
197e0 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20  disable various 
197f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f  optimizations fo
19800 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73  r testing purpos
19810 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a  es.  The .    **
19820 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61   argument N is a
19830 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69   bitmask of opti
19840 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20  mizations to be 
19850 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e  disabled.  For n
19860 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65  ormal.    ** ope
19870 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20  ration N should 
19880 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20  be 0.  The idea 
19890 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70  is that a test p
198a0 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65  rogram (like the
198b0 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69  .    ** SQL Logi
198c0 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65  c Test or SLT te
198d0 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72  st module) can r
198e0 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20  un the same SQL 
198f0 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20  multiple times. 
19900 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f     ** with vario
19910 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73  us optimizations
19920 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72   disabled to ver
19930 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d  ify that the sam
19940 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20  e answer.    ** 
19950 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65  is obtained in e
19960 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a  very case..    *
19970 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
19980 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
19990 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20  IZATIONS: {.    
199a0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
199b0 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
199c0 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  e3*);.      db->
199d0 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31  dbOptFlags = (u1
199e0 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e  6)(va_arg(ap, in
199f0 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20  t) & 0xffff);.  
19a00 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
19a10 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
19a20 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a  N_KEYWORD.    /*
19a30 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
19a40 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
19a50 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c  TCTRL_ISKEYWORD,
19a60 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f   const char *zWo
19a70 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  rd).    **.    *
19a80 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20  * If zWord is a 
19a90 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a  keyword recogniz
19aa0 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72  ed by the parser
19ab0 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68  , then return th
19ac0 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20  e.    ** number 
19ad0 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72  of keywords.  Or
19ae0 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74   if zWord is not
19af0 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75   a keyword, retu
19b00 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20  rn 0..    ** .  
19b10 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66    ** This test f
19b20 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61  eature is only a
19b30 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20  vailable in the 
19b40 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e  amalgamation sin
19b50 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51  ce.    ** the SQ
19b60 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d  LITE_N_KEYWORD m
19b70 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69  acro is not defi
19b80 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65  ned in this file
19b90 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a   if SQLite.    *
19ba0 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67  * is built using
19bb0 20 73 65 70 61 72 61 74 65 20 73 6f 75 72 63 65   separate source
19bc0 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20   files..    */. 
19bd0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
19be0 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52  ESTCTRL_ISKEYWOR
19bf0 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  D: {.      const
19c00 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76   char *zWord = v
19c10 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20  a_arg(ap, const 
19c20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e  char*);.      in
19c30 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72  t n = sqlite3Str
19c40 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20  len30(zWord);.  
19c50 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65      rc = (sqlite
19c60 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38  3KeywordCode((u8
19c70 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f  *)zWord, n)!=TK_
19c80 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b  ID) ? SQLITE_N_K
19c90 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20  EYWORD : 0;.    
19ca0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
19cb0 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73  endif ..    /* s
19cc0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
19cd0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
19ce0 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f  TRL_SCRATCHMALLO
19cf0 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46  C, sz, &pNew, pF
19d00 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  ree);.    **.   
19d10 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20 69   ** Pass pFree i
19d20 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74  nto sqlite3Scrat
19d30 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a  chFree(). .    *
19d40 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61  * If sz>0 then a
19d50 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74 63  llocate a scratc
19d60 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e  h buffer into pN
19d70 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20  ew.  .    */.   
19d80 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
19d90 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c  TCTRL_SCRATCHMAL
19da0 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69  LOC: {.      voi
19db0 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65  d *pFree, **ppNe
19dc0 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b  w;.      int sz;
19dd0 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61  .      sz = va_a
19de0 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
19df0 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72     ppNew = va_ar
19e00 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20  g(ap, void**);. 
19e10 20 20 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f       pFree = va_
19e20 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
19e30 20 20 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a        if( sz ) *
19e40 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53  ppNew = sqlite3S
19e50 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29  cratchMalloc(sz)
19e60 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  ;.      sqlite3S
19e70 63 72 61 74 63 68 46 72 65 65 28 70 46 72 65 65  cratchFree(pFree
19e80 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19e90 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
19ea0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
19eb0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
19ec0 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46  CTRL_LOCALTIME_F
19ed0 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29  AULT, int onoff)
19ee0 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
19ef0 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f  If parameter ono
19f00 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  ff is non-zero, 
19f10 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77 72  configure the wr
19f20 61 70 70 65 72 73 20 73 6f 20 74 68 61 74 20 61  appers so that a
19f30 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71  ll.    ** subseq
19f40 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f  uent calls to lo
19f50 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76 61  caltime() and va
19f60 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20  riants fail. If 
19f70 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20  onoff is zero,. 
19f80 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20     ** undo this 
19f90 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a  setting..    */.
19fa0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
19fb0 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
19fc0 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20  ME_FAULT: {.    
19fd0 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
19fe0 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65  onfig.bLocaltime
19ff0 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61  Fault = va_arg(a
1a000 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
1a010 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
1a020 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1a030 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
1a040 41 49 4e 29 0a 20 20 20 20 2f 2a 20 20 20 73 71  AIN).    /*   sq
1a050 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1a060 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1a070 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d 54 2c  RL_EXPLAIN_STMT,
1a080 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20  .    **         
1a090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1a0a0 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 63 6f 6e  qlite3_stmt*,con
1a0b0 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20 20  st char**);.    
1a0c0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 63 6f 6d  **.    ** If com
1a0d0 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49 54  piled with SQLIT
1a0e0 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58  E_ENABLE_TREE_EX
1a0f0 50 4c 41 49 4e 2c 20 65 61 63 68 20 73 71 6c 69  PLAIN, each sqli
1a100 74 65 33 5f 73 74 6d 74 20 68 6f 6c 64 73 0a 20  te3_stmt holds. 
1a110 20 20 20 2a 2a 20 61 20 73 74 72 69 6e 67 20 74     ** a string t
1a120 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
1a130 65 20 6f 70 74 69 6d 69 7a 65 64 20 70 61 72 73  e optimized pars
1a140 65 20 74 72 65 65 2e 20 20 54 68 69 73 20 74 65  e tree.  This te
1a150 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20 20 20 20 2a  st-control.    *
1a160 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  * returns a poin
1a170 74 65 72 20 74 6f 20 74 68 61 74 20 73 74 72 69  ter to that stri
1a180 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ng..    */.    c
1a190 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
1a1a0 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d 54  TRL_EXPLAIN_STMT
1a1b0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1a1c0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
1a1d0 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1a1e0 65 33 5f 73 74 6d 74 2a 29 3b 0a 20 20 20 20 20  e3_stmt*);.     
1a1f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a   const char **pz
1a200 52 65 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Ret = va_arg(ap,
1a210 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a   const char**);.
1a220 20 20 20 20 20 20 2a 70 7a 52 65 74 20 3d 20 73        *pzRet = s
1a230 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61 6e  qlite3VdbeExplan
1a240 61 74 69 6f 6e 28 28 56 64 62 65 2a 29 70 53 74  ation((Vdbe*)pSt
1a250 6d 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  mt);.      break
1a260 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1a270 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33      /*   sqlite3
1a280 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1a290 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45  LITE_TESTCTRL_NE
1a2a0 56 45 52 5f 43 4f 52 52 55 50 54 2c 20 69 6e 74  VER_CORRUPT, int
1a2b0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
1a2c0 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61 20   Set or clear a 
1a2d0 66 6c 61 67 20 74 68 61 74 20 69 6e 64 69 63 61  flag that indica
1a2e0 74 65 73 20 74 68 61 74 20 74 68 65 20 64 61 74  tes that the dat
1a2f0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 61 6c  abase file is al
1a300 77 61 79 73 20 77 65 6c 6c 2d 0a 20 20 20 20 2a  ways well-.    *
1a310 2a 20 66 6f 72 6d 65 64 20 61 6e 64 20 6e 65 76  * formed and nev
1a320 65 72 20 63 6f 72 72 75 70 74 2e 20 20 54 68 69  er corrupt.  Thi
1a330 73 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 20  s flag is clear 
1a340 62 79 20 64 65 66 61 75 6c 74 2c 20 69 6e 64 69  by default, indi
1a350 63 61 74 69 6e 67 20 74 68 61 74 0a 20 20 20 20  cating that.    
1a360 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1a370 73 20 6d 69 67 68 74 20 68 61 76 65 20 61 72 62  s might have arb
1a380 69 74 72 61 72 79 20 63 6f 72 72 75 70 74 69 6f  itrary corruptio
1a390 6e 2e 20 20 53 65 74 74 69 6e 67 20 74 68 65 20  n.  Setting the 
1a3a0 66 6c 61 67 20 64 75 72 69 6e 67 0a 20 20 20 20  flag during.    
1a3b0 2a 2a 20 74 65 73 74 69 6e 67 20 63 61 75 73 65  ** testing cause
1a3c0 73 20 63 65 72 74 61 69 6e 20 61 73 73 65 72 74  s certain assert
1a3d0 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
1a3e0 20 74 68 65 20 63 6f 64 65 20 74 6f 20 62 65 20   the code to be 
1a3f0 61 63 74 69 76 61 74 65 64 0a 20 20 20 20 2a 2a  activated.    **
1a400 20 74 68 61 74 20 64 65 6d 6f 6e 73 74 72 61 74   that demonstrat
1a410 20 69 6e 76 61 72 69 61 6e 74 73 20 6f 6e 20 77   invariants on w
1a420 65 6c 6c 2d 66 6f 72 6d 65 64 20 64 61 74 61 62  ell-formed datab
1a430 61 73 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a  ase files..    *
1a440 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1a450 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52  E_TESTCTRL_NEVER
1a460 5f 43 4f 52 52 55 50 54 3a 20 7b 0a 20 20 20 20  _CORRUPT: {.    
1a470 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1a480 6f 6e 66 69 67 2e 6e 65 76 65 72 43 6f 72 72 75  onfig.neverCorru
1a490 70 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  pt = va_arg(ap, 
1a4a0 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
1a4b0 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f  k;.    }...    /
1a4c0 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1a4d0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1a4e0 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f  TESTCTRL_VDBE_CO
1a4f0 56 45 52 41 47 45 2c 20 78 43 61 6c 6c 62 61 63  VERAGE, xCallbac
1a500 6b 2c 20 70 74 72 29 3b 0a 20 20 20 20 2a 2a 0a  k, ptr);.    **.
1a510 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 56      ** Set the V
1a520 44 42 45 20 63 6f 76 65 72 61 67 65 20 63 61 6c  DBE coverage cal
1a530 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 74  lback function t
1a540 6f 20 78 43 61 6c 6c 62 61 63 6b 20 77 69 74 68  o xCallback with
1a550 20 63 6f 6e 74 65 78 74 20 0a 20 20 20 20 2a 2a   context .    **
1a560 20 70 6f 69 6e 74 65 72 20 70 74 72 2e 0a 20 20   pointer ptr..  
1a570 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1a580 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 56 44  LITE_TESTCTRL_VD
1a590 42 45 5f 43 4f 56 45 52 41 47 45 3a 20 7b 0a 23  BE_COVERAGE: {.#
1a5a0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 56 44 42  ifdef SQLITE_VDB
1a5b0 45 5f 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20  E_COVERAGE.     
1a5c0 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a   typedef void (*
1a5d0 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29  branch_callback)
1a5e0 28 76 6f 69 64 2a 2c 69 6e 74 2c 75 38 2c 75 38  (void*,int,u8,u8
1a5f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1a600 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 56 64  GlobalConfig.xVd
1a610 62 65 42 72 61 6e 63 68 20 3d 20 76 61 5f 61 72  beBranch = va_ar
1a620 67 28 61 70 2c 62 72 61 6e 63 68 5f 63 61 6c 6c  g(ap,branch_call
1a630 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 73 71 6c  back);.      sql
1a640 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1a650 2e 70 56 64 62 65 42 72 61 6e 63 68 41 72 67 20  .pVdbeBranchArg 
1a660 3d 20 76 61 5f 61 72 67 28 61 70 2c 76 6f 69 64  = va_arg(ap,void
1a670 2a 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  *);.#endif.     
1a680 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1a690 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
1a6a0 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1a6b0 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54  E_OMIT_BUILTIN_T
1a6c0 45 53 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  EST */.  return 
1a6d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
1a6e0 73 20 69 73 20 61 20 75 74 69 6c 69 74 79 20 72  s is a utility r
1a6f0 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74  outine, useful t
1a700 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  o VFS implementa
1a710 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63  tions, that chec
1a720 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20  ks.** to see if 
1a730 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  a database file 
1a740 77 61 73 20 61 20 55 52 49 20 74 68 61 74 20 63  was a URI that c
1a750 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65 63 69  ontained a speci
1a760 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61  fic query .** pa
1a770 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20  rameter, and if 
1a780 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76  so obtains the v
1a790 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75 65 72  alue of the quer
1a7a0 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a  y parameter..**.
1a7b0 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65  ** The zFilename
1a7c0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1a7d0 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65   filename pointe
1a7e0 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68  r passed into th
1a7f0 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74  e xOpen().** met
1a800 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70  hod of a VFS imp
1a810 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68  lementation.  Th
1a820 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e  e zParam argumen
1a830 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  t is the name of
1a840 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61   the.** query pa
1a850 72 61 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e  rameter we seek.
1a860 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
1a870 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65  eturns the value
1a880 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a   of the zParam.*
1a890 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66 20 69  * parameter if i
1a8a0 74 20 65 78 69 73 74 73 2e 20 20 49 66 20 74 68  t exists.  If th
1a8b0 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73  e parameter does
1a8c0 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73   not exist, this
1a8d0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
1a8e0 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74  rns a NULL point
1a8f0 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  er..*/.const cha
1a900 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70  r *sqlite3_uri_p
1a910 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63  arameter(const c
1a920 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
1a930 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
1a940 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65  am){.  if( zFile
1a950 6e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e  name==0 ) return
1a960 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20   0;.  zFilename 
1a970 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  += sqlite3Strlen
1a980 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20  30(zFilename) + 
1a990 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c  1;.  while( zFil
1a9a0 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20  ename[0] ){.    
1a9b0 69 6e 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a  int x = strcmp(z
1a9c0 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d  Filename, zParam
1a9d0 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
1a9e0 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
1a9f0 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  n30(zFilename) +
1aa00 20 31 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30   1;.    if( x==0
1aa10 20 29 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e   ) return zFilen
1aa20 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  ame;.    zFilena
1aa30 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
1aa40 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
1aa50 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   + 1;.  }.  retu
1aa60 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
1aa70 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20  eturn a boolean 
1aa80 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72  value for a quer
1aa90 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a  y parameter..*/.
1aaa0 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  int sqlite3_uri_
1aab0 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68  boolean(const ch
1aac0 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63  ar *zFilename, c
1aad0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61  onst char *zPara
1aae0 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20  m, int bDflt){. 
1aaf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1ab00 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72   sqlite3_uri_par
1ab10 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65  ameter(zFilename
1ab20 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66  , zParam);.  bDf
1ab30 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20  lt = bDflt!=0;. 
1ab40 20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69   return z ? sqli
1ab50 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c  te3GetBoolean(z,
1ab60 20 62 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b   bDflt) : bDflt;
1ab70 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
1ab80 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65   a 64-bit intege
1ab90 72 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75  r value for a qu
1aba0 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
1abb0 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  /.sqlite3_int64 
1abc0 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36  sqlite3_uri_int6
1abd0 34 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  4(.  const char 
1abe0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f  *zFilename,    /
1abf0 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61  * Filename as pa
1ac00 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f  ssed to xOpen */
1ac10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1ac20 50 61 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20  Param,       /* 
1ac30 55 52 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f  URI parameter so
1ac40 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ught */.  sqlite
1ac50 33 5f 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20  3_int64 bDflt   
1ac60 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66      /* return if
1ac70 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69   parameter is mi
1ac80 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f  ssing */.){.  co
1ac90 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71  nst char *z = sq
1aca0 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65  lite3_uri_parame
1acb0 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  ter(zFilename, z
1acc0 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65  Param);.  sqlite
1acd0 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28  3_int64 v;.  if(
1ace0 20 7a 20 26 26 20 73 71 6c 69 74 65 33 41 74 6f   z && sqlite3Ato
1acf0 69 36 34 28 7a 2c 20 26 76 2c 20 73 71 6c 69 74  i64(z, &v, sqlit
1ad00 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53  e3Strlen30(z), S
1ad10 51 4c 49 54 45 5f 55 54 46 38 29 3d 3d 53 51 4c  QLITE_UTF8)==SQL
1ad20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44  ITE_OK ){.    bD
1ad30 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72  flt = v;.  }.  r
1ad40 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a  eturn bDflt;.}..
1ad50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1ad60 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69   Btree pointer i
1ad70 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62  dentified by zDb
1ad80 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55  Name.  Return NU
1ad90 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
1ada0 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74  .*/.Btree *sqlit
1adb0 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28  e3DbNameToBtree(
1adc0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1add0 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1ade0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
1adf0 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62  r(i=0; i<db->nDb
1ae00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1ae10 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20  db->aDb[i].pBt. 
1ae20 20 20 20 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d      && (zDbName=
1ae30 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  =0 || sqlite3Str
1ae40 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62  ICmp(zDbName, db
1ae50 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d  ->aDb[i].zName)=
1ae60 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0).    ){.     
1ae70 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b   return db->aDb[
1ae80 69 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20  i].pBt;.    }.  
1ae90 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1aea0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
1aeb0 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68  e filename of th
1aec0 65 20 64 61 74 61 62 61 73 65 20 61 73 73 6f 63  e database assoc
1aed0 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74  iated with a dat
1aee0 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74  abase.** connect
1aef0 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ion..*/.const ch
1af00 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66  ar *sqlite3_db_f
1af10 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20  ilename(sqlite3 
1af20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1af30 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72  *zDbName){.  Btr
1af40 65 65 20 2a 70 42 74 20 3d 20 73 71 6c 69 74 65  ee *pBt = sqlite
1af50 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
1af60 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72  b, zDbName);.  r
1af70 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69  eturn pBt ? sqli
1af80 74 65 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e  te3BtreeGetFilen
1af90 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a  ame(pBt) : 0;.}.
1afa0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  ./*.** Return 1 
1afb0 69 66 20 64 61 74 61 62 61 73 65 20 69 73 20 72  if database is r
1afc0 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66  ead-only or 0 if
1afd0 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65   read/write.  Re
1afe0 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f  turn -1 if.** no
1aff0 20 73 75 63 68 20 64 61 74 61 62 61 73 65 20 65   such database e
1b000 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  xists..*/.int sq
1b010 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c  lite3_db_readonl
1b020 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  y(sqlite3 *db, c
1b030 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1b040 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42  me){.  Btree *pB
1b050 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d  t = sqlite3DbNam
1b060 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62  eToBtree(db, zDb
1b070 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Name);.  return 
1b080 70 42 74 20 3f 20 73 71 6c 69 74 65 33 50 61 67  pBt ? sqlite3Pag
1b090 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 73 71 6c  erIsreadonly(sql
1b0a0 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
1b0b0 42 74 29 29 20 3a 20 2d 31 3b 0a 7d 0a           Bt)) : -1;.}.