/ Hex Artifact Content
Login

Artifact f6eb795f17eb88205b55e5116fb37e6593707d82:


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 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1310: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 7b  NABLE_SQLLOG.  {
1320: 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64  .    extern void
1330: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
1340: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
1350: 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c  sqlite3_init_sql
1360: 6c 6f 67 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  log();.  }.#endi
1370: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
1380: 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73  e the mutex subs
1390: 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c  ystem is initial
13a0: 69 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65  ized.  If unable
13b0: 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61   to .  ** initia
13c0: 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73  lize the mutex s
13d0: 75 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e  ubsystem, return
13e0: 20 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20   early with the 
13f0: 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74  error..  ** If t
1400: 68 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20  he system is so 
1410: 73 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65  sick that we are
1420: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
1430: 61 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a  ate a mutex,.  *
1440: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d  * there is not m
1450: 75 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f  uch SQLite is go
1460: 69 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74  ing to be able t
1470: 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  o do..  **.  ** 
1480: 54 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  The mutex subsys
1490: 74 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61  tem must take ca
14a0: 72 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e  re of serializin
14b0: 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69  g its own.  ** i
14c0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20  nitialization.. 
14d0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
14e0: 65 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20  e3MutexInit();. 
14f0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1500: 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69   rc;..  /* Initi
1510: 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63  alize the malloc
1520: 28 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68  () system and th
1530: 65 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69  e recursive pIni
1540: 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20  tMutex mutex..  
1550: 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f  ** This operatio
1560: 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  n is protected b
1570: 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53  y the STATIC_MAS
1580: 54 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65  TER mutex.  Note
1590: 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78   that.  ** Mutex
15a0: 41 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65  Alloc() is calle
15b0: 64 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d  d for a static m
15c0: 75 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e  utex prior to in
15d0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20  itializing the. 
15e0: 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79   ** malloc subsy
15f0: 73 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c  stem - this impl
1600: 69 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c  ies that the all
1610: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61  ocation of a sta
1620: 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d  tic.  ** mutex m
1630: 75 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20  ust not require 
1640: 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65  support from the
1650: 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65   malloc subsyste
1660: 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f  m..  */.  MUTEX_
1670: 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
1680: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
1690: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
16a0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
16b0: 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
16c0: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
16d0: 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ;.  sqlite3Globa
16e0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
16f0: 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  nit = 1;.  if( !
1700: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1710: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1720: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1730: 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29  ite3MallocInit()
1740: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1750: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1760: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1770: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
1780: 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21  t = 1;.    if( !
1790: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17a0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29  fig.pInitMutex )
17b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
17c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
17d0: 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20  tMutex =.       
17e0: 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78      sqlite3Mutex
17f0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
1800: 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20  EX_RECURSIVE);. 
1810: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1820: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
1830: 72 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69  reMutex && !sqli
1840: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1850: 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20  pInitMutex ){.  
1860: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1870: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
1880: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1890: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
18b0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
18c0: 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20  itMutex++;.  }. 
18d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
18e0: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
18f0: 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f    /* If rc is no
1900: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74  t SQLITE_OK at t
1910: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
1920: 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f  either the mallo
1930: 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d  c.  ** subsystem
1940: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e   could not be in
1950: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65  itialized or the
1960: 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74   system failed t
1970: 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  o allocate.  ** 
1980: 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  the pInitMutex m
1990: 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20  utex. Return an 
19a0: 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20  error in either 
19b0: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  case.  */.  if( 
19c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
19e0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65    }..  /* Do the
19f0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69   rest of the ini
1a00: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65  tialization unde
1a10: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  r the recursive 
1a20: 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68  mutex so.  ** th
1a30: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62  at we will be ab
1a40: 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63  le to handle rec
1a50: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
1a60: 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  o.  ** sqlite3_i
1a70: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68  nitialize().  Th
1a80: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1a90: 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20  s normally come 
1aa0: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c  through.  ** sql
1ab0: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1ac0: 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73  hen it invokes s
1ad0: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1ae0: 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72  ter(), but other
1af0: 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20  .  ** recursive 
1b00: 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f  calls might also
1b10: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   be possible..  
1b20: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
1b30: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31  TATION-OF: R-001
1b40: 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20  40-37445 SQLite 
1b50: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
1b60: 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20  rializes calls. 
1b70: 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74   ** to the xInit
1b80: 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20   method, so the 
1b90: 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65  xInit method nee
1ba0: 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73  d not be threads
1bb0: 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  afe..  **.  ** T
1bc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74  he following mut
1bd0: 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61  ex is what seria
1be0: 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20  lizes access to 
1bf0: 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68  the appdef pcach
1c00: 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74  e xInit.  ** met
1c10: 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74  hods.  The sqlit
1c20: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
1c30: 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73  s.xInit() all is
1c40: 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65   embedded in the
1c50: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
1c60: 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69  lite3PcacheIniti
1c70: 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  alize()..  */.  
1c80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1c90: 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ter(sqlite3Globa
1ca0: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1cb0: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
1cc0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1cd0: 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69  sInit==0 && sqli
1ce0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1cf0: 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b  inProgress==0 ){
1d00: 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61 73 68  .    FuncDefHash
1d10: 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41   *pHash = &GLOBA
1d20: 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73  L(FuncDefHash, s
1d30: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63  qlite3GlobalFunc
1d40: 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69  tions);.    sqli
1d50: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1d60: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a  inProgress = 1;.
1d70: 20 20 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68      memset(pHash
1d80: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
1d90: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
1da0: 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ns));.    sqlite
1db0: 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46  3RegisterGlobalF
1dc0: 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20  unctions();.    
1dd0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( 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 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
1e00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
1e10: 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b  cheInitialize();
1e20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1e30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1e50: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
1e60: 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  heInit = 1;.    
1e70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e80: 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20  Init();.    }.  
1e90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ea0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1eb0: 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65 72  ite3PCacheBuffer
1ec0: 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c  Setup( sqlite3Gl
1ed0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65  obalConfig.pPage
1ee0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
1ef0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1f00: 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33  .szPage, sqlite3
1f10: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61  GlobalConfig.nPa
1f20: 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ge);.      sqlit
1f30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1f40: 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65  sInit = 1;.#ifde
1f50: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  f SQLITE_EXTRA_I
1f60: 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78  NIT.      bRunEx
1f70: 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e  traInit = 1;.#en
1f80: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  dif.    }.    sq
1f90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1fa0: 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30  g.inProgress = 0
1fb0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1fc0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
1fd0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1fe0: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20  pInitMutex);..  
1ff0: 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72  /* Go back under
2000: 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74 65   the static mute
2010: 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74  x and clean up t
2020: 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a  he recursive.  *
2030: 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65  * mutex to preve
2040: 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65  nt a resource le
2050: 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ak..  */.  sqlit
2060: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
2070: 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Master);.  sqlit
2080: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2090: 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a  RefInitMutex--;.
20a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
20b0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
20c0: 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20  itMutex<=0 ){.  
20d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
20f0: 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29  efInitMutex==0 )
2100: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
2110: 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33  tex_free(sqlite3
2120: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
2130: 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71  itMutex);.    sq
2140: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2150: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30  g.pInitMutex = 0
2160: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2170: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
2180: 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ter);..  /* The 
2190: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73  following is jus
21a0: 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  t a sanity check
21b0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51   to make sure SQ
21c0: 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65  Lite has.  ** be
21d0: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72  en compiled corr
21e0: 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d  ectly.  It is im
21f0: 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74  portant to run t
2200: 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20  his code, but.  
2210: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
2220: 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f   to run it too o
2230: 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70  ften and soak up
2240: 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20   CPU cycles for 
2250: 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20  no.  ** reason. 
2260: 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e   So we run it on
2270: 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61  ce during initia
2280: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  lization..  */.#
2290: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69  ifndef NDEBUG.#i
22a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22b0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
22c0: 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69  .  /* This secti
22d0: 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c  on of code's onl
22e0: 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76 69  y "output" is vi
22f0: 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  a assert() state
2300: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28  ments. */.  if (
2310: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2320: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2330: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2340: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2350: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
2360: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
2370: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
2380: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
2390: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
23a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
23b0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
23c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
23d0: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
23e0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
23f0: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2400: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2410: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2420: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2430: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2440: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2450: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
2460: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
2470: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2480: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
2490: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24a0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
24b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
24c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24d0: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
24e0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
24f0: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2500: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2510: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2520: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2530: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2540: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2550: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
2560: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
2570: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
2580: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
2590: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
25a0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
25b0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
25c0: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
25d0: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
25e0: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
25f0: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2600: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2610: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2620: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2630: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2640: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2650: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2660: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2670: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2680: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2690: 69 64 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  id){.  if( sqlit
26a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
26b0: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
26c0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
26d0: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
26e0: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
26f0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2700: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2710: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2720: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2730: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2740: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2750: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2760: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2770: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2780: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2790: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
27a0: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
27b0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
27c0: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
27d0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
27e0: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
27f0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2800: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2810: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2820: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2830: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2840: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2850: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2860: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2870: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2880: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2890: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
28a0: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
28b0: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
28c0: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
28d0: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
28e0: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
28f0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2900: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2910: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2920: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2930: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2940: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2950: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2960: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2970: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2980: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2990: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
29a0: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
29b0: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
29c0: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
29d0: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
29e0: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
29f0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2a00: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2a10: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2a20: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2a30: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2a40: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2a50: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2a60: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2a70: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2a80: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2a90: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2aa0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2ab0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2ac0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2ad0: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2ae0: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2af0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2b00: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2b10: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2b20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2b40: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
2b50: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
2b60: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
2b70: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
2b80: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
2b90: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
2ba0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2bb0: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
2bc0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
2bd0: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
2be0: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
2bf0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
2c00: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2c10: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
2c20: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
2c30: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
2c40: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
2c50: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
2c60: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
2c70: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
2c80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
2c90: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
2ca0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2cb0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2cc0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
2cd0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
2ce0: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
2cf0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
2d00: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
2d10: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
2d20: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
2d30: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
2d40: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d50: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
2d60: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
2d70: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
2d80: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
2d90: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
2da0: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
2db0: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
2dc0: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
2dd0: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
2de0: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
2df0: 20 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66   .    */.#if def
2e00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45  ined(SQLITE_THRE
2e10: 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54  ADSAFE) && SQLIT
2e20: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 20  E_THREADSAFE>0. 
2e30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2e40: 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
2e50: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  AD: {.      /* D
2e60: 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78  isable all mutex
2e70: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ing */.      sql
2e80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2e90: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b  .bCoreMutex = 0;
2ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2eb0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
2ec0: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Mutex = 0;.     
2ed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2ee0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2ef0: 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44  NFIG_MULTITHREAD
2f00: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73  : {.      /* Dis
2f10: 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66  able mutexing of
2f20: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2f30: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f  tions */.      /
2f40: 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e  * Enable mutexin
2f50: 67 20 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73  g of core data s
2f60: 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
2f70: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2f80: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
2f90: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  x = 1;.      sql
2fa0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2fb0: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b  .bFullMutex = 0;
2fc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2fd0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2fe0: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41  ITE_CONFIG_SERIA
2ff0: 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f  LIZED: {.      /
3000: 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20 6d 75 74  * Enable all mut
3010: 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73  exing */.      s
3020: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3030: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
3040: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
3050: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
3060: 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20  llMutex = 1;.   
3070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3080: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3090: 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a  CONFIG_MUTEX: {.
30a0: 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79        /* Specify
30b0: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
30c0: 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61  mutex implementa
30d0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
30e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
30f0: 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72  g.mutex = *va_ar
3100: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75  g(ap, sqlite3_mu
3110: 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20  tex_methods*);. 
3120: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3130: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
3140: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45  E_CONFIG_GETMUTE
3150: 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  X: {.      /* Re
3160: 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65  trieve the curre
3170: 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  nt mutex impleme
3180: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
3190: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
31a0: 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f  ite3_mutex_metho
31b0: 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  ds*) = sqlite3Gl
31c0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78  obalConfig.mutex
31d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
31e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20     }.#endif...  
31f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3200: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  NFIG_MALLOC: {. 
3210: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
3220: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
3230: 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61  alloc implementa
3240: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
3250: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3260: 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  g.m = *va_arg(ap
3270: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
3280: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
3290: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
32a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
32b0: 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a  IG_GETMALLOC: {.
32c0: 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76        /* Retriev
32d0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  e the current ma
32e0: 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74  lloc() implement
32f0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
3300: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
3310: 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63  Config.m.xMalloc
3320: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d 65 6d  ==0 ) sqlite3Mem
3330: 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20  SetDefault();.  
3340: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
3350: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3360: 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ods*) = sqlite3G
3370: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20  lobalConfig.m;. 
3380: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3390: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
33a0: 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54  E_CONFIG_MEMSTAT
33b0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  US: {.      /* E
33c0: 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
33d0: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 74 61 74   the malloc stat
33e0: 75 73 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 2a 2f  us collection */
33f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3400: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73  obalConfig.bMems
3410: 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tat = va_arg(ap,
3420: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
3430: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3440: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3450: 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20 20 20  _SCRATCH: {.    
3460: 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61    /* Designate a
3470: 20 62 75 66 66 65 72 20 66 6f 72 20 73 63 72 61   buffer for scra
3480: 74 63 68 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  tch memory space
3490: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
34a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
34b0: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
34c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
34d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
34e0: 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20  onfig.szScratch 
34f0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3500: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3510: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63  GlobalConfig.nSc
3520: 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61  ratch = va_arg(a
3530: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3540: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3550: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3560: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3570: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61        /* Designa
3580: 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20  te a buffer for 
3590: 70 61 67 65 20 63 61 63 68 65 20 6d 65 6d 6f 72  page cache memor
35a0: 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20  y space */.     
35b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
35c0: 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f  nfig.pPage = va_
35d0: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
35e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
35f0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65  balConfig.szPage
3600: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3610: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
3620: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
3630: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
3640: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
3650: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
3660: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3670: 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  G_PCACHE: {.    
3680: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
3690: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
36a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
36b0: 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48  _CONFIG_GETPCACH
36c0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
36d0: 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  w an error */.  
36e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
36f0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
3700: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
3710: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3720: 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20  G_PCACHE2: {.   
3730: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
3740: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67   alternative pag
3750: 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e  e cache implemen
3760: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
3770: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3780: 66 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76  fig.pcache2 = *v
3790: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
37a0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
37b0: 32 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  2*);.      break
37c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
37d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47   SQLITE_CONFIG_G
37e0: 45 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20  ETPCACHE2: {.   
37f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
3800: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
3810: 65 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  e2.xInit==0 ){. 
3820: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43         sqlite3PC
3830: 61 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29  acheSetDefault()
3840: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3850: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
3860: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
3870: 64 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ds2*) = sqlite3G
3880: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63  lobalConfig.pcac
3890: 68 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  he2;.      break
38a0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66  ;.    }..#if def
38b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
38c0: 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64  LE_MEMSYS3) || d
38d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
38e0: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20  ABLE_MEMSYS5).  
38f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3900: 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20  NFIG_HEAP: {.   
3910: 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20     /* Designate 
3920: 61 20 62 75 66 66 65 72 20 66 6f 72 20 68 65 61  a buffer for hea
3930: 70 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a  p memory space *
3940: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3950: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61  lobalConfig.pHea
3960: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  p = va_arg(ap, v
3970: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  oid*);.      sql
3980: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3990: 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .nHeap = va_arg(
39a0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
39b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
39c0: 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61  fig.mnReq = va_a
39d0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20  rg(ap, int);..  
39e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
39f0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
3a00: 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  q<1 ){.        s
3a10: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3a20: 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20  ig.mnReq = 1;.  
3a30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
3a40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3a50: 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20  g.mnReq>(1<<12) 
3a60: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61  ){.        /* ca
3a70: 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20 73 69  p min request si
3a80: 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20  ze at 2^12 */.  
3a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3aa0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20  balConfig.mnReq 
3ab0: 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20  = (1<<12);.     
3ac0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71   }..      if( sq
3ad0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3ae0: 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20  g.pHeap==0 ){.  
3af0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
3b00: 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20  heap pointer is 
3b10: 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f  NULL, then resto
3b20: 72 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d  re the malloc im
3b30: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20  plementation.   
3b40: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20       ** back to 
3b50: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f  NULL pointers to
3b60: 6f 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  o.  This will ca
3b70: 75 73 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74  use the malloc t
3b80: 6f 20 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  o go.        ** 
3b90: 62 61 63 6b 20 74 6f 20 69 74 73 20 64 65 66 61  back to its defa
3ba0: 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ult implementati
3bb0: 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f  on when sqlite3_
3bc0: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 0a  initialize() is.
3bd0: 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a          ** run..
3be0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
3bf0: 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74     memset(&sqlit
3c00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3c10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
3c20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3c30: 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  m));.      }else
3c40: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
3c50: 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73   heap pointer is
3c60: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
3c70: 69 6e 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74  install one of t
3c80: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65  he.        ** me
3c90: 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68  m5.c/mem3.c meth
3ca0: 6f 64 73 2e 20 49 66 20 6e 65 69 74 68 65 72 20  ods. If neither 
3cb0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 20 6e  ENABLE_MEMSYS3 n
3cc0: 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 4e  or.        ** EN
3cd0: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 69 73 20  ABLE_MEMSYS5 is 
3ce0: 64 65 66 69 6e 65 64 2c 20 72 65 74 75 72 6e 20  defined, return 
3cf0: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 20 20  an error..      
3d00: 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
3d10: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53  TE_ENABLE_MEMSYS
3d20: 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  3.        sqlite
3d30: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20  3GlobalConfig.m 
3d40: 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74  = *sqlite3MemGet
3d50: 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e 64 69  Memsys3();.#endi
3d60: 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  f.#ifdef SQLITE_
3d70: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 0a 20  ENABLE_MEMSYS5. 
3d80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c         sqlite3Gl
3d90: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d 20 2a  obalConfig.m = *
3da0: 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d 65 6d  sqlite3MemGetMem
3db0: 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66 0a 20  sys5();.#endif. 
3dc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3dd0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
3de0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3df0: 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49  E_CONFIG_LOOKASI
3e00: 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  DE: {.      sqli
3e10: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3e20: 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61  szLookaside = va
3e30: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3e40: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3e50: 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73  alConfig.nLookas
3e60: 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ide = va_arg(ap,
3e70: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
3e80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 0a 20  ak;.    }.    . 
3e90: 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 61 20 70     /* Record a p
3ea0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6c 6f  ointer to the lo
3eb0: 67 67 65 72 20 66 75 6e 63 63 74 69 6f 6e 20 61  gger funcction a
3ec0: 6e 64 20 69 74 73 20 66 69 72 73 74 20 61 72 67  nd its first arg
3ed0: 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ument..    ** Th
3ee0: 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e 55 4c  e default is NUL
3ef0: 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73 20 64  L.  Logging is d
3f00: 69 73 61 62 6c 65 64 20 69 66 20 74 68 65 20 66  isabled if the f
3f10: 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 20  unction pointer 
3f20: 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c 2e 0a  is.    ** NULL..
3f30: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
3f40: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f  SQLITE_CONFIG_LO
3f50: 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53  G: {.      /* MS
3f60: 56 43 20 69 73 20 70 69 63 6b 79 20 61 62 6f 75  VC is picky abou
3f70: 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70  t pulling func p
3f80: 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69 73 74  trs from va list
3f90: 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74 74 70  s..      ** http
3fa0: 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f  ://support.micro
3fb0: 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36  soft.com/kb/4796
3fc0: 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74  1.      ** sqlit
3fd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
3fe0: 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Log = va_arg(ap,
3ff0: 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a 2c 69   void(*)(void*,i
4000: 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 29  nt,const char*))
4010: 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ;.      */.     
4020: 20 74 79 70 65 64 65 66 20 76 6f 69 64 28 2a 4c   typedef void(*L
4030: 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c  OGFUNC_t)(void*,
4040: 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  int,const char*)
4050: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
4060: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
4070: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 4c 4f   = va_arg(ap, LO
4080: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
4090: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
40a0: 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20 76 61  fig.pLogArg = va
40b0: 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
40c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
40d0: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51    }..    case SQ
40e0: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52 49 3a  LITE_CONFIG_URI:
40f0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4100: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70  GlobalConfig.bOp
4110: 65 6e 55 72 69 20 3d 20 76 61 5f 61 72 67 28 61  enUri = va_arg(a
4120: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
4130: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
4140: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
4150: 46 49 47 5f 43 4f 56 45 52 49 4e 47 5f 49 4e 44  FIG_COVERING_IND
4160: 45 58 5f 53 43 41 4e 3a 20 7b 0a 20 20 20 20 20  EX_SCAN: {.     
4170: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
4180: 6e 66 69 67 2e 62 55 73 65 43 69 73 20 3d 20 76  nfig.bUseCis = v
4190: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
41a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
41b0: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
41c0: 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
41d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
41e0: 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f 47 3a 20 7b  CONFIG_SQLLOG: {
41f0: 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76  .      typedef v
4200: 6f 69 64 28 2a 53 51 4c 4c 4f 47 46 55 4e 43 5f  oid(*SQLLOGFUNC_
4210: 74 29 28 76 6f 69 64 2a 2c 20 73 71 6c 69 74 65  t)(void*, sqlite
4220: 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  3*, const char*,
4230: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
4240: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4250: 2e 78 53 71 6c 6c 6f 67 20 3d 20 76 61 5f 61 72  .xSqllog = va_ar
4260: 67 28 61 70 2c 20 53 51 4c 4c 4f 47 46 55 4e 43  g(ap, SQLLOGFUNC
4270: 5f 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  _t);.      sqlit
4280: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
4290: 53 71 6c 6c 6f 67 41 72 67 20 3d 20 76 61 5f 61  SqllogArg = va_a
42a0: 72 67 28 61 70 2c 20 76 6f 69 64 20 2a 29 3b 0a  rg(ap, void *);.
42b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
42c0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63   }.#endif..    c
42d0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
42e0: 47 5f 4d 4d 41 50 5f 53 49 5a 45 3a 20 7b 0a 20  G_MMAP_SIZE: {. 
42f0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74       sqlite3_int
4300: 36 34 20 73 7a 4d 6d 61 70 20 3d 20 76 61 5f 61  64 szMmap = va_a
4310: 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69  rg(ap, sqlite3_i
4320: 6e 74 36 34 29 3b 0a 20 20 20 20 20 20 73 71 6c  nt64);.      sql
4330: 69 74 65 33 5f 69 6e 74 36 34 20 6d 78 4d 6d 61  ite3_int64 mxMma
4340: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  p = va_arg(ap, s
4350: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20  qlite3_int64);. 
4360: 20 20 20 20 20 69 66 28 20 6d 78 4d 6d 61 70 3c       if( mxMmap<
4370: 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e 53 51 4c 49  0 || mxMmap>SQLI
4380: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
4390: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 78 4d 6d   ){.        mxMm
43a0: 61 70 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  ap = SQLITE_MAX_
43b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
43c0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
43d0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 78 4d  GlobalConfig.mxM
43e0: 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a 20 20  map = mxMmap;.  
43f0: 20 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3c 30      if( szMmap<0
4400: 20 29 20 73 7a 4d 6d 61 70 20 3d 20 53 51 4c 49   ) szMmap = SQLI
4410: 54 45 5f 44 45 46 41 55 4c 54 5f 4d 4d 41 50 5f  TE_DEFAULT_MMAP_
4420: 53 49 5a 45 3b 0a 20 20 20 20 20 20 69 66 28 20  SIZE;.      if( 
4430: 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61 70 29 20 73  szMmap>mxMmap) s
4440: 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70 3b 0a  zMmap = mxMmap;.
4450: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4460: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
4470: 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20 20 20 20 20   = szMmap;.     
4480: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4490: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
44a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
44b0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
44c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
44d0: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
44e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
44f0: 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f  * Set up the loo
4500: 6b 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66  kaside buffers f
4510: 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
4520: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74  nnection..** Ret
4530: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
4540: 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49   success.  .** I
4550: 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61  f lookaside is a
4560: 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72  lready active, r
4570: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
4580: 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20  Y..**.** The sz 
4590: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
45a0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
45b0: 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69   in each lookasi
45c0: 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20  de slot..** The 
45d0: 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  cnt parameter is
45e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
45f0: 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74  lots.  If pStart
4600: 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20   is NULL the.** 
4610: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f  space for the lo
4620: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69  okaside memory i
4630: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
4640: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
4650: 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69  ..** If pStart i
4660: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
4670: 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74  it is sz*cnt byt
4680: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  es of memory to 
4690: 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c  use for.** the l
46a0: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e  ookaside memory.
46b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
46c0: 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71  etupLookaside(sq
46d0: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
46e0: 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69  *pBuf, int sz, i
46f0: 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20  nt cnt){.  void 
4700: 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64  *pStart;.  if( d
4710: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
4720: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
4730: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
4740: 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65  .  /* Free any e
4750: 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  xisting lookasid
4760: 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 69  e buffer for thi
4770: 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a  s handle before.
4780: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20    ** allocating 
4790: 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20  a new one so we 
47a0: 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61  don't have to ha
47b0: 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20  ve space for .  
47c0: 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20 73  ** both at the s
47d0: 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20  ame time..  */. 
47e0: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
47f0: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a  de.bMalloced ){.
4800: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
4810: 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70  (db->lookaside.p
4820: 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Start);.  }.  /*
4830: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c   The size of a l
4840: 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66  ookaside slot af
4850: 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e  ter ROUNDDOWN8 n
4860: 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65  eeds to be large
4870: 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f  r.  ** than a po
4880: 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73 65 66  inter to be usef
4890: 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20  ul..  */.  sz = 
48a0: 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20  ROUNDDOWN8(sz); 
48b0: 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38   /* IMP: R-33038
48c0: 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20  -09382 */.  if( 
48d0: 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  sz<=(int)sizeof(
48e0: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
48f0: 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  ) sz = 0;.  if( 
4900: 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b  cnt<0 ) cnt = 0;
4910: 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20  .  if( sz==0 || 
4920: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a  cnt==0 ){.    sz
4930: 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
4940: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
4950: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
4960: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
4970: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
4980: 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   pStart = sqlite
4990: 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20  3Malloc( sz*cnt 
49a0: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31  );  /* IMP: R-61
49b0: 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20  949-35727 */.   
49c0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
49d0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
49e0: 66 28 20 70 53 74 61 72 74 20 29 20 63 6e 74 20  f( pStart ) cnt 
49f0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  = sqlite3MallocS
4a00: 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a  ize(pStart)/sz;.
4a10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74    }else{.    pSt
4a20: 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a  art = pBuf;.  }.
4a30: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4a40: 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b  pStart = pStart;
4a50: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
4a60: 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62  .pFree = 0;.  db
4a70: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d  ->lookaside.sz =
4a80: 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20   (u16)sz;.  if( 
4a90: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e  pStart ){.    in
4aa0: 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69  t i;.    Lookasi
4ab0: 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61  deSlot *p;.    a
4ac0: 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74  ssert( sz > (int
4ad0: 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64  )sizeof(Lookasid
4ae0: 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70  eSlot*) );.    p
4af0: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
4b00: 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66  t*)pStart;.    f
4b10: 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30  or(i=cnt-1; i>=0
4b20: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
4b30: 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f  >pNext = db->loo
4b40: 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20  kaside.pFree;.  
4b50: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4b60: 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20  e.pFree = p;.   
4b70: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
4b80: 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29  eSlot*)&((u8*)p)
4b90: 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [sz];.    }.    
4ba0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
4bb0: 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e  nd = p;.    db->
4bc0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
4bd0: 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e  ed = 1;.    db->
4be0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
4bf0: 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31  ced = pBuf==0 ?1
4c00: 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  :0;.  }else{.   
4c10: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4c20: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  End = 0;.    db-
4c30: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
4c40: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  led = 0;.    db-
4c50: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
4c60: 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oced = 0;.  }.  
4c70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4c80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4c90: 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  n the mutex asso
4ca0: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
4cb0: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
4cc0: 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75  n..*/.sqlite3_mu
4cd0: 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f  tex *sqlite3_db_
4ce0: 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64  mutex(sqlite3 *d
4cf0: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
4d00: 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >mutex;.}../*.**
4d10: 20 46 72 65 65 20 75 70 20 61 73 20 6d 75 63 68   Free up as much
4d20: 20 6d 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61   memory as we ca
4d30: 6e 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  n from the given
4d40: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
4d50: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  nection..*/.int 
4d60: 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61  sqlite3_db_relea
4d70: 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65  se_memory(sqlite
4d80: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
4d90: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4da0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
4db0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
4dc0: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
4dd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4de0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
4df0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
4e00: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
4e10: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
4e20: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
4e30: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
4e40: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  er(pBt);.      s
4e50: 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
4e60: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
4e70: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
4e80: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
4e90: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4ea0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
4eb0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
4ec0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4ed0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
4ee0: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
4ef0: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
4f00: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
4f10: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
4f20: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
4f30: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
4f40: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
4f50: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
4f60: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
4f70: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
4f80: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
4f90: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
4fa0: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
4fb0: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
4fc0: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
4fd0: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
4fe0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
4ff0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
5000: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
5010: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
5020: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
5030: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
5040: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
5050: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
5060: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
5070: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
5080: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
5090: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
50a0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
50b0: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
50c0: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
50d0: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
50e0: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
50f0: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
5100: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
5110: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
5120: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
5130: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
5140: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
5150: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
5160: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
5170: 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54  E_FKEY,    SQLIT
5180: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20  E_ForeignKeys   
5190: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
51a0: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
51b0: 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51  ABLE_TRIGGER, SQ
51c0: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
51d0: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  er  },.      };.
51e0: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
51f0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
5200: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
5210: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
5220: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
5230: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
5240: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
5250: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
5260: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
5270: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
5280: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
5290: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
52a0: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
52b0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
52c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
52d0: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
52e0: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
52f0: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
5300: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
5310: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
5320: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
5330: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
5340: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
5350: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
5360: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
5370: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
5380: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
5390: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
53a0: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
53b0: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
53c0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
53d0: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
53e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
53f0: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20   pRes ){.       
5400: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62       *pRes = (db
5410: 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f  ->flags & aFlagO
5420: 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20  p[i].mask)!=0;. 
5430: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5440: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5450: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  _OK;.          b
5460: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5470: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5480: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
5490: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
54a0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
54b0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
54c0: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
54d0: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
54e0: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
54f0: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
5500: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
5510: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
5520: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
5530: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
5540: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
5550: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
5560: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
5570: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
5580: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
5590: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
55a0: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
55b0: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
55c0: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
55d0: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
55e0: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
55f0: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
5600: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
5610: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
5620: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
5630: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
5640: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
5650: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
5660: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
5670: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
5680: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
5690: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
56a0: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
56b0: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
56c0: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
56d0: 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d  y2;.  rc = memcm
56e0: 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
56f0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
5700: 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c  ){.    if( padFl
5710: 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  ag.     && allSp
5720: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
5730: 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a  y1)+n, nKey1-n).
5740: 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65       && allSpace
5750: 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29  s(((char*)pKey2)
5760: 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20  +n, nKey2-n).   
5770: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61   ){.      /* Lea
5780: 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20  ve rc unchanged 
5790: 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  at 0 */.    }els
57a0: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b  e{.      rc = nK
57b0: 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20  ey1 - nKey2;.   
57c0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
57d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  rc;.}../*.** Ano
57e0: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
57f0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
5800: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
5810: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
5820: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
5830: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
5840: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
5850: 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndent.** compari
5860: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
5870: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
5880: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
5890: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
58a0: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
58b0: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
58c0: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
58d0: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
58e0: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
58f0: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
5900: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
5910: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
5920: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
5930: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
5940: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
5950: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
5960: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
5970: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
5980: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
5990: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
59a0: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
59b0: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
59c0: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
59d0: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
59e0: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
59f0: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
5a00: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
5a10: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
5a20: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
5a30: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
5a40: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
5a50: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
5a60: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
5a70: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
5a80: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
5a90: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
5aa0: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
5ab0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
5ac0: 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  lastRowid;.}../*
5ad0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5ae0: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
5af0: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
5b00: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
5b10: 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69  te3_exec()..*/.i
5b20: 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  nt sqlite3_chang
5b30: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
5b40: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
5b50: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5b60: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5b70: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
5b80: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
5b90: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
5ba0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5bb0: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
5bc0: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
5bd0: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61  return db->nTota
5be0: 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  lChange;.}../*.*
5bf0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e  * Close all open
5c00: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69   savepoints. Thi
5c10: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
5c20: 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c  manipulates fiel
5c30: 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ds of the.** dat
5c40: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a  abase handle obj
5c50: 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  ect, it does not
5c60: 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70   close any savep
5c70: 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62  oints that may b
5c80: 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65  e open.** at the
5c90: 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65   b-tree/pager le
5ca0: 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  vel..*/.void sql
5cb0: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
5cc0: 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
5cd0: 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70  {.  while( db->p
5ce0: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
5cf0: 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
5d00: 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
5d10: 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65  t;.    db->pSave
5d20: 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e  point = pTmp->pN
5d30: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
5d40: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
5d50: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76  ;.  }.  db->nSav
5d60: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62  epoint = 0;.  db
5d70: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
5d80: 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61  ;.  db->isTransa
5d90: 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
5da0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
5db0: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
5dc0: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f  or function asso
5dd0: 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63  ciated with Func
5de0: 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45  Def p, if any. E
5df0: 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69  xcept,.** if thi
5e00: 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  s is not the las
5e10: 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75  t copy of the fu
5e20: 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69  nction, do not i
5e30: 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70  nvoke it. Multip
5e40: 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20  le.** copies of 
5e50: 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f  a single functio
5e60: 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68  n are created wh
5e70: 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69  en create_functi
5e80: 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a  on() is called.*
5e90: 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e  * with SQLITE_AN
5ea0: 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  Y as the encodin
5eb0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
5ec0: 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f  d functionDestro
5ed0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  y(sqlite3 *db, F
5ee0: 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75  uncDef *p){.  Fu
5ef0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
5f00: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70  estructor = p->p
5f10: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66  Destructor;.  if
5f20: 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ( pDestructor ){
5f30: 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72  .    pDestructor
5f40: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
5f50: 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e  ( pDestructor->n
5f60: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
5f70: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65  pDestructor->xDe
5f80: 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f  stroy(pDestructo
5f90: 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20  r->pUserData);. 
5fa0: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5fb0: 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63 74  ee(db, pDestruct
5fc0: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  or);.    }.  }.}
5fd0: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65  ../*.** Disconne
5fe0: 63 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76  ct all sqlite3_v
5ff0: 74 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74  tab objects that
6000: 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62   belong to datab
6010: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
6020: 2a 20 64 62 2e 20 54 68 69 73 20 69 73 20 63 61  * db. This is ca
6030: 6c 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73 20  lled when db is 
6040: 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f  being closed..*/
6050: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
6060: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73  connectAllVtab(s
6070: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
6080: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6090: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
60a0: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
60b0: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
60c0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
60d0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
60e0: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
60f0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ma = db->aDb[i].
6100: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28  pSchema;.    if(
6110: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68   db->aDb[i].pSch
6120: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73  ema ){.      Has
6130: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20  hElem *p;.      
6140: 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68  for(p=sqliteHash
6150: 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e  First(&pSchema->
6160: 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73  tblHash); p; p=s
6170: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29  qliteHashNext(p)
6180: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
6190: 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20   *pTab = (Table 
61a0: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
61b0: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
61c0: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
61d0: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 44 69   ) sqlite3VtabDi
61e0: 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61  sconnect(db, pTa
61f0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
6200: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
6210: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
6220: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
6230: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
6240: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
6250: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 64  Return TRUE if d
6260: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6270: 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61  on db has unfina
6280: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
6290: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
62a0: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
62b0: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
62c0: 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s.  .*/.static i
62d0: 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  nt connectionIsB
62e0: 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29  usy(sqlite3 *db)
62f0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
6300: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
6310: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
6320: 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  x) );.  if( db->
6330: 70 56 64 62 65 20 29 20 72 65 74 75 72 6e 20 31  pVdbe ) return 1
6340: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  ;.  for(j=0; j<d
6350: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
6360: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
6370: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20  b->aDb[j].pBt;. 
6380: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
6390: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61  lite3BtreeIsInBa
63a0: 63 6b 75 70 28 70 42 74 29 20 29 20 72 65 74 75  ckup(pBt) ) retu
63b0: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
63c0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
63d0: 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  lose an existing
63e0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
63f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
6400: 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69  qlite3Close(sqli
6410: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72  te3 *db, int for
6420: 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28  ceZombie){.  if(
6430: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
6440: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6450: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
6460: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
6470: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
6480: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
6490: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
64a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
64b0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
64c0: 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73  .  /* Force xDis
64d0: 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e  connect calls on
64e0: 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62   all virtual tab
64f0: 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e  les */.  disconn
6500: 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a  ectAllVtab(db);.
6510: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
6520: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
6530: 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  the disconnectAl
6540: 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f  lVtab() call abo
6550: 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ve.  ** will not
6560: 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65   have called the
6570: 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d   xDisconnect() m
6580: 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72  ethod on any vir
6590: 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73  tual.  ** tables
65a0: 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72   in the db->aVTr
65b0: 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65  ans[] array. The
65c0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
65d0: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29  e3VtabRollback()
65e0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20  .  ** call will 
65f0: 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74  do so. We need t
6600: 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65  o do this before
6610: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
6620: 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73  ctive.  ** SQL s
6630: 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c  tatements below,
6640: 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20   as the v-table 
6650: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
6660: 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20  ay be storing.  
6670: 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64  ** some prepared
6680: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65   statements inte
6690: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73  rnally..  */.  s
66a0: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
66b0: 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65  ck(db);..  /* Le
66c0: 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28 73  gacy behavior (s
66d0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62  qlite3_close() b
66e0: 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72  ehavior) is to r
66f0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
6700: 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63 6f  E_BUSY if the co
6710: 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74  nnection can not
6720: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
6730: 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  iately..  */.  i
6740: 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20  f( !forceZombie 
6750: 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  && connectionIsB
6760: 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73  usy(db) ){.    s
6770: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
6780: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e  SQLITE_BUSY, "un
6790: 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75  able to close du
67a0: 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64  e to unfinalized
67b0: 20 22 0a 20 20 20 20 20 20 20 22 73 74 61 74 65   ".       "state
67c0: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
67d0: 68 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20  hed backups");. 
67e0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
67f0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
6800: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
6810: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
6820: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6830: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66  ABLE_SQLLOG.  if
6840: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
6850: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b  onfig.xSqllog ){
6860: 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20  .    /* Closing 
6870: 74 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72  the handle. Four
6880: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  th parameter is 
6890: 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65  passed the value
68a0: 20 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74   2. */.    sqlit
68b0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
68c0: 53 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c  Sqllog(sqlite3Gl
68d0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
68e0: 6f 67 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29  ogArg, db, 0, 2)
68f0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
6900: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63  /* Convert the c
6910: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61  onnection into a
6920: 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e   zombie and then
6930: 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a   close it..  */.
6940: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
6950: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
6960: 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76  E;.  sqlite3Leav
6970: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
6980: 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75  mbie(db);.  retu
6990: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
69a0: 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61  ./*.** Two varia
69b0: 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62  tions on the pub
69c0: 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f  lic interface fo
69d0: 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61  r closing a data
69e0: 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
69f0: 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f  on. The sqlite3_
6a00: 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20  close() version 
6a10: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
6a20: 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65  USY and.** leave
6a30: 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  s the connection
6a40: 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65   option if there
6a50: 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64   are unfinalized
6a60: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
6a70: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
6a80: 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61  ished sqlite3_ba
6a90: 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69  ckups.  The sqli
6aa0: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a  te3_close_v2().*
6ab0: 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73  * version forces
6ac0: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
6ad0: 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62  to become a zomb
6ae0: 69 65 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  ie if there are.
6af0: 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f  ** unclosed reso
6b00: 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e  urces, and arran
6b10: 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61  ges for dealloca
6b20: 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61  tion when the la
6b30: 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74  st.** prepare st
6b40: 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74  atement or sqlit
6b50: 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73  e3_backup closes
6b60: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6b70: 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  _close(sqlite3 *
6b80: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
6b90: 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20  te3Close(db,0); 
6ba0: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  }.int sqlite3_cl
6bb0: 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a  ose_v2(sqlite3 *
6bc0: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
6bd0: 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20  te3Close(db,1); 
6be0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  }.../*.** Close 
6bf0: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  the mutex on dat
6c00: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6c10: 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68   db..**.** Furth
6c20: 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62  ermore, if datab
6c30: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
6c40: 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d  b is a zombie (m
6c50: 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72  eaning that ther
6c60: 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20  e.** has been a 
6c70: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71  prior call to sq
6c80: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20  lite3_close(db) 
6c90: 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  or sqlite3_close
6ca0: 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20  _v2(db)) and.** 
6cb0: 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74  every sqlite3_st
6cc0: 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20  mt has now been 
6cd0: 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76  finalized and ev
6ce0: 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  ery sqlite3_back
6cf0: 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68  up has.** finish
6d00: 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c  ed, then free al
6d10: 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a  l resources..*/.
6d20: 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76  void sqlite3Leav
6d30: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
6d40: 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62  mbie(sqlite3 *db
6d50: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
6d60: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6d70: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
6d80: 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  le iterator */. 
6d90: 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66   int j;..  /* If
6da0: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
6db0: 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73  anding sqlite3_s
6dc0: 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62  tmt or sqlite3_b
6dd0: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20  ackup objects.  
6de0: 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e  ** or if the con
6df0: 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20  nection has not 
6e00: 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20  yet been closed 
6e10: 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  by sqlite3_close
6e20: 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e  _v2(),.  ** then
6e30: 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68 65 20   just leave the 
6e40: 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e  mutex and return
6e50: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
6e60: 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d  >magic!=SQLITE_M
6e70: 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63  AGIC_ZOMBIE || c
6e80: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
6e90: 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  db) ){.    sqlit
6ea0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
6eb0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
6ec0: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
6ed0: 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
6ee0: 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
6ef0: 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
6f00: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
6f10: 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61  as.  ** closed a
6f20: 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ll sqlite3_stmt 
6f30: 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  and sqlite3_back
6f40: 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68  up objects and h
6f50: 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73  as been.  ** pas
6f60: 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  sed to sqlite3_c
6f70: 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68  lose (meaning th
6f80: 61 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69  at it is a zombi
6f90: 65 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a  e).  Therefore,.
6fa0: 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e    ** go ahead an
6fb0: 64 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75  d free all resou
6fc0: 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  rces..  */..  /*
6fd0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
6fe0: 6e 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20  n is open, roll 
6ff0: 69 74 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c  it back. This al
7000: 73 6f 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  so ensures that 
7010: 69 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61  if.  ** any data
7020: 62 61 73 65 20 73 63 68 65 6d 61 73 20 68 61 76  base schemas hav
7030: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
7040: 62 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65  by an uncommitte
7050: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d transaction.  
7060: 2a 2a 20 74 68 65 79 20 61 72 65 20 72 65 73 65  ** they are rese
7070: 74 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20  t. And that the 
7080: 72 65 71 75 69 72 65 64 20 62 2d 74 72 65 65 20  required b-tree 
7090: 6d 75 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f  mutex is held to
70a0: 20 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70   make.  ** the p
70b0: 61 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ager rollback an
70c0: 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 20 61  d schema reset a
70d0: 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69  n atomic operati
70e0: 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  on. */.  sqlite3
70f0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
7100: 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f  SQLITE_OK);..  /
7110: 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74  * Free any outst
7120: 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74  anding Savepoint
7130: 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a   structures. */.
7140: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
7150: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20  vepoints(db);.. 
7160: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61   /* Close all da
7170: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
7180: 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b  ns */.  for(j=0;
7190: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
71a0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
71b0: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
71c0: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  j];.    if( pDb-
71d0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71  >pBt ){.      sq
71e0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
71f0: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
7200: 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20   pDb->pBt = 0;. 
7210: 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b       if( j!=1 ){
7220: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53  .        pDb->pS
7230: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
7240: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
7250: 2a 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50  * Clear the TEMP
7260: 20 73 63 68 65 6d 61 20 73 65 70 61 72 61 74 65   schema separate
7270: 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20  ly and last */. 
7280: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
7290: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73  pSchema ){.    s
72a0: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
72b0: 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  r(db->aDb[1].pSc
72c0: 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  hema);.  }.  sql
72d0: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
72e0: 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72  st(db);..  /* Fr
72f0: 65 65 20 75 70 20 74 68 65 20 61 72 72 61 79 20  ee up the array 
7300: 6f 66 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  of auxiliary dat
7310: 61 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69  abases */.  sqli
7320: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
7330: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20  aseArray(db);.  
7340: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
7350: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
7360: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
7370: 53 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20  Static );..  /* 
7380: 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e  Tell the code in
7390: 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74   notify.c that t
73a0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f  he connection no
73b0: 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e   longer holds an
73c0: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64  y.  ** locks and
73d0: 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
73e0: 65 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e  e any further un
73f0: 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
7400: 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  backs..  */.  sq
7410: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43  lite3ConnectionC
7420: 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f  losed(db);..  fo
7430: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
7440: 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b  ze(db->aFunc.a);
7450: 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44   j++){.    FuncD
7460: 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73  ef *pNext, *pHas
7470: 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  h, *p;.    for(p
7480: 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b  =db->aFunc.a[j];
7490: 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20   p; p=pHash){.  
74a0: 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70      pHash = p->p
74b0: 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c  Hash;.      whil
74c0: 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e( p ){.        
74d0: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
74e0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
74f0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
7500: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
7510: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
7520: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
7530: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
7540: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c  .  }.  for(i=sql
7550: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
7560: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20  ->aCollSeq); i; 
7570: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
7580: 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  (i)){.    CollSe
7590: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
75a0: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
75b0: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20  Data(i);.    /* 
75c0: 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72  Invoke any destr
75d0: 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65  uctors registere
75e0: 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20  d for collation 
75f0: 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61  sequence user da
7600: 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ta. */.    for(j
7610: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
7620: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a       if( pColl[j
7630: 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ].xDel ){.      
7640: 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28    pColl[j].xDel(
7650: 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b  pColl[j].pUser);
7660: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7670: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7680: 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, pColl);.  }
7690: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
76a0: 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ear(&db->aCollSe
76b0: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
76c0: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
76d0: 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ABLE.  for(i=sql
76e0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
76f0: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69  ->aModule); i; i
7700: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
7710: 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  i)){.    Module 
7720: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
7730: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
7740: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (i);.    if( pMo
7750: 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  d->xDestroy ){. 
7760: 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74       pMod->xDest
7770: 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b  roy(pMod->pAux);
7780: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7790: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f  e3DbFree(db, pMo
77a0: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
77b0: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
77c0: 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
77d0: 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
77e0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
77f0: 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  0); /* Deallocat
7800: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
7810: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
7820: 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29    if( db->pErr )
7830: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
7840: 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29  ueFree(db->pErr)
7850: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43  ;.  }.  sqlite3C
7860: 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64  loseExtensions(d
7870: 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63  b);..  db->magic
7880: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
7890: 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65  ERROR;..  /* The
78a0: 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73   temp-database s
78b0: 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74  chema is allocat
78c0: 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66  ed differently f
78d0: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63  rom the other sc
78e0: 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  hema.  ** object
78f0: 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d  s (using sqliteM
7900: 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79  alloc() directly
7910: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c  , instead of sql
7920: 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
7930: 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e  ))..  ** So it n
7940: 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
7950: 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79   here. Todo: Why
7960: 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65   not roll the te
7970: 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20  mp schema into. 
7980: 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c   ** the same sql
7990: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74  iteMalloc() as t
79a0: 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f  he one that allo
79b0: 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61  cates the databa
79c0: 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  se .  ** structu
79d0: 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  re?.  */.  sqlit
79e0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
79f0: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
7a00: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
7a10: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
7a20: 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  x);.  db->magic 
7a30: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43  = SQLITE_MAGIC_C
7a40: 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  LOSED;.  sqlite3
7a50: 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e  _mutex_free(db->
7a60: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
7a70: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
7a80: 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46  nOut==0 );  /* F
7a90: 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73  ails on a lookas
7aa0: 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20  ide memory leak 
7ab0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  */.  if( db->loo
7ac0: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
7ad0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
7ae0: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
7af0: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
7b00: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
7b10: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  b);.}../*.** Rol
7b20: 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61  lback all databa
7b30: 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72  se files.  If tr
7b40: 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51  ipCode is not SQ
7b50: 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a  LITE_OK, then.**
7b60: 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72   any open cursor
7b70: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
7b80: 64 20 28 22 74 72 69 70 70 65 64 22 20 2d 20 61  d ("tripped" - a
7b90: 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61  s in "tripping a
7ba0: 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61   circuit.** brea
7bb0: 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74  ker") and made t
7bc0: 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64  o return tripCod
7bd0: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
7be0: 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74  ny further.** at
7bf0: 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68  tempts to use th
7c00: 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f  at cursor..*/.vo
7c10: 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
7c20: 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  ckAll(sqlite3 *d
7c30: 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29  b, int tripCode)
7c40: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
7c50: 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20   inTrans = 0;.  
7c60: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7c70: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
7c80: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
7c90: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
7ca0: 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74  loc();..  /* Obt
7cb0: 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d  ain all b-tree m
7cc0: 75 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61  utexes before ma
7cd0: 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74  king any calls t
7ce0: 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  o BtreeRollback(
7cf0: 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73  ). .  ** This is
7d00: 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61   important in ca
7d10: 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  se the transacti
7d20: 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  on being rolled 
7d30: 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f  back has.  ** mo
7d40: 64 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62  dified the datab
7d50: 61 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74  ase schema. If t
7d60: 68 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65  he b-tree mutexe
7d70: 73 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a  s are not taken.
7d80: 20 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20    ** here, then 
7d90: 61 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63  another shared-c
7da0: 61 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ache connection 
7db0: 6d 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62  might sneak in b
7dc0: 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20  etween.  ** the 
7dd0: 64 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63  database rollbac
7de0: 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73  k and schema res
7df0: 65 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61  et, which can ca
7e00: 75 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63  use false.  ** c
7e10: 6f 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74  orruption report
7e20: 73 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e  s in some cases.
7e30: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74    */.  sqlite3Bt
7e40: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
7e50: 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64  ..  for(i=0; i<d
7e60: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
7e70: 20 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d    Btree *p = db-
7e80: 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
7e90: 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20   if( p ){.      
7ea0: 69 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65  if( sqlite3Btree
7eb0: 49 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a  IsInTrans(p) ){.
7ec0: 20 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20          inTrans 
7ed0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
7ee0: 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52     sqlite3BtreeR
7ef0: 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43  ollback(p, tripC
7f00: 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ode);.    }.  }.
7f10: 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c    sqlite3VtabRol
7f20: 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c  lback(db);.  sql
7f30: 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c  ite3EndBenignMal
7f40: 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 28 64  loc();..  if( (d
7f50: 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  b->flags&SQLITE_
7f60: 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d  InternChanges)!=
7f70: 30 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75  0 && db->init.bu
7f80: 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  sy==0 ){.    sql
7f90: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
7fa0: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
7fb0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73  ;.    sqlite3Res
7fc0: 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f  etAllSchemasOfCo
7fd0: 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20  nnection(db);.  
7fe0: 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65  }.  sqlite3Btree
7ff0: 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20  LeaveAll(db);.. 
8000: 20 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64   /* Any deferred
8010: 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
8020: 61 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20  ations have now 
8030: 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a  been resolved. *
8040: 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65  /.  db->nDeferre
8050: 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d  dCons = 0;.  db-
8060: 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e  >nDeferredImmCon
8070: 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61  s = 0;.  db->fla
8080: 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65  gs &= ~SQLITE_De
8090: 66 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66  ferFKs;..  /* If
80a0: 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f   one has been co
80b0: 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65  nfigured, invoke
80c0: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f   the rollback-ho
80d0: 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20  ok callback */. 
80e0: 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61   if( db->xRollba
80f0: 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69  ckCallback && (i
8100: 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61  nTrans || !db->a
8110: 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20  utoCommit) ){.  
8120: 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43    db->xRollbackC
8130: 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c  allback(db->pRol
8140: 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d  lbackArg);.  }.}
8150: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
8160: 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 63   static string c
8170: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61  ontaining the na
8180: 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  me corresponding
8190: 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63 6f   to the error co
81a0: 64 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20  de.** specified 
81b0: 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e  in the argument.
81c0: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
81d0: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
81e0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
81f0: 54 45 53 54 29 20 7c 7c 20 5c 0a 20 20 20 20 64  TEST) || \.    d
8200: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
8210: 42 55 47 5f 4f 53 5f 54 52 41 43 45 29 0a 63 6f  BUG_OS_TRACE).co
8220: 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
8230: 33 45 72 72 4e 61 6d 65 28 69 6e 74 20 72 63 29  3ErrName(int rc)
8240: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
8250: 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  zName = 0;.  int
8260: 20 69 2c 20 6f 72 69 67 52 63 20 3d 20 72 63 3b   i, origRc = rc;
8270: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20  .  for(i=0; i<2 
8280: 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b  && zName==0; i++
8290: 2c 20 72 63 20 26 3d 20 30 78 66 66 29 7b 0a 20  , rc &= 0xff){. 
82a0: 20 20 20 73 77 69 74 63 68 28 20 72 63 20 29 7b     switch( rc ){
82b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
82c0: 54 45 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 20  TE_OK:          
82d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
82e0: 53 51 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20  SQLITE_OK";     
82f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8300: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8310: 49 54 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20  ITE_ERROR:      
8320: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8330: 22 53 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20  "SQLITE_ERROR"; 
8340: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
8350: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8360: 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20  LITE_INTERNAL:  
8370: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8380: 20 22 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41   "SQLITE_INTERNA
8390: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  L";          bre
83a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
83b0: 51 4c 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20  QLITE_PERM:     
83c0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
83d0: 3d 20 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b  = "SQLITE_PERM";
83e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
83f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8400: 53 51 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20  SQLITE_ABORT:   
8410: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
8420: 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54   = "SQLITE_ABORT
8430: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
8440: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8450: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
8460: 4c 4c 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d  LLBACK:     zNam
8470: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52  e = "SQLITE_ABOR
8480: 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20  T_ROLLBACK";    
8490: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
84a0: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20  e SQLITE_BUSY:  
84b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
84c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53  me = "SQLITE_BUS
84d0: 59 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Y";             
84e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
84f0: 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52  se SQLITE_BUSY_R
8500: 45 43 4f 56 45 52 59 3a 20 20 20 20 20 20 7a 4e  ECOVERY:      zN
8510: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55  ame = "SQLITE_BU
8520: 53 59 5f 52 45 43 4f 56 45 52 59 22 3b 20 20 20  SY_RECOVERY";   
8530: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8540: 61 73 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f  ase SQLITE_BUSY_
8550: 53 4e 41 50 53 48 4f 54 3a 20 20 20 20 20 20 7a  SNAPSHOT:      z
8560: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42  Name = "SQLITE_B
8570: 55 53 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20  USY_SNAPSHOT";  
8580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8590: 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  case SQLITE_LOCK
85a0: 45 44 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ED:             
85b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
85c0: 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20  LOCKED";        
85d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
85e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43   case SQLITE_LOC
85f0: 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48 45 3a  KED_SHAREDCACHE:
8600: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8610: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
8620: 43 48 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  CHE";break;.    
8630: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f    case SQLITE_NO
8640: 4d 45 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20  MEM:            
8650: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8660: 45 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20  E_NOMEM";       
8670: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8680: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
8690: 45 41 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20  EADONLY:        
86a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
86b0: 54 45 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20  TE_READONLY";   
86c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
86d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
86e0: 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52  READONLY_RECOVER
86f0: 59 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  Y:  zName = "SQL
8700: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43  ITE_READONLY_REC
8710: 4f 56 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20  OVERY"; break;. 
8720: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8730: 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f  _READONLY_CANTLO
8740: 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CK:  zName = "SQ
8750: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
8760: 4e 54 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  NTLOCK"; break;.
8770: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8780: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42  E_READONLY_ROLLB
8790: 41 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ACK:  zName = "S
87a0: 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
87b0: 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b  OLLBACK"; break;
87c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
87d0: 54 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 20  TE_INTERRUPT:   
87e0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
87f0: 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
8800: 22 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ";         break
8810: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8820: 49 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20  ITE_IOERR:      
8830: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8840: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20  "SQLITE_IOERR"; 
8850: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
8860: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8870: 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a  LITE_IOERR_READ:
8880: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8890: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52   "SQLITE_IOERR_R
88a0: 45 41 44 22 3b 20 20 20 20 20 20 20 20 62 72 65  EAD";        bre
88b0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
88c0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
88d0: 54 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20  T_READ:   zName 
88e0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
88f0: 53 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62 72  SHORT_READ";  br
8900: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8910: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49  SQLITE_IOERR_WRI
8920: 54 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  TE:        zName
8930: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8940: 5f 57 52 49 54 45 22 3b 20 20 20 20 20 20 20 62  _WRITE";       b
8950: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8960: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53   SQLITE_IOERR_FS
8970: 59 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  YNC:        zNam
8980: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8990: 52 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20 20  R_FSYNC";       
89a0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
89b0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
89c0: 49 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61  IR_FSYNC:    zNa
89d0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
89e0: 52 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20 20  RR_DIR_FSYNC";  
89f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8a00: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8a10: 54 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e  TRUNCATE:     zN
8a20: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8a30: 45 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20 20  ERR_TRUNCATE";  
8a40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8a50: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8a60: 5f 46 53 54 41 54 3a 20 20 20 20 20 20 20 20 7a  _FSTAT:        z
8a70: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8a80: 4f 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20 20  OERR_FSTAT";    
8a90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8aa0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8ab0: 52 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20  R_UNLOCK:       
8ac0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8ad0: 49 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20  IOERR_UNLOCK";  
8ae0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8af0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8b00: 52 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20  RR_RDLOCK:      
8b10: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8b20: 5f 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20  _IOERR_RDLOCK"; 
8b30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8b40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8b50: 45 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20 20  ERR_DELETE:     
8b60: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8b70: 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b  E_IOERR_DELETE";
8b80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8b90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8ba0: 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3a 20 20 20  OERR_BLOCKED:   
8bb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8bc0: 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
8bd0: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
8be0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8bf0: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20  IOERR_NOMEM:    
8c00: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8c10: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22  ITE_IOERR_NOMEM"
8c20: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
8c30: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8c40: 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 3a 20 20  _IOERR_ACCESS:  
8c50: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8c60: 4c 49 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53  LITE_IOERR_ACCES
8c70: 53 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  S";      break;.
8c80: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8c90: 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53  E_IOERR_CHECKRES
8ca0: 45 52 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20  ERVEDLOCK:.     
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8cc0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
8cd0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8ce0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
8cf0: 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  CK"; break;.    
8d00: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8d10: 45 52 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20  ERR_LOCK:       
8d20: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8d30: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20  E_IOERR_LOCK";  
8d40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8d50: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8d60: 4f 45 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20  OERR_CLOSE:     
8d70: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8d80: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b  TE_IOERR_CLOSE";
8d90: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8da0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8db0: 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a  IOERR_DIR_CLOSE:
8dc0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8dd0: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
8de0: 4f 53 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  OSE";   break;. 
8df0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8e00: 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20  _IOERR_SHMOPEN: 
8e10: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8e20: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
8e30: 45 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  EN";     break;.
8e40: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8e50: 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a  E_IOERR_SHMSIZE:
8e60: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8e70: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
8e80: 49 5a 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  IZE";     break;
8e90: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8ea0: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b  TE_IOERR_SHMLOCK
8eb0: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
8ec0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d  SQLITE_IOERR_SHM
8ed0: 4c 4f 43 4b 22 3b 20 20 20 20 20 62 72 65 61 6b  LOCK";     break
8ee0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8ef0: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50  ITE_IOERR_SHMMAP
8f00: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
8f10: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  "SQLITE_IOERR_SH
8f20: 4d 4d 41 50 22 3b 20 20 20 20 20 20 62 72 65 61  MMAP";      brea
8f30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8f40: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a  LITE_IOERR_SEEK:
8f50: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8f60: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
8f70: 45 45 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65  EEK";        bre
8f80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8f90: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
8fa0: 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20  TE_NOENT: zName 
8fb0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8fc0: 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72  DELETE_NOENT";br
8fd0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8fe0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41  SQLITE_IOERR_MMA
8ff0: 50 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  P:         zName
9000: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
9010: 5f 4d 4d 41 50 22 3b 20 20 20 20 20 20 20 20 62  _MMAP";        b
9020: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9030: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45   SQLITE_IOERR_GE
9040: 54 54 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d  TTEMPPATH:  zNam
9050: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
9060: 52 5f 47 45 54 54 45 4d 50 50 41 54 48 22 3b 20  R_GETTEMPPATH"; 
9070: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9080: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
9090: 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  :            zNa
90a0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52  me = "SQLITE_COR
90b0: 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 20  RUPT";          
90c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
90d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  se SQLITE_CORRUP
90e0: 54 5f 56 54 41 42 3a 20 20 20 20 20 20 20 7a 4e  T_VTAB:       zN
90f0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
9100: 52 52 55 50 54 5f 56 54 41 42 22 3b 20 20 20 20  RRUPT_VTAB";    
9110: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9120: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f  ase SQLITE_NOTFO
9130: 55 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20 7a  UND:           z
9140: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
9150: 4f 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20 20  OTFOUND";       
9160: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9170: 63 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c  case SQLITE_FULL
9180: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
9190: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
91a0: 46 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20 20  FULL";          
91b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
91c0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
91d0: 54 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20 20  TOPEN:          
91e0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
91f0: 5f 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20  _CANTOPEN";     
9200: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9210: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
9220: 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52  NTOPEN_NOTEMPDIR
9230: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
9240: 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d  E_CANTOPEN_NOTEM
9250: 50 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20  PDIR";break;.   
9260: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
9270: 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20  ANTOPEN_ISDIR:  
9280: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9290: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
92a0: 52 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  R";    break;.  
92b0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
92c0: 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54  CANTOPEN_FULLPAT
92d0: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
92e0: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
92f0: 4c 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  LPATH"; break;. 
9300: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9310: 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20  _PROTOCOL:      
9320: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9330: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20  LITE_PROTOCOL"; 
9340: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9350: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9360: 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 20 20  E_EMPTY:        
9370: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9380: 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20 20  QLITE_EMPTY";   
9390: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
93a0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
93b0: 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 20  TE_SCHEMA:      
93c0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
93d0: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b 20  SQLITE_SCHEMA"; 
93e0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
93f0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9400: 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20  ITE_TOOBIG:     
9410: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9420: 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b  "SQLITE_TOOBIG";
9430: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9440: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9450: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a  LITE_CONSTRAINT:
9460: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9470: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
9480: 49 4e 54 22 3b 20 20 20 20 20 20 20 20 62 72 65  INT";        bre
9490: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
94a0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
94b0: 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65 20  _UNIQUE:  zName 
94c0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
94d0: 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62 72  AINT_UNIQUE"; br
94e0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
94f0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9500: 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d 65  T_TRIGGER: zName
9510: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
9520: 52 41 49 4e 54 5f 54 52 49 47 47 45 52 22 3b 62  RAINT_TRIGGER";b
9530: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9540: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
9550: 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a 20  NT_FOREIGNKEY:. 
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
9580: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9590: 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
95a0: 4e 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a  NKEY";   break;.
95b0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
95c0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45  E_CONSTRAINT_CHE
95d0: 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  CK:   zName = "S
95e0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
95f0: 5f 43 48 45 43 4b 22 3b 20 20 62 72 65 61 6b 3b  _CHECK";  break;
9600: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9610: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
9620: 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20 20 20  IMARYKEY:.      
9630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9640: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9650: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
9660: 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 22  AINT_PRIMARYKEY"
9670: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
9680: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
9690: 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a  STRAINT_NOTNULL:
96a0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
96b0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e  _CONSTRAINT_NOTN
96c0: 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  ULL";break;.    
96d0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
96e0: 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
96f0: 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  OOK:.           
9700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9710: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9720: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9730: 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20 62  COMMITHOOK";   b
9740: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9750: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
9760: 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61 6d  NT_VTAB:    zNam
9770: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
9780: 54 52 41 49 4e 54 5f 56 54 41 42 22 3b 20 20 20  TRAINT_VTAB";   
9790: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
97a0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
97b0: 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  INT_FUNCTION:.  
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
97e0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
97f0: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
9800: 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  N";     break;. 
9810: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9820: 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 20 20 20  _MISMATCH:      
9830: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9840: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20  LITE_MISMATCH"; 
9850: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9860: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9870: 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 20 20  E_MISUSE:       
9880: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9890: 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20 20  QLITE_MISUSE";  
98a0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
98b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
98c0: 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20  TE_NOLFS:       
98d0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
98e0: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20  SQLITE_NOLFS";  
98f0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9900: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9910: 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20 20  ITE_AUTH:       
9920: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9930: 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20 20  "SQLITE_AUTH";  
9940: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9950: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9960: 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20  LITE_FORMAT:    
9970: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9980: 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22   "SQLITE_FORMAT"
9990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
99a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
99b0: 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20 20  QLITE_RANGE:    
99c0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
99d0: 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45 22  = "SQLITE_RANGE"
99e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
99f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9a00: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20  SQLITE_NOTADB:  
9a10: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9a20: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44   = "SQLITE_NOTAD
9a30: 42 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  B";            b
9a40: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9a50: 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20   SQLITE_ROW:    
9a60: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9a70: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57 22  e = "SQLITE_ROW"
9a80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9a90: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9aa0: 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 3a  e SQLITE_NOTICE:
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9ac0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54  me = "SQLITE_NOT
9ad0: 49 43 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  ICE";           
9ae0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9af0: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  se SQLITE_NOTICE
9b00: 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e  _RECOVER_WAL: zN
9b10: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
9b20: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c  TICE_RECOVER_WAL
9b30: 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ";break;.      c
9b40: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43  ase SQLITE_NOTIC
9b50: 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41  E_RECOVER_ROLLBA
9b60: 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  CK:.            
9b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b80: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9b90: 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56  ITE_NOTICE_RECOV
9ba0: 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72  ER_ROLLBACK"; br
9bb0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9bc0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 3a 20  SQLITE_WARNING: 
9bd0: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9be0: 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49   = "SQLITE_WARNI
9bf0: 4e 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 62  NG";           b
9c00: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9c10: 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f   SQLITE_WARNING_
9c20: 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e 61 6d  AUTOINDEX:  zNam
9c30: 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e  e = "SQLITE_WARN
9c40: 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22 3b 20  ING_AUTOINDEX"; 
9c50: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9c60: 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20  e SQLITE_DONE:  
9c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9c80: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e  me = "SQLITE_DON
9c90: 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  E";             
9ca0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9cb0: 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  }.  if( zName==0
9cc0: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
9cd0: 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20  har zBuf[50];.  
9ce0: 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
9cf0: 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c  tf(sizeof(zBuf),
9d00: 20 7a 42 75 66 2c 20 22 53 51 4c 49 54 45 5f 55   zBuf, "SQLITE_U
9d10: 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f 72 69  NKNOWN(%d)", ori
9d20: 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20  gRc);.    zName 
9d30: 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 72 65  = zBuf;.  }.  re
9d40: 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65  turn zName;.}.#e
9d50: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ndif../*.** Retu
9d60: 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69  rn a static stri
9d70: 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
9d80: 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72  s the kind of er
9d90: 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69 6e  ror specified in
9da0: 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74   the.** argument
9db0: 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
9dc0: 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 69  *sqlite3ErrStr(i
9dd0: 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74 69 63  nt rc){.  static
9de0: 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e   const char* con
9df0: 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20  st aMsg[] = {.  
9e00: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20    /* SQLITE_OK  
9e10: 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20          */ "not 
9e20: 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f  an error",.    /
9e30: 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20 20  * SQLITE_ERROR  
9e40: 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67       */ "SQL log
9e50: 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73 73  ic error or miss
9e60: 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a 20  ing database",. 
9e70: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54     /* SQLITE_INT
9e80: 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20  ERNAL    */ 0,. 
9e90: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52     /* SQLITE_PER
9ea0: 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61 63 63  M        */ "acc
9eb0: 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20 64  ess permission d
9ec0: 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  enied",.    /* S
9ed0: 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20 20 20  QLITE_ABORT     
9ee0: 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72    */ "callback r
9ef0: 65 71 75 65 73 74 65 64 20 71 75 65 72 79 20 61  equested query a
9f00: 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51  bort",.    /* SQ
9f10: 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20 20 20  LITE_BUSY       
9f20: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 69 73   */ "database is
9f30: 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a   locked",.    /*
9f40: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20   SQLITE_LOCKED  
9f50: 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65      */ "database
9f60: 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64   table is locked
9f70: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
9f80: 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20  _NOMEM       */ 
9f90: 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c  "out of memory",
9fa0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
9fb0: 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61  EADONLY    */ "a
9fc0: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
9fd0: 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61 62  a readonly datab
9fe0: 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ase",.    /* SQL
9ff0: 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 20 20  ITE_INTERRUPT   
a000: 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65 64 22  */ "interrupted"
a010: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a020: 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f 20 22  IOERR       */ "
a030: 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c  disk I/O error",
a040: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
a050: 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20 22 64  ORRUPT     */ "d
a060: 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d 61  atabase disk ima
a070: 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22  ge is malformed"
a080: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a090: 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22  NOTFOUND    */ "
a0a0: 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f  unknown operatio
a0b0: 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  n",.    /* SQLIT
a0c0: 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f  E_FULL        */
a0d0: 20 22 64 61 74 61 62 61 73 65 20 6f 72 20 64 69   "database or di
a0e0: 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20  sk is full",.   
a0f0: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f   /* SQLITE_CANTO
a100: 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c  PEN    */ "unabl
a110: 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61  e to open databa
a120: 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a  se file",.    /*
a130: 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c   SQLITE_PROTOCOL
a140: 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20      */ "locking 
a150: 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f  protocol",.    /
a160: 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20 20  * SQLITE_EMPTY  
a170: 20 20 20 20 20 2a 2f 20 22 74 61 62 6c 65 20 63       */ "table c
a180: 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61 22  ontains no data"
a190: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a1a0: 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f 20 22  SCHEMA      */ "
a1b0: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
a1c0: 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a 20 20  has changed",.  
a1d0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42    /* SQLITE_TOOB
a1e0: 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74 72 69  IG      */ "stri
a1f0: 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62  ng or blob too b
a200: 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ig",.    /* SQLI
a210: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a  TE_CONSTRAINT  *
a220: 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66 61  / "constraint fa
a230: 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  iled",.    /* SQ
a240: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 20 20  LITE_MISMATCH   
a250: 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20 6d 69   */ "datatype mi
a260: 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20  smatch",.    /* 
a270: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 20 20  SQLITE_MISUSE   
a280: 20 20 20 2a 2f 20 22 6c 69 62 72 61 72 79 20 72     */ "library r
a290: 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75  outine called ou
a2a0: 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22 2c 0a  t of sequence",.
a2b0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
a2c0: 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22 6c 61  LFS       */ "la
a2d0: 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72 74  rge file support
a2e0: 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c 0a 20   is disabled",. 
a2f0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54     /* SQLITE_AUT
a300: 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75 74  H        */ "aut
a310: 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65  horization denie
a320: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
a330: 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f  E_FORMAT      */
a340: 20 22 61 75 78 69 6c 69 61 72 79 20 64 61 74 61   "auxiliary data
a350: 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72 72 6f  base format erro
a360: 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  r",.    /* SQLIT
a370: 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a 2f  E_RANGE       */
a380: 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e   "bind or column
a390: 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61   index out of ra
a3a0: 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  nge",.    /* SQL
a3b0: 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20 20  ITE_NOTADB      
a3c0: 2a 2f 20 22 66 69 6c 65 20 69 73 20 65 6e 63 72  */ "file is encr
a3d0: 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f 74 20  ypted or is not 
a3e0: 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 7d  a database",.  }
a3f0: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
a400: 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20  zErr = "unknown 
a410: 65 72 72 6f 72 22 3b 0a 20 20 73 77 69 74 63 68  error";.  switch
a420: 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73 65  ( rc ){.    case
a430: 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f   SQLITE_ABORT_RO
a440: 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20  LLBACK: {.      
a450: 7a 45 72 72 20 3d 20 22 61 62 6f 72 74 20 64 75  zErr = "abort du
a460: 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a  e to ROLLBACK";.
a470: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a480: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
a490: 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30 78  {.      rc &= 0x
a4a0: 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41 4c  ff;.      if( AL
a4b0: 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20 72  WAYS(rc>=0) && r
a4c0: 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73 67  c<ArraySize(aMsg
a4d0: 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30  ) && aMsg[rc]!=0
a4e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72 72   ){.        zErr
a4f0: 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20   = aMsg[rc];.   
a500: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
a510: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
a520: 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a  turn zErr;.}../*
a530: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
a540: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62 75   implements a bu
a550: 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61 74  sy callback that
a560: 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69 65   sleeps and trie
a570: 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c  s.** again until
a580: 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65   a timeout value
a590: 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 54 68   is reached.  Th
a5a0: 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20  e timeout value 
a5b0: 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72  is.** an integer
a5c0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
a5d0: 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20 69  seconds passed i
a5e0: 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 0a 2a  n as the first.*
a5f0: 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  * argument..*/.s
a600: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
a610: 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62  DefaultBusyCallb
a620: 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c  ack(. void *ptr,
a630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a640: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
a650: 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f  ction */. int co
a660: 75 6e 74 20 20 20 20 20 20 20 20 20 20 20 20 20  unt             
a670: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
a680: 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73 20  times table has 
a690: 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a  been busy */.){.
a6a0: 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49  #if SQLITE_OS_WI
a6b0: 4e 20 7c 7c 20 28 64 65 66 69 6e 65 64 28 48 41  N || (defined(HA
a6c0: 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48 41  VE_USLEEP) && HA
a6d0: 56 45 5f 55 53 4c 45 45 50 29 0a 20 20 73 74 61  VE_USLEEP).  sta
a6e0: 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65 6c  tic const u8 del
a6f0: 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31  ays[] =.     { 1
a700: 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20  , 2, 5, 10, 15, 
a710: 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35 2c  20, 25, 25,  25,
a720: 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20 7d    50,  50, 100 }
a730: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
a740: 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20   u8 totals[] =. 
a750: 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20      { 0, 1, 3,  
a760: 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20 37  8, 18, 33, 53, 7
a770: 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37 38  8, 103, 128, 178
a780: 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e  , 228 };.# defin
a790: 65 20 4e 44 45 4c 41 59 20 41 72 72 61 79 53 69  e NDELAY ArraySi
a7a0: 7a 65 28 64 65 6c 61 79 73 29 0a 20 20 73 71 6c  ze(delays).  sql
a7b0: 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c 69  ite3 *db = (sqli
a7c0: 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74  te3 *)ptr;.  int
a7d0: 20 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62   timeout = db->b
a7e0: 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e  usyTimeout;.  in
a7f0: 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a  t delay, prior;.
a800: 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e 74  .  assert( count
a810: 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f 75  >=0 );.  if( cou
a820: 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20  nt < NDELAY ){. 
a830: 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79     delay = delay
a840: 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72  s[count];.    pr
a850: 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75  ior = totals[cou
a860: 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  nt];.  }else{.  
a870: 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73    delay = delays
a880: 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20  [NDELAY-1];.    
a890: 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e  prior = totals[N
a8a0: 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79  DELAY-1] + delay
a8b0: 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d  *(count-(NDELAY-
a8c0: 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  1));.  }.  if( p
a8d0: 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20 74  rior + delay > t
a8e0: 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64 65  imeout ){.    de
a8f0: 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20  lay = timeout - 
a900: 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20 64  prior;.    if( d
a910: 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72 6e  elay<=0 ) return
a920: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
a930: 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66  3OsSleep(db->pVf
a940: 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a  s, delay*1000);.
a950: 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73    return 1;.#els
a960: 65 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  e.  sqlite3 *db 
a970: 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72  = (sqlite3 *)ptr
a980: 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74 20  ;.  int timeout 
a990: 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70 74  = ((sqlite3 *)pt
a9a0: 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b  r)->busyTimeout;
a9b0: 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31 29  .  if( (count+1)
a9c0: 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74 20  *1000 > timeout 
a9d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
a9e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
a9f0: 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20  Sleep(db->pVfs, 
aa00: 31 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74 75  1000000);.  retu
aa10: 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a  rn 1;.#endif.}..
aa20: 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
aa30: 20 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e 64   given busy hand
aa40: 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ler..**.** This 
aa50: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
aa60: 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61 74  d when an operat
aa70: 69 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68 20  ion failed with 
aa80: 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68  a lock..** If th
aa90: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
aaa0: 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  ns non-zero, the
aab0: 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65 64   lock is retried
aac0: 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74 75  .  If it.** retu
aad0: 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72 61  rns 0, the opera
aae0: 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74 68  tion aborts with
aaf0: 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20   an SQLITE_BUSY 
ab00: 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  error..*/.int sq
ab10: 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
ab20: 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64 6c  andler(BusyHandl
ab30: 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63  er *p){.  int rc
ab40: 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 3d  ;.  if( NEVER(p=
ab50: 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d  =0) || p->xFunc=
ab60: 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30  =0 || p->nBusy<0
ab70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
ab80: 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e  c = p->xFunc(p->
ab90: 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b  pArg, p->nBusy);
aba0: 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a  .  if( rc==0 ){.
abb0: 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d      p->nBusy = -
abc0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
abd0: 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a  p->nBusy++;.  }.
abe0: 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a    return rc; .}.
abf0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
ac00: 69 6e 65 20 73 65 74 73 20 74 68 65 20 62 75 73  ine sets the bus
ac10: 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  y callback for a
ac20: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
ac30: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
ac40: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
ac50: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
ac60: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  en argument..*/.
ac70: 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79  int sqlite3_busy
ac80: 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69  _handler(.  sqli
ac90: 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28  te3 *db,.  int (
aca0: 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e  *xBusy)(void*,in
acb0: 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  t),.  void *pArg
acc0: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
acd0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
ace0: 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79  tex);.  db->busy
acf0: 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20  Handler.xFunc = 
ad00: 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73  xBusy;.  db->bus
ad10: 79 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20  yHandler.pArg = 
ad20: 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79  pArg;.  db->busy
ad30: 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20  Handler.nBusy = 
ad40: 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54 69 6d  0;.  db->busyTim
ad50: 65 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  eout = 0;.  sqli
ad60: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
ad70: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
ad80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ad90: 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
ada0: 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f  E_OMIT_PROGRESS_
adb0: 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54  CALLBACK./*.** T
adc0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74 73  his routine sets
add0: 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63 61   the progress ca
ade0: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71  llback for an Sq
adf0: 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f  lite database to
ae00: 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61   the.** given ca
ae10: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
ae20: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
ae30: 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f  rgument. The pro
ae40: 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 77  gress callback w
ae50: 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65  ill.** be invoke
ae60: 64 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70 63  d every nOps opc
ae70: 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  odes..*/.void sq
ae80: 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f 68  lite3_progress_h
ae90: 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65  andler(.  sqlite
aea0: 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f  3 *db, .  int nO
aeb0: 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f  ps,.  int (*xPro
aec0: 67 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a  gress)(void*), .
aed0: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
aee0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
aef0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
af00: 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20 29  ;.  if( nOps>0 )
af10: 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72  {.    db->xProgr
af20: 65 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73 3b  ess = xProgress;
af30: 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65  .    db->nProgre
af40: 73 73 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e 65  ssOps = (unsigne
af50: 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e  d)nOps;.    db->
af60: 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20 70  pProgressArg = p
af70: 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Arg;.  }else{.  
af80: 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20    db->xProgress 
af90: 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  = 0;.    db->nPr
afa0: 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20  ogressOps = 0;. 
afb0: 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73 73     db->pProgress
afc0: 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73  Arg = 0;.  }.  s
afd0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
afe0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d  ve(db->mutex);.}
aff0: 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
b000: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 73  This routine ins
b010: 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74 20  talls a default 
b020: 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68 61  busy handler tha
b030: 74 20 77 61 69 74 73 20 66 6f 72 20 74 68 65 0a  t waits for the.
b040: 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75 6d  ** specified num
b050: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
b060: 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74 75 72  nds before retur
b070: 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73  ning 0..*/.int s
b080: 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d 65  qlite3_busy_time
b090: 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  out(sqlite3 *db,
b0a0: 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69 66 28 20   int ms){.  if( 
b0b0: 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  ms>0 ){.    sqli
b0c0: 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72  te3_busy_handler
b0d0: 28 64 62 2c 20 73 71 6c 69 74 65 44 65 66 61 75  (db, sqliteDefau
b0e0: 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20  ltBusyCallback, 
b0f0: 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20 20  (void*)db);.    
b100: 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20  db->busyTimeout 
b110: 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  = ms;.  }else{. 
b120: 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
b130: 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20 30  handler(db, 0, 0
b140: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b150: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
b160: 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70 65  .** Cause any pe
b170: 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20  nding operation 
b180: 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20 65  to stop at its e
b190: 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75 6e  arliest opportun
b1a0: 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ity..*/.void sql
b1b0: 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 73  ite3_interrupt(s
b1c0: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 64  qlite3 *db){.  d
b1d0: 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75 70  b->u1.isInterrup
b1e0: 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a  ted = 1;.}.../*.
b1f0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
b200: 20 69 73 20 65 78 61 63 74 6c 79 20 74 68 65 20   is exactly the 
b210: 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33 5f  same as sqlite3_
b220: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
b230: 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68 61  ), except.** tha
b240: 74 20 69 74 20 69 73 20 64 65 73 69 67 6e 65 64  t it is designed
b250: 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62 79   to be called by
b260: 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20   internal code. 
b270: 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 69  The difference i
b280: 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20 6d  s.** that if a m
b290: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69 6e  alloc() fails in
b2a0: 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
b2b0: 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65  function(), an e
b2c0: 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20  rror code.** is 
b2d0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65  returned and the
b2e0: 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c   mallocFailed fl
b2f0: 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a  ag cleared. .*/.
b300: 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61 74  int sqlite3Creat
b310: 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  eFunc(.  sqlite3
b320: 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68   *db,.  const ch
b330: 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  ar *zFunctionNam
b340: 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20  e,.  int nArg,. 
b350: 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64   int enc,.  void
b360: 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20 76   *pUserData,.  v
b370: 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c  oid (*xFunc)(sql
b380: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
b390: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20  t,sqlite3_value 
b3a0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
b3b0: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
b3c0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
b3d0: 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76  3_value **),.  v
b3e0: 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71  oid (*xFinal)(sq
b3f0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c  lite3_context*),
b400: 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f  .  FuncDestructo
b410: 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a 29  r *pDestructor.)
b420: 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a  {.  FuncDef *p;.
b430: 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20    int nName;..  
b440: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
b450: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
b460: 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a  utex) );.  if( z
b470: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20  FunctionName==0 
b480: 7c 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20  ||.      (xFunc 
b490: 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53  && (xFinal || xS
b4a0: 74 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20  tep)) || .      
b4b0: 28 21 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e  (!xFunc && (xFin
b4c0: 61 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c  al && !xStep)) |
b4d0: 7c 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20  |.      (!xFunc 
b4e0: 26 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78  && (!xFinal && x
b4f0: 53 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20  Step)) ||.      
b500: 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67  (nArg<-1 || nArg
b510: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43  >SQLITE_MAX_FUNC
b520: 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20  TION_ARG) ||.   
b530: 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d     (255<(nName =
b540: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
b550: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29  ( zFunctionName)
b560: 29 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  )) ){.    return
b570: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
b580: 4b 50 54 3b 0a 20 20 7d 0a 20 20 0a 23 69 66 6e  KPT;.  }.  .#ifn
b590: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
b5a0: 55 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51  UTF16.  /* If SQ
b5b0: 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70  LITE_UTF16 is sp
b5c0: 65 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65  ecified as the e
b5d0: 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72  ncoding type, tr
b5e0: 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a  ansform this.  *
b5f0: 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49  * to one of SQLI
b600: 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51  TE_UTF16LE or SQ
b610: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69  LITE_UTF16BE usi
b620: 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49  ng the.  ** SQLI
b630: 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d  TE_UTF16NATIVE m
b640: 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46  acro. SQLITE_UTF
b650: 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69  16 is not used i
b660: 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a  nternally..  **.
b670: 20 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41    ** If SQLITE_A
b680: 4e 59 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  NY is specified,
b690: 20 61 64 64 20 74 68 72 65 65 20 76 65 72 73 69   add three versi
b6a0: 6f 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ons of the funct
b6b0: 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20  ion.  ** to the 
b6c0: 68 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  hash table..  */
b6d0: 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49  .  if( enc==SQLI
b6e0: 54 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20  TE_UTF16 ){.    
b6f0: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
b700: 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73  16NATIVE;.  }els
b710: 65 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54  e if( enc==SQLIT
b720: 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74  E_ANY ){.    int
b730: 20 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   rc;.    rc = sq
b740: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
b750: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
b760: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
b770: 55 54 46 38 2c 0a 20 20 20 20 20 20 20 20 20 70  UTF8,.         p
b780: 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c  UserData, xFunc,
b790: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20   xStep, xFinal, 
b7a0: 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20  pDestructor);.  
b7b0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b7c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
b7d0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
b7e0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  unc(db, zFunctio
b7f0: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  nName, nArg, SQL
b800: 49 54 45 5f 55 54 46 31 36 4c 45 2c 0a 20 20 20  ITE_UTF16LE,.   
b810: 20 20 20 20 20 20 20 70 55 73 65 72 44 61 74 61         pUserData
b820: 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20  , xFunc, xStep, 
b830: 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72 75 63  xFinal, pDestruc
b840: 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tor);.    }.    
b850: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b860: 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  K ){.      retur
b870: 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
b880: 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46  enc = SQLITE_UTF
b890: 31 36 42 45 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a  16BE;.  }.#else.
b8a0: 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55    enc = SQLITE_U
b8b0: 54 46 38 3b 0a 23 65 6e 64 69 66 0a 20 20 0a 20  TF8;.#endif.  . 
b8c0: 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 20   /* Check if an 
b8d0: 65 78 69 73 74 69 6e 67 20 66 75 6e 63 74 69 6f  existing functio
b8e0: 6e 20 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72  n is being overr
b8f0: 69 64 64 65 6e 20 6f 72 20 64 65 6c 65 74 65 64  idden or deleted
b900: 2e 20 49 66 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e  . If so,.  ** an
b910: 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  d there are acti
b920: 76 65 20 56 4d 73 2c 20 74 68 65 6e 20 72 65 74  ve VMs, then ret
b930: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
b940: 20 49 66 20 61 20 66 75 6e 63 74 69 6f 6e 0a 20   If a function. 
b950: 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 6f 76 65   ** is being ove
b960: 72 72 69 64 64 65 6e 2f 64 65 6c 65 74 65 64 20  rridden/deleted 
b970: 62 75 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f  but there are no
b980: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 61 6c 6c   active VMs, all
b990: 6f 77 20 74 68 65 0a 20 20 2a 2a 20 6f 70 65 72  ow the.  ** oper
b9a0: 61 74 69 6f 6e 20 74 6f 20 63 6f 6e 74 69 6e 75  ation to continu
b9b0: 65 20 62 75 74 20 69 6e 76 61 6c 69 64 61 74 65  e but invalidate
b9c0: 20 61 6c 6c 20 70 72 65 63 6f 6d 70 69 6c 65 64   all precompiled
b9d0: 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a   statements..  *
b9e0: 2f 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  /.  p = sqlite3F
b9f0: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
ba00: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
ba10: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29  Name, nArg, (u8)
ba20: 65 6e 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  enc, 0);.  if( p
ba30: 20 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d   && p->iPrefEnc=
ba40: 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d  =enc && p->nArg=
ba50: 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28  =nArg ){.    if(
ba60: 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65   db->nVdbeActive
ba70: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
ba80: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
ba90: 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
baa0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65   "unable to dele
bab0: 74 65 2f 6d 6f 64 69 66 79 20 75 73 65 72 2d 66  te/modify user-f
bac0: 75 6e 63 74 69 6f 6e 20 64 75 65 20 74 6f 20 61  unction due to a
bad0: 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
bae0: 22 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ");.      assert
baf0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
bb00: 6c 65 64 20 29 3b 0a 20 20 20 20 20 20 72 65 74  led );.      ret
bb10: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
bb20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
bb30: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
bb40: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
bb50: 73 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  s(db);.    }.  }
bb60: 0a 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 46  ..  p = sqlite3F
bb70: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20  indFunction(db, 
bb80: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
bb90: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 28 75 38 29  Name, nArg, (u8)
bba0: 65 6e 63 2c 20 31 29 3b 0a 20 20 61 73 73 65 72  enc, 1);.  asser
bbb0: 74 28 70 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  t(p || db->mallo
bbc0: 63 46 61 69 6c 65 64 29 3b 0a 20 20 69 66 28 20  cFailed);.  if( 
bbd0: 21 70 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  !p ){.    return
bbe0: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
bbf0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 6f   }..  /* If an o
bc00: 6c 64 65 72 20 76 65 72 73 69 6f 6e 20 6f 66 20  lder version of 
bc10: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  the function wit
bc20: 68 20 61 20 63 6f 6e 66 69 67 75 72 65 64 20 64  h a configured d
bc30: 65 73 74 72 75 63 74 6f 72 20 69 73 0a 20 20 2a  estructor is.  *
bc40: 2a 20 62 65 69 6e 67 20 72 65 70 6c 61 63 65 64  * being replaced
bc50: 20 69 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74   invoke the dest
bc60: 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ructor function 
bc70: 68 65 72 65 2e 20 2a 2f 0a 20 20 66 75 6e 63 74  here. */.  funct
bc80: 69 6f 6e 44 65 73 74 72 6f 79 28 64 62 2c 20 70  ionDestroy(db, p
bc90: 29 3b 0a 0a 20 20 69 66 28 20 70 44 65 73 74 72  );..  if( pDestr
bca0: 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 70 44 65  uctor ){.    pDe
bcb0: 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65 66 2b 2b  structor->nRef++
bcc0: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70 44 65 73 74  ;.  }.  p->pDest
bcd0: 72 75 63 74 6f 72 20 3d 20 70 44 65 73 74 72 75  ructor = pDestru
bce0: 63 74 6f 72 3b 0a 20 20 70 2d 3e 66 6c 61 67 73  ctor;.  p->flags
bcf0: 20 3d 20 30 3b 0a 20 20 70 2d 3e 78 46 75 6e 63   = 0;.  p->xFunc
bd00: 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78   = xFunc;.  p->x
bd10: 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20  Step = xStep;.  
bd20: 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78  p->xFinalize = x
bd30: 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65  Final;.  p->pUse
bd40: 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61 74  rData = pUserDat
bd50: 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28  a;.  p->nArg = (
bd60: 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75  u16)nArg;.  retu
bd70: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
bd80: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65  ./*.** Create ne
bd90: 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73  w user functions
bda0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
bdb0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
bdc0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
bdd0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
bde0: 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Func,.  int nArg
bdf0: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
be00: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
be10: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
be20: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
be30: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
be40: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
be50: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
be60: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
be70: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
be80: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
be90: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
bea0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
beb0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
bec0: 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72  2(db, zFunc, nAr
bed0: 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63  g, enc, p, xFunc
bee0: 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20  , xStep,.       
bef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 78 46 69               xFi
bf10: 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20  nal, 0);.}..int 
bf20: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
bf30: 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71  unction_v2(.  sq
bf40: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
bf50: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a  st char *zFunc,.
bf60: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
bf70: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
bf80: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63  ,.  void (*xFunc
bf90: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
bfa0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
bfb0: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
bfc0: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
bfd0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
bfe0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
bff0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
c000: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
c010: 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  xt*),.  void (*x
c020: 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29  Destroy)(void *)
c030: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
c040: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46  QLITE_ERROR;.  F
c050: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
c060: 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Arg = 0;.  sqlit
c070: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
c080: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
c090: 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20   xDestroy ){.   
c0a0: 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73   pArg = (FuncDes
c0b0: 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65  tructor *)sqlite
c0c0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
c0d0: 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73  , sizeof(FuncDes
c0e0: 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69  tructor));.    i
c0f0: 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20  f( !pArg ){.    
c100: 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20    xDestroy(p);. 
c110: 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20       goto out;. 
c120: 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78     }.    pArg->x
c130: 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72  Destroy = xDestr
c140: 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55  oy;.    pArg->pU
c150: 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d  serData = p;.  }
c160: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43  .  rc = sqlite3C
c170: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
c180: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
c190: 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  p, xFunc, xStep,
c1a0: 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a   xFinal, pArg);.
c1b0: 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
c1c0: 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  rg->nRef==0 ){. 
c1d0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
c1e0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
c1f0: 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  xDestroy(p);.   
c200: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c210: 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20  b, pArg);.  }.. 
c220: 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69  out:.  rc = sqli
c230: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
c240: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
c250: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
c260: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
c270: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
c280: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
c290: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
c2a0: 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20  te_function16(. 
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 76 6f 69 64 20 2a 7a 46 75 6e  const void *zFun
c2d0: 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  ctionName,.  int
c2e0: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65   nArg,.  int eTe
c2f0: 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70  xtRep,.  void *p
c300: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63  ,.  void (*xFunc
c310: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
c320: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
c330: 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  alue**),.  void 
c340: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
c350: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
c360: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a  lite3_value**),.
c370: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
c380: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
c390: 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
c3a0: 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a    char *zFunc8;.
c3b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
c3c0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
c3d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
c3e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
c3f0: 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69  .  zFunc8 = sqli
c400: 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20  te3Utf16to8(db, 
c410: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d  zFunctionName, -
c420: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  1, SQLITE_UTF16N
c430: 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73  ATIVE);.  rc = s
c440: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
c450: 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72  (db, zFunc8, nAr
c460: 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20  g, eTextRep, p, 
c470: 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  xFunc, xStep, xF
c480: 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74  inal,0);.  sqlit
c490: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75  e3DbFree(db, zFu
c4a0: 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  nc8);.  rc = sql
c4b0: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
c4c0: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
c4d0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
c4e0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
c4f0: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  rc;.}.#endif.../
c500: 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61  *.** Declare tha
c510: 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  t a function has
c520: 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64   been overloaded
c530: 20 62 79 20 61 20 76 69 72 74 75 61 6c 20 74 61   by a virtual ta
c540: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
c550: 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61  e function alrea
c560: 64 79 20 65 78 69 73 74 73 20 61 73 20 61 20 72  dy exists as a r
c570: 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75  egular global fu
c580: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20  nction, then.** 
c590: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
c5a0: 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65  a no-op.  If the
c5b0: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
c5c0: 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63  ot exist, then c
c5d0: 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f  reate.** a new o
c5e0: 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73 20 74  ne that always t
c5f0: 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65  hrows a run-time
c600: 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20   error.  .**.** 
c610: 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62  When virtual tab
c620: 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72  les intend to pr
c630: 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61  ovide an overloa
c640: 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  ded function, th
c650: 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c  ey.** should cal
c660: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  l this routine t
c670: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
c680: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
c690: 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f  exists..** A glo
c6a0: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  bal function mus
c6b0: 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72  t exist in order
c6c0: 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75   for name resolu
c6d0: 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20  tion to work.** 
c6e0: 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74  properly..*/.int
c6f0: 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
c700: 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  d_function(.  sq
c710: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
c720: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
c730: 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20    int nArg.){.  
c740: 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  int nName = sqli
c750: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
c760: 65 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e);.  int rc = S
c770: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
c780: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
c790: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
c7a0: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  ( sqlite3FindFun
c7b0: 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ction(db, zName,
c7c0: 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   nName, nArg, SQ
c7d0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30  LITE_UTF8, 0)==0
c7e0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
c7f0: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
c800: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  b, zName, nArg, 
c810: 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c830: 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74          0, sqlit
c840: 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f  e3InvalidFunctio
c850: 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  n, 0, 0, 0);.  }
c860: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
c870: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
c880: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
c890: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
c8a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c8b0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c8c0: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _OMIT_TRACE./*.*
c8d0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61  * Register a tra
c8e0: 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ce function.  Th
c8f0: 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20  e pArg from the 
c900: 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
c910: 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69  tered trace.** i
c920: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
c930: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65  .** A NULL trace
c940: 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20   function means 
c950: 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20  that no tracing 
c960: 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20  is executes.  A 
c970: 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63  non-NULL.** trac
c980: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
c990: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
c9a0: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
c9b0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
c9c0: 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65  h.** SQL stateme
c9d0: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  nt..*/.void *sql
c9e0: 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74  ite3_trace(sqlit
c9f0: 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78  e3 *db, void (*x
ca00: 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  Trace)(void*,con
ca10: 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20  st char*), void 
ca20: 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a  *pArg){.  void *
ca30: 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pOld;.  sqlite3_
ca40: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
ca50: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
ca60: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a   db->pTraceArg;.
ca70: 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78    db->xTrace = x
ca80: 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72  Trace;.  db->pTr
ca90: 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  aceArg = pArg;. 
caa0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
cab0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
cac0: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
cad0: 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  }./*.** Register
cae0: 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74   a profile funct
caf0: 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66  ion.  The pArg f
cb00: 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
cb10: 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a  ly registered .*
cb20: 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  * profile functi
cb30: 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  on is returned. 
cb40: 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70   .**.** A NULL p
cb50: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20  rofile function 
cb60: 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72  means that no pr
cb70: 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75  ofiling is execu
cb80: 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c  tes.  A non-NULL
cb90: 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61  .** profile is a
cba0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
cbb0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69  nction that is i
cbc0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
cbd0: 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65  nclusion of.** e
cbe0: 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
cbf0: 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a  t that is run..*
cc00: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
cc10: 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74  profile(.  sqlit
cc20: 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28  e3 *db,.  void (
cc30: 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a  *xProfile)(void*
cc40: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c  ,const char*,sql
cc50: 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76  ite_uint64),.  v
cc60: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76  oid *pArg.){.  v
cc70: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
cc80: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
cc90: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
cca0: 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69  Old = db->pProfi
ccb0: 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72  leArg;.  db->xPr
ccc0: 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65  ofile = xProfile
ccd0: 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  ;.  db->pProfile
cce0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
ccf0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
cd00: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
cd10: 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23  return pOld;.}.#
cd20: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
cd30: 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  OMIT_TRACE */../
cd40: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
cd50: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
cd60: 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72  nvoked when a tr
cd70: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
cd80: 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76  s..** If the inv
cd90: 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65  oked function re
cda0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
cdb0: 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20  then the commit 
cdc0: 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c  becomes a.** rol
cdd0: 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  lback..*/.void *
cde0: 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68  sqlite3_commit_h
cdf0: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
ce00: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
ce10: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
ce20: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
ce30: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  base */.  int (*
ce40: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
ce50: 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  ),  /* Function 
ce60: 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63  to invoke on eac
ce70: 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f  h commit */.  vo
ce80: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
ce90: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
cea0: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
ceb0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
cec0: 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65   *pOld;.  sqlite
ced0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
cee0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
cef0: 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72   = db->pCommitAr
cf00: 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  g;.  db->xCommit
cf10: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
cf20: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d  back;.  db->pCom
cf30: 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  mitArg = pArg;. 
cf40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
cf50: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
cf60: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
cf70: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
cf80: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
cf90: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
cfa0: 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70  time a row is up
cfb0: 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74  dated,.** insert
cfc0: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73  ed or deleted us
cfd0: 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73  ing this databas
cfe0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
cff0: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75  .void *sqlite3_u
d000: 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71  pdate_hook(.  sq
d010: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
d020: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
d030: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
d040: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
d050: 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63   void (*xCallbac
d060: 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61  k)(void*,int,cha
d070: 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63  r const *,char c
d080: 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e  onst *,sqlite_in
d090: 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  t64),.  void *pA
d0a0: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
d0b0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
d0c0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
d0d0: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
d0e0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
d0f0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
d100: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
d110: 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64  >pUpdateArg;.  d
d120: 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
d130: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
d140: 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67    db->pUpdateArg
d150: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
d160: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
d170: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
d180: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
d190: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
d1a0: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
d1b0: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
d1c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
d1d0: 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62  rolled.** back b
d1e0: 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
d1f0: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
d200: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c  oid *sqlite3_rol
d210: 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71  lback_hook(.  sq
d220: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
d230: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
d240: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
d250: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
d260: 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63   void (*xCallbac
d270: 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61  k)(void*), /* Ca
d280: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
d290: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d2b0: 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
d2c0: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
d2d0: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20  .  void *pRet;. 
d2e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
d2f0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
d300: 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52  .  pRet = db->pR
d310: 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62  ollbackArg;.  db
d320: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
d330: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
d340: 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  .  db->pRollback
d350: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
d360: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
d370: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
d380: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
d390: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d3a0: 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68  MIT_WAL./*.** Th
d3b0: 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  e sqlite3_wal_ho
d3c0: 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65  ok() callback re
d3d0: 67 69 73 74 65 72 65 64 20 62 79 20 73 71 6c 69  gistered by sqli
d3e0: 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
d3f0: 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76  kpoint()..** Inv
d400: 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  oke sqlite3_wal_
d410: 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68  checkpoint if th
d420: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  e number of fram
d430: 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69  es in the log fi
d440: 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
d450: 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57   than sqlite3.pW
d460: 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e  alArg cast to an
d470: 20 69 6e 74 65 67 65 72 20 28 74 68 65 20 76 61   integer (the va
d480: 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62  lue configured b
d490: 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65  y.** wal_autoche
d4a0: 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a  ckpoint())..*/ .
d4b0: 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65  int sqlite3WalDe
d4c0: 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69  faultHook(.  voi
d4d0: 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20  d *pClientData, 
d4e0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
d4f0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
d500: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
d510: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63  onnection */.  c
d520: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
d530: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
d540: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d  e */.  int nFram
d550: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
d560: 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a   Size of WAL */.
d570: 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e  ){.  if( nFrame>
d580: 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  =SQLITE_PTR_TO_I
d590: 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20  NT(pClientData) 
d5a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
d5b0: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
d5c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  );.    sqlite3_w
d5d0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  al_checkpoint(db
d5e0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , zDb);.    sqli
d5f0: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
d600: 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  oc();.  }.  retu
d610: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d620: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d630: 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
d640: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e  .** Configure an
d650: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
d660: 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  k() callback to 
d670: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68  automatically ch
d680: 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61  eckpoint.** a da
d690: 74 61 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d  tabase after com
d6a0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
d6b0: 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61  ction if there a
d6c0: 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20  re nFrame or.** 
d6d0: 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74  more frames in t
d6e0: 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73  he log file. Pas
d6f0: 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e  sing zero or a n
d700: 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 61 73  egative value as
d710: 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70   the.** nFrame p
d720: 61 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65  arameter disable
d730: 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63  s automatic chec
d740: 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79  kpoints entirely
d750: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
d760: 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20  back registered 
d770: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
d780: 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78   replaces any ex
d790: 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a  isting callback.
d7a0: 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20 75 73  ** registered us
d7b0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ing sqlite3_wal_
d7c0: 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65  hook(). Likewise
d7d0: 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20 61 20  , registering a 
d7e0: 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  callback.** usin
d7f0: 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  g sqlite3_wal_ho
d800: 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74 68  ok() disables th
d810: 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63  e automatic chec
d820: 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d  kpoint mechanism
d830: 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62  .** configured b
d840: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
d850: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
d860: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
d870: 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
d880: 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66  int nFrame){.#if
d890: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d8a0: 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  WAL.  UNUSED_PAR
d8b0: 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e  AMETER(db);.  UN
d8c0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
d8d0: 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 20 20  Frame);.#else.  
d8e0: 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a  if( nFrame>0 ){.
d8f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
d900: 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33  hook(db, sqlite3
d910: 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20  WalDefaultHook, 
d920: 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
d930: 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65  R(nFrame));.  }e
d940: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
d950: 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c  _wal_hook(db, 0,
d960: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
d970: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d980: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  OK;.}../*.** Reg
d990: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
d9a0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
d9b0: 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
d9c0: 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65  action is writte
d9d0: 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72  n.** into the wr
d9e0: 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79  ite-ahead-log by
d9f0: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
da00: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
da10: 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f  id *sqlite3_wal_
da20: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
da30: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
da40: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
da50: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
da60: 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a  is db handle */.
da70: 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b    int(*xCallback
da80: 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65  )(void *, sqlite
da90: 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  3*, const char*,
daa0: 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70   int),.  void *p
dab0: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
dac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
dad0: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
dae0: 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29  d to xCallback()
daf0: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
db00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
db10: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73   void *pRet;.  s
db20: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
db30: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
db40: 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c   pRet = db->pWal
db50: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43  Arg;.  db->xWalC
db60: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
db70: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41  ack;.  db->pWalA
db80: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
db90: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
dba0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
dbb0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73  eturn pRet;.#els
dbc0: 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e.  return 0;.#e
dbd0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ndif.}../*.** Ch
dbe0: 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73  eckpoint databas
dbf0: 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e zDb..*/.int sq
dc00: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
dc10: 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74  oint_v2(.  sqlit
dc20: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
dc30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
dc40: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
dc50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
dc60: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
dc70: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74     /* Name of at
dc80: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20  tached database 
dc90: 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69  (or NULL) */.  i
dca0: 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20  nt eMode,       
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dcc0: 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  * SQLITE_CHECKPO
dcd0: 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20  INT_* value */. 
dce0: 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20   int *pnLog,    
dcf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd00: 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
dd10: 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d   WAL log in fram
dd20: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43  es */.  int *pnC
dd30: 6b 70 74 20 20 20 20 20 20 20 20 20 20 20 20 20  kpt             
dd40: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
dd50: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
dd60: 66 72 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e  frames checkpoin
dd70: 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66  ted */.){.#ifdef
dd80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
dd90: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
dda0: 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  _OK;.#else.  int
ddb0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
ddc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ddd0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
dde0: 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54   int iDb = SQLIT
ddf0: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20  E_MAX_ATTACHED; 
de00: 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b   /* sqlite3.aDb[
de10: 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f  ] index of db to
de20: 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a   checkpoint */..
de30: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
de40: 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
de50: 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61  bles to -1 in ca
de60: 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  se an error occu
de70: 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c  rs. */.  if( pnL
de80: 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31  og ) *pnLog = -1
de90: 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29  ;.  if( pnCkpt )
dea0: 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a   *pnCkpt = -1;..
deb0: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
dec0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c  _CHECKPOINT_FULL
ded0: 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  >SQLITE_CHECKPOI
dee0: 4e 54 5f 50 41 53 53 49 56 45 20 29 3b 0a 20 20  NT_PASSIVE );.  
def0: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
df00: 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53  HECKPOINT_FULL<S
df10: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
df20: 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20 61 73  _RESTART );.  as
df30: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
df40: 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2b  CKPOINT_PASSIVE+
df50: 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  2==SQLITE_CHECKP
df60: 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a  OINT_RESTART );.
df70: 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49    if( eMode<SQLI
df80: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
df90: 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53  SSIVE || eMode>S
dfa0: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
dfb0: 5f 52 45 53 54 41 52 54 20 29 7b 0a 20 20 20 20  _RESTART ){.    
dfc0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
dfd0: 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  SUSE;.  }..  sql
dfe0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
dff0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
e000: 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d  f( zDb && zDb[0]
e010: 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   ){.    iDb = sq
e020: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
e030: 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20  db, zDb);.  }.  
e040: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
e050: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
e060: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  OR;.    sqlite3E
e070: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
e080: 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20  ERROR, "unknown 
e090: 64 61 74 61 62 61 73 65 3a 20 25 73 22 2c 20 7a  database: %s", z
e0a0: 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Db);.  }else{.  
e0b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 68    rc = sqlite3Ch
e0c0: 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 69 44 62  eckpoint(db, iDb
e0d0: 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20  , eMode, pnLog, 
e0e0: 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20 73 71 6c  pnCkpt);.    sql
e0f0: 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
e100: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  , 0);.  }.  rc =
e110: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
e120: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
e130: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
e140: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
e150: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
e160: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f  .../*.** Checkpo
e170: 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62  int database zDb
e180: 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c  . If zDb is NULL
e190: 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75 66 66  , or if the buff
e1a0: 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a  er zDb points.**
e1b0: 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a   to contains a z
e1c0: 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e  ero-length strin
e1d0: 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  g, all attached 
e1e0: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 0a 2a  databases are .*
e1f0: 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a  * checkpointed..
e200: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
e210: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71  al_checkpoint(sq
e220: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
e230: 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 72   char *zDb){.  r
e240: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61  eturn sqlite3_wa
e250: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
e260: 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f  db, zDb, SQLITE_
e270: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
e280: 56 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69  VE, 0, 0);.}..#i
e290: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e2a0: 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  T_WAL./*.** Run 
e2b0: 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20  a checkpoint on 
e2c0: 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 54 68  database iDb. Th
e2d0: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
e2e0: 20 64 61 74 61 62 61 73 65 20 69 44 62 20 69 73   database iDb is
e2f0: 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  .** not currentl
e300: 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  y open in WAL mo
e310: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  de..**.** If a t
e320: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
e330: 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
e340: 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f  se being checkpo
e350: 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20  inted, this .** 
e360: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
e370: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61   SQLITE_LOCKED a
e380: 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  nd a checkpoint 
e390: 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
e3a0: 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
e3b0: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
e3c0: 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b  unning the check
e3d0: 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65  point, an SQLite
e3e0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a   error code is .
e3f0: 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65  ** returned (i.e
e400: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e  . SQLITE_IOERR).
e410: 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
e420: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE_OK..**.** The
e430: 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61   mutex on databa
e440: 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f  se handle db sho
e450: 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20 74  uld be held by t
e460: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d  he caller. The m
e470: 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74  utex.** associat
e480: 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ed with the spec
e490: 69 66 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e  ific b-tree bein
e4a0: 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69  g checkpointed i
e4b0: 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68  s taken by.** th
e4c0: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  is function whil
e4d0: 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  e the checkpoint
e4e0: 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a   is running..**.
e4f0: 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70 61 73  ** If iDb is pas
e500: 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  sed SQLITE_MAX_A
e510: 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c  TTACHED, then al
e520: 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
e530: 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63  ases are.** chec
e540: 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20  kpointed. If an 
e550: 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
e560: 65 72 65 64 20 69 74 20 69 73 20 72 65 74 75 72  ered it is retur
e570: 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ned immediately 
e580: 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20  -.** no attempt 
e590: 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b  is made to check
e5a0: 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e  point any remain
e5b0: 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ing databases..*
e5c0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65  *.** Parameter e
e5d0: 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53  Mode is one of S
e5e0: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e5f0: 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f  _PASSIVE, FULL o
e600: 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e  r RESTART..*/.in
e610: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f  t sqlite3Checkpo
e620: 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
e630: 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 65 4d   int iDb, int eM
e640: 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c  ode, int *pnLog,
e650: 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20   int *pnCkpt){. 
e660: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
e670: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
e680: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
e690: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
e6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e6b0: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
e6c0: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
e6d0: 61 74 74 61 63 68 65 64 20 64 62 73 20 2a 2f 0a  attached dbs */.
e6e0: 20 20 69 6e 74 20 62 42 75 73 79 20 3d 20 30 3b    int bBusy = 0;
e6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e700: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53 51 4c    /* True if SQL
e710: 49 54 45 5f 42 55 53 59 20 68 61 73 20 62 65 65  ITE_BUSY has bee
e720: 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f  n encountered */
e730: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
e740: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
e750: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
e760: 73 73 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c  ssert( !pnLog ||
e770: 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20   *pnLog==-1 );. 
e780: 20 61 73 73 65 72 74 28 20 21 70 6e 43 6b 70 74   assert( !pnCkpt
e790: 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20   || *pnCkpt==-1 
e7a0: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
e7b0: 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d  <db->nDb && rc==
e7c0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
e7d0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 44 62 20  .    if( i==iDb 
e7e0: 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d  || iDb==SQLITE_M
e7f0: 41 58 5f 41 54 54 41 43 48 45 44 20 29 7b 0a 20  AX_ATTACHED ){. 
e800: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
e810: 33 42 74 72 65 65 43 68 65 63 6b 70 6f 69 6e 74  3BtreeCheckpoint
e820: 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c  (db->aDb[i].pBt,
e830: 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70   eMode, pnLog, p
e840: 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20 20 70 6e  nCkpt);.      pn
e850: 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Log = 0;.      p
e860: 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 20  nCkpt = 0;.     
e870: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
e880: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
e890: 62 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20  bBusy = 1;.     
e8a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
e8b0: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
e8c0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
e8d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
e8e0: 20 62 42 75 73 79 29 20 3f 20 53 51 4c 49 54 45   bBusy) ? SQLITE
e8f0: 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65  _BUSY : rc;.}.#e
e900: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
e910: 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
e920: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
e930: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
e940: 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75  main-memory shou
e950: 6c 64 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  ld be used inste
e960: 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f  ad of.** a tempo
e970: 72 61 72 79 20 66 69 6c 65 20 66 6f 72 20 74 72  rary file for tr
e980: 61 6e 73 69 65 6e 74 20 70 61 67 65 72 20 66 69  ansient pager fi
e990: 6c 65 73 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  les and statemen
e9a0: 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  t journals..** T
e9b0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
e9c0: 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  d depends on the
e9d0: 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65   value of db->te
e9e0: 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e 74 69 6d  mp_store (runtim
e9f0: 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 29 20  e.** parameter) 
ea00: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 20  and the compile 
ea10: 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51  time value of SQ
ea20: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e  LITE_TEMP_STORE.
ea30: 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   The.** followin
ea40: 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
ea50: 73 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68  s the relationsh
ea60: 69 70 20 62 65 74 77 65 65 6e 20 74 68 65 73 65  ip between these
ea70: 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61   two values.** a
ea80: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
ea90: 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a  s return value..
eaa0: 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54  **.**   SQLITE_T
eab0: 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20 64 62  EMP_STORE     db
eac0: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20 20 20  ->temp_store    
ead0: 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d   Location of tem
eae0: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 0a  porary database.
eaf0: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
eb00: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
eb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
eb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
eb40: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
eb50: 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20          any     
eb60: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
eb70: 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
eb80: 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20  **   1          
eb90: 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
eba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
ebb0: 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
ebc0: 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  0).**   1       
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
ebe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebf0: 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
ec00: 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 1).**   1    
ec10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec20: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
ec30: 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
ec40: 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20  eturn 0).**   2 
ec50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec60: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
ec70: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
ec80: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
ec90: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
eca0: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
ecb0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
ecc0: 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
ecd0: 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
ece0: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
ed00: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
ed10: 29 0a 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20  ).**   3        
ed20: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79               any
ed30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed40: 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
ed50: 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  n 1).*/.int sqli
ed60: 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
ed70: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20 2a 64  const sqlite3 *d
ed80: 62 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  b){.#if SQLITE_T
ed90: 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72  EMP_STORE==1.  r
eda0: 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70  eturn ( db->temp
edb0: 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e  _store==2 );.#en
edc0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
edd0: 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72  EMP_STORE==2.  r
ede0: 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70  eturn ( db->temp
edf0: 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e  _store!=1 );.#en
ee00: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
ee10: 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 72  EMP_STORE==3.  r
ee20: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
ee30: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
ee40: 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54  STORE<1 || SQLIT
ee50: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20  E_TEMP_STORE>3. 
ee60: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
ee70: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
ee80: 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  n UTF-8 encoded 
ee90: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
eea0: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
eeb0: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
eec0: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e  ** error..*/.con
eed0: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
eee0: 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20  _errmsg(sqlite3 
eef0: 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  *db){.  const ch
ef00: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62  ar *z;.  if( !db
ef10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
ef20: 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
ef30: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a  ITE_NOMEM);.  }.
ef40: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
ef50: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
ef60: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
ef70: 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
ef80: 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  r(SQLITE_MISUSE_
ef90: 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  BKPT);.  }.  sql
efa0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
efb0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
efc0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
efd0: 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73  led ){.    z = s
efe0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
eff0: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65  ITE_NOMEM);.  }e
f000: 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 28 63 68  lse{.    z = (ch
f010: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
f020: 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72 29  e_text(db->pErr)
f030: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 64  ;.    assert( !d
f040: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f050: 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20  );.    if( z==0 
f060: 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  ){.      z = sql
f070: 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
f080: 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  rrCode);.    }. 
f090: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
f0a0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
f0b0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b  ex);.  return z;
f0c0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
f0d0: 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a  TE_OMIT_UTF16./*
f0e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 31  .** Return UTF-1
f0f0: 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73  6 encoded Englis
f100: 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c 61  h language expla
f110: 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f  nation of the mo
f120: 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72  st recent.** err
f130: 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69  or..*/.const voi
f140: 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  d *sqlite3_errms
f150: 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62 29  g16(sqlite3 *db)
f160: 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  {.  static const
f170: 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20   u16 outOfMem[] 
f180: 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75 27  = {.    'o', 'u'
f190: 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c  , 't', ' ', 'o',
f1a0: 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20   'f', ' ', 'm', 
f1b0: 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27  'e', 'm', 'o', '
f1c0: 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a  r', 'y', 0.  };.
f1d0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75    static const u
f1e0: 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a  16 misuse[] = {.
f1f0: 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27 62      'l', 'i', 'b
f200: 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72 27  ', 'r', 'a', 'r'
f210: 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20 20  , 'y', ' ', .   
f220: 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20   'r', 'o', 'u', 
f230: 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27  't', 'i', 'n', '
f240: 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 63  e', ' ', .    'c
f250: 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27  ', 'a', 'l', 'l'
f260: 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27 2c  , 'e', 'd', ' ',
f270: 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20   .    'o', 'u', 
f280: 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  't', ' ', .    '
f290: 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a 20  o', 'f', ' ', . 
f2a0: 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71 27     's', 'e', 'q'
f2b0: 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c  , 'u', 'e', 'n',
f2c0: 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d   'c', 'e', 0.  }
f2d0: 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20  ;..  const void 
f2e0: 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b  *z;.  if( !db ){
f2f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69  .    return (voi
f300: 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20  d *)outOfMem;.  
f310: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
f320: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
f330: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
f340: 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69  eturn (void *)mi
f350: 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  suse;.  }.  sqli
f360: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
f370: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
f380: 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ( db->mallocFail
f390: 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76  ed ){.    z = (v
f3a0: 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a  oid *)outOfMem;.
f3b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d    }else{.    z =
f3c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
f3d0: 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b  ext16(db->pErr);
f3e0: 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b  .    if( z==0 ){
f3f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 61  .      sqlite3Va
f400: 6c 75 65 53 65 74 53 74 72 28 64 62 2d 3e 70 45  lueSetStr(db->pE
f410: 72 72 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33 45  rr, -1, sqlite3E
f420: 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64  rrStr(db->errCod
f430: 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 53  e),.           S
f440: 51 4c 49 54 45 5f 55 54 46 38 2c 20 53 51 4c 49  QLITE_UTF8, SQLI
f450: 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
f460: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61    z = sqlite3_va
f470: 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70  lue_text16(db->p
f480: 45 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Err);.    }.    
f490: 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61  /* A malloc() ma
f4a0: 79 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 69  y have failed wi
f4b0: 74 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f  thin the call to
f4c0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74   sqlite3_value_t
f4d0: 65 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61  ext16().    ** a
f4e0: 62 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69 73  bove. If this is
f4f0: 20 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20   the case, then 
f500: 74 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  the db->mallocFa
f510: 69 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20  iled flag needs 
f520: 74 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65  to.    ** be cle
f530: 61 72 65 64 20 62 65 66 6f 72 65 20 72 65 74 75  ared before retu
f540: 72 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64  rning. Do this d
f550: 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64  irectly, instead
f560: 20 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73   of via.    ** s
f570: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 29 2c  qlite3ApiExit(),
f580: 20 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e   to avoid settin
f590: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  g the database h
f5a0: 61 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73  andle error mess
f5b0: 61 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  age..    */.    
f5c0: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f5d0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
f5e0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
f5f0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
f600: 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66  turn z;.}.#endif
f610: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
f620: 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  UTF16 */../*.** 
f630: 52 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20  Return the most 
f640: 72 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64  recent error cod
f650: 65 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61  e generated by a
f660: 6e 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65  n SQLite routine
f670: 2e 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20  . If NULL is.** 
f680: 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66  passed to this f
f690: 75 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75  unction, we assu
f6a0: 6d 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61  me a malloc() fa
f6b0: 69 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69  iled during sqli
f6c0: 74 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69  te3_open()..*/.i
f6d0: 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  nt sqlite3_errco
f6e0: 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
f6f0: 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71  .  if( db && !sq
f700: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
f710: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
f720: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
f730: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
f740: 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20   }.  if( !db || 
f750: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f760: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f770: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
f780: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72  .  return db->er
f790: 72 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d  rCode & db->errM
f7a0: 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  ask;.}.int sqlit
f7b0: 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
f7c0: 6f 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ode(sqlite3 *db)
f7d0: 7b 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73  {.  if( db && !s
f7e0: 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63  qlite3SafetyChec
f7f0: 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b  kSickOrOk(db) ){
f800: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
f810: 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
f820: 20 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c    }.  if( !db ||
f830: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
f840: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
f850: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
f860: 7d 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65  }.  return db->e
f870: 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrCode;.}../*.**
f880: 20 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67   Return a string
f890: 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
f8a0: 74 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f  the kind of erro
f8b0: 72 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74  r specified in t
f8c0: 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20  he.** argument. 
f8d0: 20 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20 73   For now, this s
f8e0: 69 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65 20  imply calls the 
f8f0: 69 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65 33  internal sqlite3
f900: 45 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63  ErrStr().** func
f910: 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  tion..*/.const c
f920: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
f930: 73 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 72  str(int rc){.  r
f940: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
f950: 53 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Str(rc);.}../*.*
f960: 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 63  * Create a new c
f970: 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f  ollating functio
f980: 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 22  n for database "
f990: 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65 20 69  db".  The name i
f9a0: 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64 20 74  s zName.** and t
f9b0: 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 65  he encoding is e
f9c0: 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nc..*/.static in
f9d0: 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f  t createCollatio
f9e0: 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62  n(.  sqlite3* db
f9f0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
fa00: 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65 6e 63  zName, .  u8 enc
fa10: 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a  ,.  void* pCtx,.
fa20: 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
fa30: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
fa40: 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
fa50: 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28   void*),.  void(
fa60: 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b  *xDel)(void*).){
fa70: 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c  .  CollSeq *pCol
fa80: 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b 0a 20  l;.  int enc2;. 
fa90: 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c   int nName = sql
faa0: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61  ite3Strlen30(zNa
fab0: 6d 65 29 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  me);.  .  assert
fac0: 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
fad0: 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
fae0: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49  );..  /* If SQLI
faf0: 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63  TE_UTF16 is spec
fb00: 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63  ified as the enc
fb10: 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e  oding type, tran
fb20: 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20  sform this.  ** 
fb30: 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  to one of SQLITE
fb40: 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49  _UTF16LE or SQLI
fb50: 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67  TE_UTF16BE using
fb60: 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
fb70: 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63  _UTF16NATIVE mac
fb80: 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ro. SQLITE_UTF16
fb90: 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
fba0: 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
fbb0: 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65  enc2 = enc;.  te
fbc0: 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
fbd0: 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20  LITE_UTF16 );.  
fbe0: 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
fbf0: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
fc00: 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e  GNED );.  if( en
fc10: 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
fc20: 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45   || enc2==SQLITE
fc30: 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29  _UTF16_ALIGNED )
fc40: 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c  {.    enc2 = SQL
fc50: 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
fc60: 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c  .  }.  if( enc2<
fc70: 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65  SQLITE_UTF8 || e
fc80: 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36  nc2>SQLITE_UTF16
fc90: 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  BE ){.    return
fca0: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
fcb0: 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
fcc0: 68 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c  heck if this cal
fcd0: 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72  l is removing or
fce0: 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78   replacing an ex
fcf0: 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e  isting collation
fd00: 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e   .  ** sequence.
fd10: 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72   If so, and ther
fd20: 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
fd30: 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49  , return busy. I
fd40: 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65  f there.  ** are
fd50: 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
fd60: 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70  invalidate any p
fd70: 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
fd80: 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
fd90: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
fda0: 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75  ndCollSeq(db, (u
fdb0: 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30  8)enc2, zName, 0
fdc0: 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  );.  if( pColl &
fdd0: 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b  & pColl->xCmp ){
fde0: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  .    if( db->nVd
fdf0: 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20  beActive ){.    
fe00: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
fe10: 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20  b, SQLITE_BUSY, 
fe20: 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65  .        "unable
fe30: 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66   to delete/modif
fe40: 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  y collation sequ
fe50: 65 6e 63 65 20 64 75 65 20 74 6f 20 61 63 74 69  ence due to acti
fe60: 76 65 20 73 74 61 74 65 6d 65 6e 74 73 22 29 3b  ve statements");
fe70: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
fe80: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d  LITE_BUSY;.    }
fe90: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
fea0: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
feb0: 65 6e 74 73 28 64 62 29 3b 0a 0a 20 20 20 20 2f  ents(db);..    /
fec0: 2a 20 49 66 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  * If collation s
fed0: 65 71 75 65 6e 63 65 20 70 43 6f 6c 6c 20 77 61  equence pColl wa
fee0: 73 20 63 72 65 61 74 65 64 20 64 69 72 65 63 74  s created direct
fef0: 6c 79 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 0a  ly by a call to.
ff00: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
ff10: 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 2c  reate_collation,
ff20: 20 61 6e 64 20 6e 6f 74 20 67 65 6e 65 72 61 74   and not generat
ff30: 65 64 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53  ed by synthCollS
ff40: 65 71 28 29 2c 0a 20 20 20 20 2a 2a 20 74 68 65  eq(),.    ** the
ff50: 6e 20 61 6e 79 20 63 6f 70 69 65 73 20 6d 61 64  n any copies mad
ff60: 65 20 62 79 20 73 79 6e 74 68 43 6f 6c 6c 53 65  e by synthCollSe
ff70: 71 28 29 20 6e 65 65 64 20 74 6f 20 62 65 20 69  q() need to be i
ff80: 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20 20 20 20  nvalidated..    
ff90: 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c 6c 61 74 69  ** Also, collati
ffa0: 6f 6e 20 64 65 73 74 72 75 63 74 6f 72 20 2d 20  on destructor - 
ffb0: 43 6f 6c 6c 53 65 71 2e 78 44 65 6c 28 29 20 2d  CollSeq.xDel() -
ffc0: 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 6e 65   function may ne
ffd0: 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  ed.    ** to be 
ffe0: 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2f 20 0a  called..    */ .
fff0: 20 20 20 20 69 66 28 20 28 70 43 6f 6c 6c 2d 3e      if( (pColl->
10000 65 6e 63 20 26 20 7e 53 51 4c 49 54 45 5f 55 54  enc & ~SQLITE_UT
10010 46 31 36 5f 41 4c 49 47 4e 45 44 29 3d 3d 65 6e  F16_ALIGNED)==en
10020 63 32 20 29 7b 0a 20 20 20 20 20 20 43 6f 6c 6c  c2 ){.      Coll
10030 53 65 71 20 2a 61 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *aColl = sql
10040 69 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62  ite3HashFind(&db
10050 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20 7a 4e 61 6d  ->aCollSeq, zNam
10060 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 20  e, nName);.     
10070 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f   int j;.      fo
10080 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
10090 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53 65  {.        CollSe
100a0 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d  q *p = &aColl[j]
100b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  ;.        if( p-
100c0 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63  >enc==pColl->enc
100d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
100e0 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20  ( p->xDel ){.   
100f0 20 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65 6c           p->xDel
10100 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20 20  (p->pUser);.    
10110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10120 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20    p->xCmp = 0;. 
10130 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
10140 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43  .    }.  }..  pC
10150 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
10160 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75 38  dCollSeq(db, (u8
10170 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29  )enc2, zName, 1)
10180 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30  ;.  if( pColl==0
10190 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
101a0 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d  _NOMEM;.  pColl-
101b0 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65  >xCmp = xCompare
101c0 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72  ;.  pColl->pUser
101d0 20 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c   = pCtx;.  pColl
101e0 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20  ->xDel = xDel;. 
101f0 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75   pColl->enc = (u
10200 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20 26  8)(enc2 | (enc &
10210 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c   SQLITE_UTF16_AL
10220 49 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69 74  IGNED));.  sqlit
10230 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49  e3Error(db, SQLI
10240 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20 72 65 74  TE_OK, 0);.  ret
10250 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
10260 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72  .../*.** This ar
10270 72 61 79 20 64 65 66 69 6e 65 73 20 68 61 72 64  ray defines hard
10280 20 75 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e   upper bounds on
10290 20 6c 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20   limit values.  
102a0 54 68 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a  The.** initializ
102b0 65 72 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20  er must be kept 
102c0 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65  in sync with the
102d0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a   SQLITE_LIMIT_*.
102e0 2a 2a 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73  ** #defines in s
102f0 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61  qlite3.h..*/.sta
10300 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48  tic const int aH
10310 61 72 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20  ardLimit[] = {. 
10320 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
10330 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  TH,.  SQLITE_MAX
10340 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  _SQL_LENGTH,.  S
10350 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e  QLITE_MAX_COLUMN
10360 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  ,.  SQLITE_MAX_E
10370 58 50 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c  XPR_DEPTH,.  SQL
10380 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
10390 5f 53 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54  _SELECT,.  SQLIT
103a0 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20  E_MAX_VDBE_OP,. 
103b0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
103c0 54 49 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49  TION_ARG,.  SQLI
103d0 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c  TE_MAX_ATTACHED,
103e0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49  .  SQLITE_MAX_LI
103f0 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
10400 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
10410 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c  VARIABLE_NUMBER,
10420 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  .  SQLITE_MAX_TR
10430 49 47 47 45 52 5f 44 45 50 54 48 2c 0a 7d 3b 0a  IGGER_DEPTH,.};.
10440 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
10450 20 74 68 65 20 68 61 72 64 20 6c 69 6d 69 74 73   the hard limits
10460 20 61 72 65 20 73 65 74 20 74 6f 20 72 65 61 73   are set to reas
10470 6f 6e 61 62 6c 65 20 76 61 6c 75 65 73 0a 2a 2f  onable values.*/
10480 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
10490 4c 45 4e 47 54 48 3c 31 30 30 0a 23 20 65 72 72  LENGTH<100.# err
104a0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  or SQLITE_MAX_LE
104b0 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
104c0 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
104d0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
104e0 53 51 4c 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  SQL_LENGTH<100.#
104f0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
10500 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73  X_SQL_LENGTH mus
10510 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
10520 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
10530 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
10540 54 48 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45  TH>SQLITE_MAX_LE
10550 4e 47 54 48 0a 23 20 65 72 72 6f 72 20 53 51 4c  NGTH.# error SQL
10560 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
10570 54 48 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 67  TH must not be g
10580 72 65 61 74 65 72 20 74 68 61 6e 20 53 51 4c 49  reater than SQLI
10590 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 65  TE_MAX_LENGTH.#e
105a0 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
105b0 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c  MAX_COMPOUND_SEL
105c0 45 43 54 3c 32 0a 23 20 65 72 72 6f 72 20 53 51  ECT<2.# error SQ
105d0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
105e0 44 5f 53 45 4c 45 43 54 20 6d 75 73 74 20 62 65  D_SELECT must be
105f0 20 61 74 20 6c 65 61 73 74 20 32 0a 23 65 6e 64   at least 2.#end
10600 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
10610 58 5f 56 44 42 45 5f 4f 50 3c 34 30 0a 23 20 65  X_VDBE_OP<40.# e
10620 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
10630 56 44 42 45 5f 4f 50 20 6d 75 73 74 20 62 65 20  VDBE_OP must be 
10640 61 74 20 6c 65 61 73 74 20 34 30 0a 23 65 6e 64  at least 40.#end
10650 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
10660 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3c 30  X_FUNCTION_ARG<0
10670 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46   || SQLITE_MAX_F
10680 55 4e 43 54 49 4f 4e 5f 41 52 47 3e 31 30 30 30  UNCTION_ARG>1000
10690 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
106a0 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
106b0 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
106c0 20 30 20 61 6e 64 20 31 30 30 30 0a 23 65 6e 64   0 and 1000.#end
106d0 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
106e0 58 5f 41 54 54 41 43 48 45 44 3c 30 20 7c 7c 20  X_ATTACHED<0 || 
106f0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
10700 48 45 44 3e 36 32 0a 23 20 65 72 72 6f 72 20 53  HED>62.# error S
10710 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
10720 45 44 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  ED must be betwe
10730 65 6e 20 30 20 61 6e 64 20 36 32 0a 23 65 6e 64  en 0 and 62.#end
10740 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
10750 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
10760 45 4e 47 54 48 3c 31 0a 23 20 65 72 72 6f 72 20  ENGTH<1.# error 
10770 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
10780 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 6d  PATTERN_LENGTH m
10790 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20  ust be at least 
107a0 31 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  1.#endif.#if SQL
107b0 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 3e 33  ITE_MAX_COLUMN>3
107c0 32 37 36 37 0a 23 20 65 72 72 6f 72 20 53 51 4c  2767.# error SQL
107d0 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 6d  ITE_MAX_COLUMN m
107e0 75 73 74 20 6e 6f 74 20 65 78 63 65 65 64 20 33  ust not exceed 3
107f0 32 37 36 37 0a 23 65 6e 64 69 66 0a 23 69 66 20  2767.#endif.#if 
10800 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47  SQLITE_MAX_TRIGG
10810 45 52 5f 44 45 50 54 48 3c 31 0a 23 20 65 72 72  ER_DEPTH<1.# err
10820 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  or SQLITE_MAX_TR
10830 49 47 47 45 52 5f 44 45 50 54 48 20 6d 75 73 74  IGGER_DEPTH must
10840 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23   be at least 1.#
10850 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68  endif.../*.** Ch
10860 61 6e 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f  ange the value o
10870 66 20 61 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f  f a limit.  Repo
10880 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
10890 2e 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c  ..** If an inval
108a0 69 64 20 6c 69 6d 69 74 20 69 6e 64 65 78 20 69  id limit index i
108b0 73 20 73 75 70 70 6c 69 65 64 2c 20 72 65 70 6f  s supplied, repo
108c0 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e  rt -1..** Make n
108d0 6f 20 63 68 61 6e 67 65 73 20 62 75 74 20 73 74  o changes but st
108e0 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 6f  ill report the o
108f0 6c 64 20 76 61 6c 75 65 20 69 66 20 74 68 65 0a  ld value if the.
10900 2a 2a 20 6e 65 77 20 6c 69 6d 69 74 20 69 73 20  ** new limit is 
10910 6e 65 67 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  negative..**.** 
10920 41 20 6e 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69  A new lower limi
10930 74 20 64 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e  t does not shrin
10940 6b 20 65 78 69 73 74 69 6e 67 20 63 6f 6e 73 74  k existing const
10950 72 75 63 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72  ructs..** It mer
10960 65 6c 79 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ely prevents new
10970 20 63 6f 6e 73 74 72 75 63 74 73 20 74 68 61 74   constructs that
10980 20 65 78 63 65 65 64 20 74 68 65 20 6c 69 6d 69   exceed the limi
10990 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e  t.** from formin
109a0 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  g..*/.int sqlite
109b0 33 5f 6c 69 6d 69 74 28 73 71 6c 69 74 65 33 20  3_limit(sqlite3 
109c0 2a 64 62 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64  *db, int limitId
109d0 2c 20 69 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b  , int newLimit){
109e0 0a 20 20 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b  .  int oldLimit;
109f0 0a 0a 0a 20 20 2f 2a 20 45 56 49 44 45 4e 43 45  ...  /* EVIDENCE
10a00 2d 4f 46 3a 20 52 2d 33 30 31 38 39 2d 35 34 30  -OF: R-30189-540
10a10 39 37 20 46 6f 72 20 65 61 63 68 20 6c 69 6d 69  97 For each limi
10a20 74 20 63 61 74 65 67 6f 72 79 20 53 51 4c 49 54  t category SQLIT
10a30 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a  E_LIMIT_NAME.  *
10a40 2a 20 74 68 65 72 65 20 69 73 20 61 20 68 61 72  * there is a har
10a50 64 20 75 70 70 65 72 20 62 6f 75 6e 64 20 73 65  d upper bound se
10a60 74 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  t at compile-tim
10a70 65 20 62 79 20 61 20 43 20 70 72 65 70 72 6f 63  e by a C preproc
10a80 65 73 73 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f  essor.  ** macro
10a90 20 63 61 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d   called SQLITE_M
10aa0 41 58 5f 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f  AX_NAME. (The "_
10ab0 4c 49 4d 49 54 5f 22 20 69 6e 20 74 68 65 20 6e  LIMIT_" in the n
10ac0 61 6d 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  ame is changed t
10ad0 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29  o.  ** "_MAX_".)
10ae0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
10af0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
10b00 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d  E_LIMIT_LENGTH]=
10b10 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47  =SQLITE_MAX_LENG
10b20 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
10b30 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
10b40 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47  E_LIMIT_SQL_LENG
10b50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
10b60 53 51 4c 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  SQL_LENGTH );.  
10b70 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
10b80 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
10b90 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f  COLUMN]==SQLITE_
10ba0 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20  MAX_COLUMN );.  
10bb0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
10bc0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
10bd0 45 58 50 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c  EXPR_DEPTH]==SQL
10be0 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50  ITE_MAX_EXPR_DEP
10bf0 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
10c00 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
10c10 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44  E_LIMIT_COMPOUND
10c20 5f 53 45 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45  _SELECT]==SQLITE
10c30 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  _MAX_COMPOUND_SE
10c40 4c 45 43 54 29 3b 0a 20 20 61 73 73 65 72 74 28  LECT);.  assert(
10c50 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
10c60 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50  TE_LIMIT_VDBE_OP
10c70 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  ]==SQLITE_MAX_VD
10c80 42 45 5f 4f 50 20 29 3b 0a 20 20 61 73 73 65 72  BE_OP );.  asser
10c90 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
10ca0 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54  LITE_LIMIT_FUNCT
10cb0 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45  ION_ARG]==SQLITE
10cc0 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  _MAX_FUNCTION_AR
10cd0 47 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61  G );.  assert( a
10ce0 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45  HardLimit[SQLITE
10cf0 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 5d  _LIMIT_ATTACHED]
10d00 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  ==SQLITE_MAX_ATT
10d10 41 43 48 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ACHED );.  asser
10d20 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
10d30 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
10d40 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d  PATTERN_LENGTH]=
10d50 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =.              
10d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
10d90 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
10da0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
10db0 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
10dc0 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55  IMIT_VARIABLE_NU
10dd0 4d 42 45 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  MBER]==SQLITE_MA
10de0 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  X_VARIABLE_NUMBE
10df0 52 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  R);.  assert( aH
10e00 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
10e10 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45  LIMIT_TRIGGER_DE
10e20 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
10e30 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 29  _TRIGGER_DEPTH )
10e40 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
10e50 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52  TE_LIMIT_TRIGGER
10e60 5f 44 45 50 54 48 3d 3d 28 53 51 4c 49 54 45 5f  _DEPTH==(SQLITE_
10e70 4e 5f 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a  N_LIMIT-1) );...
10e80 20 20 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20    if( limitId<0 
10e90 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49  || limitId>=SQLI
10ea0 54 45 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20  TE_N_LIMIT ){.  
10eb0 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d    return -1;.  }
10ec0 0a 20 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62  .  oldLimit = db
10ed0 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ->aLimit[limitId
10ee0 5d 3b 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  ];.  if( newLimi
10ef0 74 3e 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20  t>=0 ){         
10f00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
10f10 3a 20 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20  : R-52476-28732 
10f20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69  */.    if( newLi
10f30 6d 69 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c  mit>aHardLimit[l
10f40 69 6d 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20  imitId] ){.     
10f50 20 6e 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72   newLimit = aHar
10f60 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  dLimit[limitId];
10f70 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36    /* IMP: R-5146
10f80 33 2d 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d  3-25634 */.    }
10f90 0a 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b  .    db->aLimit[
10fa0 6c 69 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69  limitId] = newLi
10fb0 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  mit;.  }.  retur
10fc0 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20  n oldLimit;     
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fe0 2f 2a 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d  /* IMP: R-53341-
10ff0 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a  35419 */.}../*.*
11000 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11010 69 73 20 75 73 65 64 20 74 6f 20 70 61 72 73 65  is used to parse
11020 20 62 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e   both URIs and n
11030 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73  on-URI filenames
11040 20 70 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a   passed by the.*
11050 2a 20 75 73 65 72 20 74 6f 20 41 50 49 20 66 75  * user to API fu
11060 6e 63 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f  nctions sqlite3_
11070 6f 70 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65  open() or sqlite
11080 33 5f 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64  3_open_v2(), and
11090 20 66 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a   for database.**
110a0 20 55 52 49 73 20 73 70 65 63 69 66 69 65 64 20   URIs specified 
110b0 61 73 20 70 61 72 74 20 6f 66 20 41 54 54 41 43  as part of ATTAC
110c0 48 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a  H statements..**
110d0 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
110e0 67 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66  gument to this f
110f0 75 6e 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e  unction is the n
11100 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74  ame of the VFS t
11110 6f 20 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e  o use (or.** a N
11120 55 4c 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74  ULL to signify t
11130 68 65 20 64 65 66 61 75 6c 74 20 56 46 53 29 20  he default VFS) 
11140 69 66 20 74 68 65 20 55 52 49 20 64 6f 65 73 20  if the URI does 
11150 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76  not contain a "v
11160 66 73 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79  fs=xxx".** query
11170 20 70 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20   parameter. The 
11180 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20  second argument 
11190 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49  contains the URI
111a0 20 28 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c   (or non-URI fil
111b0 65 6e 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66  ename).** itself
111c0 2e 20 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63  . When this func
111d0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
111e0 68 65 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61  he *pFlags varia
111f0 62 6c 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61  ble should conta
11200 69 6e 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c  in.** the defaul
11210 74 20 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20  t flags to open 
11220 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
11230 64 6c 65 20 77 69 74 68 2e 20 54 68 65 20 76 61  dle with. The va
11240 6c 75 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a  lue stored in.**
11250 20 2a 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20   *pFlags may be 
11260 75 70 64 61 74 65 64 20 62 65 66 6f 72 65 20 72  updated before r
11270 65 74 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20  eturning if the 
11280 55 52 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e  URI filename con
11290 74 61 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65  tains .** "cache
112a0 3d 78 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78  =xxx" or "mode=x
112b0 78 78 22 20 71 75 65 72 79 20 70 61 72 61 6d 65  xx" query parame
112c0 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ters..**.** If s
112d0 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
112e0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
112f0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a  . In this case *
11300 70 70 56 66 73 20 69 73 20 73 65 74 20 74 6f 20  ppVfs is set to 
11310 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
11320 56 46 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20  VFS that should 
11330 62 65 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20  be used to open 
11340 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11350 65 2e 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65  e. *pzFile is se
11360 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f  t to.** point to
11370 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
11380 6e 69 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66  ning the name of
11390 20 74 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65   the file to ope
113a0 6e 2e 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a  n. It is the .**
113b0 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20   responsibility 
113c0 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f  of the caller to
113d0 20 65 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c   eventually call
113e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20   sqlite3_free() 
113f0 74 6f 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  to release.** th
11400 69 73 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a  is buffer..**.**
11410 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
11420 75 72 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c  urs, then an SQL
11430 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ite error code i
11440 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
11450 70 7a 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20  pzErrMsg.** may 
11460 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
11470 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
11480 61 69 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73  aining an Englis
11490 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72  h language error
114a0 20 0a 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74   .** message. It
114b0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
114c0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61  bility of the ca
114d0 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
114e0 6c 79 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68  ly release.** th
114f0 69 73 20 62 75 66 66 65 72 20 62 79 20 63 61 6c  is buffer by cal
11500 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65  ling sqlite3_fre
11510 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  e()..*/.int sqli
11520 74 65 33 50 61 72 73 65 55 72 69 28 0a 20 20 63  te3ParseUri(.  c
11530 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61  onst char *zDefa
11540 75 6c 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f  ultVfs,        /
11550 2a 20 56 46 53 20 74 6f 20 75 73 65 20 69 66 20  * VFS to use if 
11560 6e 6f 20 22 76 66 73 3d 78 78 78 22 20 71 75 65  no "vfs=xxx" que
11570 72 79 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63  ry option */.  c
11580 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c  onst char *zUri,
11590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
115a0 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  * Nul-terminated
115b0 20 55 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f   URI to parse */
115c0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
115d0 2a 70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20  *pFlags,        
115e0 20 20 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51     /* IN/OUT: SQ
115f0 4c 49 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c  LITE_OPEN_XXX fl
11600 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ags */.  sqlite3
11610 5f 76 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20  _vfs **ppVfs,   
11620 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
11630 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a   VFS to use */ .
11640 20 20 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c    char **pzFile,
11650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11660 20 20 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61    /* OUT: Filena
11670 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20  me component of 
11680 55 52 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  URI */.  char **
11690 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
116a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
116b0 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28   Error message (
116c0 69 66 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  if rc!=SQLITE_OK
116d0 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ) */.){.  int rc
116e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
116f0 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61  unsigned int fla
11700 67 73 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20  gs = *pFlags;.  
11710 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
11720 20 3d 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a   = zDefaultVfs;.
11730 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20    char *zFile;. 
11740 20 63 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e   char c;.  int n
11750 55 72 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72  Uri = sqlite3Str
11760 6c 65 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20  len30(zUri);..  
11770 61 73 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73  assert( *pzErrMs
11780 67 3d 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28  g==0 );..  if( (
11790 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  (flags & SQLITE_
117a0 4f 50 45 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c  OPEN_URI) || sql
117b0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
117c0 2e 62 4f 70 65 6e 55 72 69 29 20 0a 20 20 20 26  .bOpenUri) .   &
117d0 26 20 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d  & nUri>=5 && mem
117e0 63 6d 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a  cmp(zUri, "file:
117f0 22 2c 20 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20  ", 5)==0 .  ){. 
11800 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20     char *zOpt;. 
11810 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20     int eState;  
11820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11830 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61 74 65   /* Parser state
11840 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52   when parsing UR
11850 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e  I */.    int iIn
11860 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
11870 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20         /* Input 
11880 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20  character index 
11890 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20  */.    int iOut 
118a0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
118b0 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63       /* Output c
118c0 68 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a  haracter index *
118d0 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20  /.    int nByte 
118e0 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20  = nUri+2;       
118f0 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20      /* Bytes of 
11900 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74  space to allocat
11910 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b  e */..    /* Mak
11920 65 20 73 75 72 65 20 74 68 65 20 53 51 4c 49 54  e sure the SQLIT
11930 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20  E_OPEN_URI flag 
11940 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61  is set to indica
11950 74 65 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f  te to the VFS xO
11960 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68  pen .    ** meth
11970 6f 64 20 74 68 61 74 20 74 68 65 72 65 20 6d 61  od that there ma
11980 79 20 62 65 20 65 78 74 72 61 20 70 61 72 61 6d  y be extra param
11990 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  eters following 
119a0 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20  the file-name.  
119b0 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20  */.    flags |= 
119c0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b  SQLITE_OPEN_URI;
119d0 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b  ..    for(iIn=0;
119e0 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b   iIn<nUri; iIn++
119f0 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69  ) nByte += (zUri
11a00 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20  [iIn]=='&');.   
11a10 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   zFile = sqlite3
11a20 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a  _malloc(nByte);.
11a30 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29      if( !zFile )
11a40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
11a50 4f 4d 45 4d 3b 0a 0a 20 20 20 20 69 49 6e 20 3d  OMEM;..    iIn =
11a60 20 35 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   5;.#ifndef SQLI
11a70 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54  TE_ALLOW_URI_AUT
11a80 48 4f 52 49 54 59 0a 20 20 20 20 2f 2a 20 44 69  HORITY.    /* Di
11a90 73 63 61 72 64 20 74 68 65 20 73 63 68 65 6d 65  scard the scheme
11aa0 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73   and authority s
11ab0 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55  egments of the U
11ac0 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  RI. */.    if( z
11ad0 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a  Uri[5]=='/' && z
11ae0 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20  Uri[6]=='/' ){. 
11af0 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20       iIn = 7;.  
11b00 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b      while( zUri[
11b10 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e  iIn] && zUri[iIn
11b20 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='/' ) iIn++;.
11b30 20 20 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37        if( iIn!=7
11b40 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20   && (iIn!=16 || 
11b50 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73  memcmp("localhos
11b60 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29  t", &zUri[7], 9)
11b70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  ) ){.        *pz
11b80 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33  ErrMsg = sqlite3
11b90 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69  _mprintf("invali
11ba0 64 20 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a  d uri authority:
11bb0 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20   %.*s", .       
11bc0 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72       iIn-7, &zUr
11bd0 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  i[7]);.        r
11be0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
11bf0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
11c00 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
11c10 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
11c20 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20  if..    /* Copy 
11c30 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64  the filename and
11c40 20 61 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d   any query param
11c50 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a  eters into the z
11c60 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20  File buffer. .  
11c70 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20    ** Decode %HH 
11c80 65 73 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f  escape codes alo
11c90 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20  ng the way. .   
11ca0 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69   **.    ** Withi
11cb0 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72  n this loop, var
11cc0 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79  iable eState may
11cd0 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20   be set to 0, 1 
11ce0 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a  or 2, depending.
11cf0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61      ** on the pa
11d00 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41  rsing context. A
11d10 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a  s follows:.    *
11d20 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61  *.    **   0: Pa
11d30 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e  rsing file-name.
11d40 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72  .    **   1: Par
11d50 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f  sing name sectio
11d60 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75  n of a name=valu
11d70 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
11d80 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50  r..    **   2: P
11d90 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63  arsing value sec
11da0 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76  tion of a name=v
11db0 61 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d  alue query param
11dc0 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eter..    */.   
11dd0 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20   eState = 0;.   
11de0 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72   while( (c = zUr
11df0 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21  i[iIn])!=0 && c!
11e00 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49  ='#' ){.      iI
11e10 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63  n++;.      if( c
11e20 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20 26 26  =='%' .       &&
11e30 20 73 71 6c 69 74 65 33 49 73 78 64 69 67 69 74   sqlite3Isxdigit
11e40 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20  (zUri[iIn]) .   
11e50 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
11e60 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b  xdigit(zUri[iIn+
11e70 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20  1]) .      ){.  
11e80 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20        int octet 
11e90 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49  = (sqlite3HexToI
11ea0 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20  nt(zUri[iIn++]) 
11eb0 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f  << 4);.        o
11ec0 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48  ctet += sqlite3H
11ed0 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e  exToInt(zUri[iIn
11ee0 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61  ++]);..        a
11ef0 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20  ssert( octet>=0 
11f00 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a  && octet<256 );.
11f10 20 20 20 20 20 20 20 20 69 66 28 20 6f 63 74 65          if( octe
11f20 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
11f30 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
11f40 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 22   is taken when "
11f50 25 30 30 22 20 61 70 70 65 61 72 73 20 77 69 74  %00" appears wit
11f60 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49 6e 20  hin the URI. In 
11f70 74 68 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a  this.          *
11f80 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f 72 65  * case we ignore
11f90 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74 68 65   all text in the
11fa0 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
11fb0 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a  e path, name or.
11fc0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c            ** val
11fd0 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69  ue currently bei
11fe0 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20 69 67  ng parsed. So ig
11ff0 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65 6e 74  nore the current
12000 20 63 68 61 72 61 63 74 65 72 0a 20 20 20 20 20   character.     
12010 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70       ** and skip
12020 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22 3f 22   to the next "?"
12030 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20 61 73  , "=" or "&", as
12040 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f   appropriate. */
12050 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
12060 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d  ( (c = zUri[iIn]
12070 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27 20 0a  )!=0 && c!='#' .
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26                &&
12090 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c 20 63   (eState!=0 || c
120a0 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20 20 20  !='?').         
120b0 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
120c0 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26  =1 || (c!='=' &&
120d0 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20 20 20   c!='&')).      
120e0 20 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61          && (eSta
120f0 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29  te!=2 || c!='&')
12100 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
12110 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b            iIn++;
12120 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
12130 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
12140 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12150 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20     c = octet;.  
12160 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53      }else if( eS
12170 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27  tate==1 && (c=='
12180 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b  &' || c=='=') ){
12190 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 46 69  .        if( zFi
121a0 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b  le[iOut-1]==0 ){
121b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e  .          /* An
121c0 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61   empty option na
121d0 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20  me. Ignore this 
121e0 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65  option altogethe
121f0 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  r. */.          
12200 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d  while( zUri[iIn]
12210 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27   && zUri[iIn]!='
12220 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31  #' && zUri[iIn-1
12230 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a  ]!='&' ) iIn++;.
12240 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
12250 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
12260 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27        if( c=='&'
12270 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46   ){.          zF
12280 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
12290 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0';.        }els
122a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65 53 74  e{.          eSt
122b0 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20  ate = 2;.       
122c0 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30   }.        c = 0
122d0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
122e0 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20  ( (eState==0 && 
122f0 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61  c=='?') || (eSta
12300 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29  te==2 && c=='&')
12310 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20   ){.        c = 
12320 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74 61 74  0;.        eStat
12330 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  e = 1;.      }. 
12340 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b       zFile[iOut+
12350 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20  +] = c;.    }.  
12360 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20    if( eState==1 
12370 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20  ) zFile[iOut++] 
12380 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c  = '\0';.    zFil
12390 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
123a0 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74  ;.    zFile[iOut
123b0 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20  ++] = '\0';..   
123c0 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65   /* Check if the
123d0 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69  re were any opti
123e0 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20 74 68  ons specified th
123f0 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74  at should be int
12400 65 72 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a  erpreted .    **
12410 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74   here. Options t
12420 68 61 74 20 61 72 65 20 69 6e 74 65 72 70 72 65  hat are interpre
12430 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65  ted here include
12440 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65   "vfs" and those
12450 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72   that.    ** cor
12460 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73  respond to flags
12470 20 74 68 61 74 20 6d 61 79 20 62 65 20 70 61 73   that may be pas
12480 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74  sed to the sqlit
12490 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20  e3_open_v2().   
124a0 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20   ** method. */. 
124b0 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65     zOpt = &zFile
124c0 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30  [sqlite3Strlen30
124d0 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20  (zFile)+1];.    
124e0 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29  while( zOpt[0] )
124f0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74  {.      int nOpt
12500 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
12510 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20  30(zOpt);.      
12520 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f  char *zVal = &zO
12530 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20  pt[nOpt+1];.    
12540 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c    int nVal = sql
12550 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61  ite3Strlen30(zVa
12560 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e  l);..      if( n
12570 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70  Opt==3 && memcmp
12580 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29  ("vfs", zOpt, 3)
12590 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
125a0 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20  Vfs = zVal;.    
125b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
125c0 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65   struct OpenMode
125d0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e   {.          con
125e0 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
125f0 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a        int mode;.
12600 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65          } *aMode
12610 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68   = 0;.        ch
12620 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20  ar *zModeType = 
12630 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d  0;.        int m
12640 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ask = 0;.       
12650 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a   int limit = 0;.
12660 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70  .        if( nOp
12670 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==5 && memcmp("
12680 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29  cache", zOpt, 5)
12690 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
126a0 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20 4f   static struct O
126b0 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f  penMode aCacheMo
126c0 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  de[] = {.       
126d0 20 20 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c       { "shared",
126e0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48    SQLITE_OPEN_SH
126f0 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20  AREDCACHE },.   
12700 20 20 20 20 20 20 20 20 20 7b 20 22 70 72 69 76           { "priv
12710 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ate", SQLITE_OPE
12720 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 7d  N_PRIVATECACHE }
12730 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
12740 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20  0, 0 }.         
12750 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d   };..          m
12760 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ask = SQLITE_OPE
12770 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c 53 51  N_SHAREDCACHE|SQ
12780 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
12790 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20  ECACHE;.        
127a0 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65    aMode = aCache
127b0 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
127c0 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20  limit = mask;.  
127d0 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
127e0 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20  e = "cache";.   
127f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
12800 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65  f( nOpt==4 && me
12810 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70  mcmp("mode", zOp
12820 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20  t, 4)==0 ){.    
12830 20 20 20 20 20 20 73 74 61 74 69 63 20 73 74 72        static str
12840 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70  uct OpenMode aOp
12850 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20  enMode[] = {.   
12860 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c           { "ro",
12870 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
12880 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20  ADONLY },.      
12890 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53        { "rw",  S
128a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
128b0 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20  RITE }, .       
128c0 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51       { "rwc", SQ
128d0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
128e0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
128f0 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20  N_CREATE },.    
12900 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72          { "memor
12910 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  y", SQLITE_OPEN_
12920 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20  MEMORY },.      
12930 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
12940 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20           };..   
12950 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51         mask = SQ
12960 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
12970 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  LY | SQLITE_OPEN
12980 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20 20 20  _READWRITE.     
12990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
129a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
129b0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
129c0 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20  _MEMORY;.       
129d0 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e     aMode = aOpen
129e0 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Mode;.          
129f0 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66  limit = mask & f
12a00 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
12a10 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63  zModeType = "acc
12a20 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ess";.        }.
12a30 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f  .        if( aMo
12a40 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  de ){.          
12a50 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20  int i;.         
12a60 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20   int mode = 0;. 
12a70 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
12a80 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b  ; aMode[i].z; i+
12a90 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  +){.            
12aa0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
12ab0 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20  aMode[i].z;.    
12ac0 20 20 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c          if( nVal
12ad0 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  ==sqlite3Strlen3
12ae0 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  0(z) && 0==memcm
12af0 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29  p(zVal, z, nVal)
12b00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12b10 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69    mode = aMode[i
12b20 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ].mode;.        
12b30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
12b40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12b50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12b60 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a   if( mode==0 ){.
12b70 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
12b80 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
12b90 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68  mprintf("no such
12ba0 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a   %s mode: %s", z
12bb0 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b  ModeType, zVal);
12bc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
12bd0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
12be0 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f              goto
12bf0 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
12c00 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12c10 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20        if( (mode 
12c20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  & ~SQLITE_OPEN_M
12c30 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a  EMORY)>limit ){.
12c40 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45              *pzE
12c50 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
12c60 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65  mprintf("%s mode
12c70 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73   not allowed: %s
12c80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
12c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ca0 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65             zMode
12cb0 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20  Type, zVal);.   
12cc0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
12cd0 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20  LITE_PERM;.     
12ce0 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73         goto pars
12cf0 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20  e_uri_out;.     
12d00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
12d10 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20   flags = (flags 
12d20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b  & ~mask) | mode;
12d30 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12d40 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d   }..      zOpt =
12d50 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a   &zVal[nVal+1];.
12d60 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a      }..  }else{.
12d70 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69      zFile = sqli
12d80 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b  te3_malloc(nUri+
12d90 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69  2);.    if( !zFi
12da0 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
12db0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65  TE_NOMEM;.    me
12dc0 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69  mcpy(zFile, zUri
12dd0 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46 69  , nUri);.    zFi
12de0 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b  le[nUri] = '\0';
12df0 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b  .    zFile[nUri+
12e00 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66  1] = '\0';.    f
12e10 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f  lags &= ~SQLITE_
12e20 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20  OPEN_URI;.  }.. 
12e30 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65   *ppVfs = sqlite
12e40 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29  3_vfs_find(zVfs)
12e50 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d  ;.  if( *ppVfs==
12e60 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d  0 ){.    *pzErrM
12e70 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
12e80 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66  intf("no such vf
12e90 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20  s: %s", zVfs);. 
12ea0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45     rc = SQLITE_E
12eb0 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65  RROR;.  }. parse
12ec0 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20  _uri_out:.  if( 
12ed0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12ee0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
12ef0 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46  e(zFile);.    zF
12f00 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a  ile = 0;.  }.  *
12f10 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a  pFlags = flags;.
12f20 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c    *pzFile = zFil
12f30 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  e;.  return rc;.
12f40 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
12f50 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20  outine does the 
12f60 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20  work of opening 
12f70 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65  a database on be
12f80 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74  half of.** sqlit
12f90 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71  e3_open() and sq
12fa0 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20  lite3_open16(). 
12fb0 54 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  The database fil
12fc0 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65  ename "zFilename
12fd0 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20  "  .** is UTF-8 
12fe0 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74  encoded..*/.stat
12ff0 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62  ic int openDatab
13000 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  ase(.  const cha
13010 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a  r *zFilename, /*
13020 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   Database filena
13030 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64  me UTF-8 encoded
13040 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a   */.  sqlite3 **
13050 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20  ppDb,        /* 
13060 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61  OUT: Returned da
13070 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
13080 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  .  unsigned int 
13090 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65  flags,    /* Ope
130a0 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a  rational flags *
130b0 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
130c0 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61  zVfs       /* Na
130d0 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f  me of the VFS to
130e0 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c   use */.){.  sql
130f0 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20  ite3 *db;       
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13110 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20  Store allocated 
13120 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20  handle here */. 
13130 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
13140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13150 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
13160 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61  */.  int isThrea
13170 64 73 61 66 65 3b 20 20 20 20 20 20 20 20 20 20  dsafe;          
13180 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72       /* True for
13190 20 74 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e   threadsafe conn
131a0 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61  ections */.  cha
131b0 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20  r *zOpen = 0;   
131c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
131d0 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e  Filename argumen
131e0 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72  t to pass to Btr
131f0 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68  eeOpen() */.  ch
13200 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
13210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13220 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66   Error message f
13230 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65  rom sqlite3Parse
13240 55 72 69 28 29 20 2a 2f 0a 0a 20 20 2a 70 70 44  Uri() */..  *ppD
13250 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
13260 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49  QLITE_OMIT_AUTOI
13270 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  NIT.  rc = sqlit
13280 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
13290 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
132a0 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20  rn rc;.#endif.. 
132b0 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73   /* Only allow s
132c0 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
132d0 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20  ions of bits in 
132e0 74 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  the flags argume
132f0 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77  nt.  .  ** Throw
13300 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79   an error if any
13310 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69   non-sense combi
13320 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20  nation is used. 
13330 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e   If we.  ** do n
13340 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c  ot block illegal
13350 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65   combinations he
13360 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69  re, it could tri
13370 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74  gger.  ** assert
13380 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e  () statements in
13390 20 64 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20   deeper layers. 
133a0 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e   Sensible combin
133b0 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a  ations.  ** are:
133c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20  .  **.  **  1:  
133d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
133e0 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53  ONLY.  **  2:  S
133f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
13400 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53  RITE.  **  6:  S
13410 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
13420 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
13430 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20  EN_CREATE.  */. 
13440 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
13450 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d  OPEN_READONLY  =
13460 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65  = 0x01 );.  asse
13470 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  rt( SQLITE_OPEN_
13480 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30  READWRITE == 0x0
13490 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  2 );.  assert( S
134a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
134b0 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a  E    == 0x04 );.
134c0 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
134d0 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32  (flags&7))==0x02
134e0 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20   ); /* READONLY 
134f0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
13500 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
13510 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x04 ); /* READWR
13520 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73  ITE */.  testcas
13530 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  e( (1<<(flags&7)
13540 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45  )==0x40 ); /* RE
13550 41 44 57 52 49 54 45 20 7c 20 43 52 45 41 54 45  ADWRITE | CREATE
13560 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28   */.  if( ((1<<(
13570 66 6c 61 67 73 26 37 29 29 20 26 20 30 78 34 36  flags&7)) & 0x46
13580 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  )==0 ) return SQ
13590 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
135a0 3b 0a 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ;..  if( sqlite3
135b0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
135c0 72 65 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20  reMutex==0 ){.  
135d0 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
135e0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
135f0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f  flags & SQLITE_O
13600 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20  PEN_NOMUTEX ){. 
13610 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
13620 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 0;.  }else if(
13630 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f   flags & SQLITE_
13640 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29  OPEN_FULLMUTEX )
13650 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61  {.    isThreadsa
13660 66 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  fe = 1;.  }else{
13670 0a 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66  .    isThreadsaf
13680 65 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  e = sqlite3Globa
13690 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
136a0 65 78 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c  ex;.  }.  if( fl
136b0 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
136c0 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 20 29  N_PRIVATECACHE )
136d0 7b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e  {.    flags &= ~
136e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
136f0 45 44 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65  EDCACHE;.  }else
13700 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
13710 61 6c 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43  alConfig.sharedC
13720 61 63 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20  acheEnabled ){. 
13730 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49     flags |= SQLI
13740 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
13750 43 48 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  CHE;.  }..  /* R
13760 65 6d 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69  emove harmful bi
13770 74 73 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67  ts from the flag
13780 73 20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a  s parameter.  **
13790 0a 20 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45  .  ** The SQLITE
137a0 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e  _OPEN_NOMUTEX an
137b0 64 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55  d SQLITE_OPEN_FU
137c0 4c 4c 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65  LLMUTEX flags we
137d0 72 65 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69  re.  ** dealt wi
137e0 74 68 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f  th in the previo
137f0 75 73 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20  us code block.  
13800 42 65 73 69 64 65 73 20 74 68 65 73 65 2c 20 74  Besides these, t
13810 68 65 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c  he only.  ** val
13820 69 64 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66  id input flags f
13830 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  or sqlite3_open_
13840 76 32 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f  v2() are SQLITE_
13850 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20  OPEN_READONLY,. 
13860 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ** SQLITE_OPEN_
13870 52 45 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54  READWRITE, SQLIT
13880 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53  E_OPEN_CREATE, S
13890 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
138a0 44 43 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c  DCACHE,.  ** SQL
138b0 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45  ITE_OPEN_PRIVATE
138c0 43 41 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20  CACHE, and some 
138d0 72 65 73 65 72 76 65 64 20 62 69 74 73 2e 20 20  reserved bits.  
138e0 53 69 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20  Silently mask.  
138f0 2a 2a 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72  ** off all other
13900 20 66 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66   flags..  */.  f
13910 6c 61 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49  lags &=  ~( SQLI
13920 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e  TE_OPEN_DELETEON
13930 43 4c 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20  CLOSE |.        
13940 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
13950 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20  EN_EXCLUSIVE |. 
13960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
13970 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
13980 42 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  B |.            
13990 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54     SQLITE_OPEN_T
139a0 45 4d 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20  EMP_DB | .      
139b0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
139c0 4f 50 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44  OPEN_TRANSIENT_D
139d0 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  B | .           
139e0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
139f0 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a  MAIN_JOURNAL | .
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
13a10 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
13a20 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20  JOURNAL | .     
13a30 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
13a40 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c  _OPEN_SUBJOURNAL
13a50 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   | .            
13a60 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
13a70 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a  ASTER_JOURNAL |.
13a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
13a90 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
13aa0 45 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  EX |.           
13ab0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
13ac0 46 55 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20  FULLMUTEX |.    
13ad0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
13ae0 45 5f 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20  E_OPEN_WAL.     
13af0 20 20 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a          );..  /*
13b00 20 41 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71   Allocate the sq
13b10 6c 69 74 65 20 64 61 74 61 20 73 74 72 75 63 74  lite data struct
13b20 75 72 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71  ure */.  db = sq
13b30 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
13b40 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29   sizeof(sqlite3)
13b50 20 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20   );.  if( db==0 
13b60 29 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75  ) goto opendb_ou
13b70 74 3b 0a 20 20 69 66 28 20 69 73 54 68 72 65 61  t;.  if( isThrea
13b80 64 73 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d  dsafe ){.    db-
13b90 3e 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33  >mutex = sqlite3
13ba0 4d 75 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54  MutexAlloc(SQLIT
13bb0 45 5f 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56  E_MUTEX_RECURSIV
13bc0 45 29 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  E);.    if( db->
13bd0 6d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  mutex==0 ){.    
13be0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
13bf0 62 29 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30  b);.      db = 0
13c00 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  ;.      goto ope
13c10 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
13c20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
13c30 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
13c40 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61  ex);.  db->errMa
13c50 73 6b 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d  sk = 0xff;.  db-
13c60 3e 6e 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e  >nDb = 2;.  db->
13c70 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
13c80 41 47 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d  AGIC_BUSY;.  db-
13c90 3e 61 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74  >aDb = db->aDbSt
13ca0 61 74 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  atic;..  assert(
13cb0 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d   sizeof(db->aLim
13cc0 69 74 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72  it)==sizeof(aHar
13cd0 64 4c 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d  dLimit) );.  mem
13ce0 63 70 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20  cpy(db->aLimit, 
13cf0 61 48 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65  aHardLimit, size
13d00 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b  of(db->aLimit));
13d10 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  .  db->autoCommi
13d20 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78  t = 1;.  db->nex
13d30 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20  tAutovac = -1;. 
13d40 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71   db->szMmap = sq
13d50 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
13d60 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e  g.szMmap;.  db->
13d70 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30  nextPagesize = 0
13d80 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d  ;.  db->flags |=
13d90 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c   SQLITE_ShortCol
13da0 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f 45  Names | SQLITE_E
13db0 6e 61 62 6c 65 54 72 69 67 67 65 72 0a 23 69 66  nableTrigger.#if
13dc0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
13dd0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54  _DEFAULT_AUTOMAT
13de0 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c  IC_INDEX) || SQL
13df0 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
13e00 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20  MATIC_INDEX.    
13e10 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
13e20 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a  QLITE_AutoIndex.
13e30 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
13e40 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46  E_DEFAULT_FILE_F
13e50 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20  ORMAT<4.        
13e60 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
13e70 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a  E_LegacyFileFmt.
13e80 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
13e90 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  LITE_ENABLE_LOAD
13ea0 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20  _EXTENSION.     
13eb0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
13ec0 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69  LITE_LoadExtensi
13ed0 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  on.#endif.#if SQ
13ee0 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43  LITE_DEFAULT_REC
13ef0 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a  URSIVE_TRIGGERS.
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13f10 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69   | SQLITE_RecTri
13f20 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66  ggers.#endif.#if
13f30 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
13f40 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
13f50 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f  KEYS) && SQLITE_
13f60 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
13f70 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20 20  KEYS.           
13f80 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46        | SQLITE_F
13f90 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69  oreignKeys.#endi
13fa0 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69  f.      ;.  sqli
13fb0 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
13fc0 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
13fd0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
13fe0 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
13ff0 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
14000 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65  db->aModule);.#e
14010 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74  ndif..  /* Add t
14020 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
14030 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49  tion sequence BI
14040 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72  NARY. BINARY wor
14050 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d  ks for both UTF-
14060 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31  8.  ** and UTF-1
14070 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73  6, so add a vers
14080 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20  ion for each to 
14090 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65  avoid any unnece
140a0 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65  ssary.  ** conve
140b0 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79  rsions. The only
140c0 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20   error that can 
140d0 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20  occur here is a 
140e0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
140f0 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43  ..  */.  createC
14100 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49  ollation(db, "BI
14110 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54  NARY", SQLITE_UT
14120 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  F8, 0, binCollFu
14130 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
14140 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
14150 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
14160 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f  TF16BE, 0, binCo
14170 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
14180 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
14190 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
141a0 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62  TE_UTF16LE, 0, b
141b0 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
141c0 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
141d0 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53  n(db, "RTRIM", S
141e0 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
141f0 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  d*)1, binCollFun
14200 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  c, 0);.  if( db-
14210 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
14220 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
14230 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  _out;.  }.  db->
14240 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69  pDfltColl = sqli
14250 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
14260 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  b, SQLITE_UTF8, 
14270 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20  "BINARY", 0);.  
14280 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c  assert( db->pDfl
14290 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f  tColl!=0 );..  /
142a0 2a 20 41 6c 73 6f 20 61 64 64 20 61 20 55 54 46  * Also add a UTF
142b0 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74  -8 case-insensit
142c0 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ive collation se
142d0 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65  quence. */.  cre
142e0 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
142f0 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54   "NOCASE", SQLIT
14300 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73  E_UTF8, 0, nocas
14310 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20  eCollatingFunc, 
14320 30 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20  0);..  /* Parse 
14330 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49  the filename/URI
14340 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20   argument. */.  
14350 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  db->openFlags = 
14360 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71  flags;.  rc = sq
14370 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 7a 56  lite3ParseUri(zV
14380 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  fs, zFilename, &
14390 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73  flags, &db->pVfs
143a0 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d  , &zOpen, &zErrM
143b0 73 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  sg);.  if( rc!=S
143c0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
143d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
143e0 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f  OMEM ) db->mallo
143f0 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
14400 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
14410 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20  , rc, zErrMsg ? 
14420 22 25 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73  "%s" : 0, zErrMs
14430 67 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  g);.    sqlite3_
14440 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
14450 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
14460 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70  ut;.  }..  /* Op
14470 65 6e 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64  en the backend d
14480 61 74 61 62 61 73 65 20 64 72 69 76 65 72 20 2a  atabase driver *
14490 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
144a0 42 74 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56  BtreeOpen(db->pV
144b0 66 73 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26  fs, zOpen, db, &
144c0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20  db->aDb[0].pBt, 
144d0 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
144e0 20 20 20 20 20 20 20 20 20 20 20 66 6c 61 67 73             flags
144f0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   | SQLITE_OPEN_M
14500 41 49 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72  AIN_DB);.  if( r
14510 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
14520 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14530 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29  TE_IOERR_NOMEM )
14540 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
14550 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
14560 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
14570 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20  r(db, rc, 0);.  
14580 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
14590 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62  t;.  }.  db->aDb
145a0 5b 30 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73 71  [0].pSchema = sq
145b0 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28 64  lite3SchemaGet(d
145c0 62 2c 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  b, db->aDb[0].pB
145d0 74 29 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d  t);.  db->aDb[1]
145e0 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
145f0 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
14600 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64  0);...  /* The d
14610 65 66 61 75 6c 74 20 73 61 66 65 74 79 5f 6c 65  efault safety_le
14620 76 65 6c 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  vel for the main
14630 20 64 61 74 61 62 61 73 65 20 69 73 20 27 66 75   database is 'fu
14640 6c 6c 27 3b 20 66 6f 72 20 74 68 65 20 74 65 6d  ll'; for the tem
14650 70 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  p.  ** database 
14660 69 74 20 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68  it is 'NONE'. Th
14670 69 73 20 6d 61 74 63 68 65 73 20 74 68 65 20 70  is matches the p
14680 61 67 65 72 20 6c 61 79 65 72 20 64 65 66 61 75  ager layer defau
14690 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62  lts.  .  */.  db
146a0 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d  ->aDb[0].zName =
146b0 20 22 6d 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61   "main";.  db->a
146c0 44 62 5b 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[0].safety_lev
146d0 65 6c 20 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44  el = 3;.  db->aD
146e0 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65  b[1].zName = "te
146f0 6d 70 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  mp";.  db->aDb[1
14700 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ].safety_level =
14710 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63   1;..  db->magic
14720 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
14730 4f 50 45 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e  OPEN;.  if( db->
14740 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
14750 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
14760 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  out;.  }..  /* R
14770 65 67 69 73 74 65 72 20 61 6c 6c 20 62 75 69 6c  egister all buil
14780 74 2d 69 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20  t-in functions, 
14790 62 75 74 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d  but do not attem
147a0 70 74 20 74 6f 20 72 65 61 64 20 74 68 65 0a 20  pt to read the. 
147b0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 73 63 68   ** database sch
147c0 65 6d 61 20 79 65 74 2e 20 54 68 69 73 20 69 73  ema yet. This is
147d0 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74   delayed until t
147e0 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74 68  he first time th
147f0 65 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20  e database.  ** 
14800 69 73 20 61 63 63 65 73 73 65 64 2e 0a 20 20 2a  is accessed..  *
14810 2f 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  /.  sqlite3Error
14820 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
14830 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 67  0);.  sqlite3Reg
14840 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e 63  isterBuiltinFunc
14850 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a  tions(db);..  /*
14860 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63 20   Load automatic 
14870 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74  extensions - ext
14880 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76  ensions that hav
14890 65 20 62 65 65 6e 20 72 65 67 69 73 74 65 72 65  e been registere
148a0 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68 65  d.  ** using the
148b0 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74   sqlite3_automat
148c0 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20 41  ic_extension() A
148d0 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  PI..  */.  rc = 
148e0 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28  sqlite3_errcode(
148f0 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  db);.  if( rc==S
14900 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14910 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64 45  sqlite3AutoLoadE
14920 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20  xtensions(db);. 
14930 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
14940 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 20  errcode(db);.   
14950 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
14960 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
14970 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20   opendb_out;.   
14980 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 53   }.  }..#ifdef S
14990 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
149a0 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  1.  if( !db->mal
149b0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
149c0 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69   extern int sqli
149d0 74 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c 69  te3Fts1Init(sqli
149e0 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20  te3*);.    rc = 
149f0 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74 28  sqlite3Fts1Init(
14a00 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
14a10 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
14a20 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66 28  NABLE_FTS2.  if(
14a30 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
14a40 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
14a50 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65 72  _OK ){.    exter
14a60 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  n int sqlite3Fts
14a70 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b  2Init(sqlite3*);
14a80 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14a90 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts2Init(db);. 
14aa0 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
14ab0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
14ac0 46 54 53 33 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS3.  if( !db->
14ad0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
14ae0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14af0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14b00 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts3Init(db);. 
14b10 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
14b20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
14b30 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  ICU.  if( !db->m
14b40 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
14b50 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
14b60 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14b70 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d  IcuInit(db);.  }
14b80 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
14b90 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54  SQLITE_ENABLE_RT
14ba0 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d  REE.  if( !db->m
14bb0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72  allocFailed && r
14bc0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20  c==SQLITE_OK){. 
14bd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 52     rc = sqlite3R
14be0 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 20 20  treeInit(db);.  
14bf0 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69  }.#endif..  sqli
14c00 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c  te3Error(db, rc,
14c10 20 30 29 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c   0);..  /* -DSQL
14c20 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
14c30 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73  ING_MODE=1 makes
14c40 20 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64   EXCLUSIVE the d
14c50 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20  efault locking. 
14c60 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c   ** mode.  -DSQL
14c70 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
14c80 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20  ING_MODE=0 make 
14c90 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75  NORMAL the defau
14ca0 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20  lt locking.  ** 
14cb0 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74  mode.  Doing not
14cc0 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f  hing at all also
14cd0 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68   makes NORMAL th
14ce0 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a  e default..  */.
14cf0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
14d00 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
14d10 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63  DE.  db->dfltLoc
14d20 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44  kMode = SQLITE_D
14d30 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
14d40 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ODE;.  sqlite3Pa
14d50 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73  gerLockingMode(s
14d60 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
14d70 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
14d80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
14d90 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
14da0 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
14db0 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66  NG_MODE);.#endif
14dc0 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68  ..  /* Enable th
14dd0 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c  e lookaside-mall
14de0 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a  oc subsystem */.
14df0 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65    setupLookaside
14e00 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47  (db, 0, sqlite3G
14e10 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f  lobalConfig.szLo
14e20 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20  okaside,.       
14e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14e40 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
14e50 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29  nfig.nLookaside)
14e60 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  ;..  sqlite3_wal
14e70 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
14e80 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  db, SQLITE_DEFAU
14e90 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b  LT_WAL_AUTOCHECK
14ea0 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f  POINT);..opendb_
14eb0 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
14ec0 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66  ree(zOpen);.  if
14ed0 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65  ( db ){.    asse
14ee0 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30  rt( db->mutex!=0
14ef0 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65   || isThreadsafe
14f00 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c  ==0 || sqlite3Gl
14f10 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
14f20 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Mutex==0 );.    
14f30 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
14f40 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
14f50 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
14f60 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
14f70 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
14f80 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
14f90 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  MEM );.  if( rc=
14fa0 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
14fb0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
14fc0 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d  se(db);.    db =
14fd0 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
14fe0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14ff0 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
15000 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49   SQLITE_MAGIC_SI
15010 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20  CK;.  }.  *ppDb 
15020 3d 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c  = db;.#ifdef SQL
15030 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
15040 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  G.  if( sqlite3G
15050 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
15060 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  log ){.    /* Op
15070 65 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c  ening a db handl
15080 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65  e. Fourth parame
15090 74 65 72 20 69 73 20 70 61 73 73 65 64 20 30 2e  ter is passed 0.
150a0 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41   */.    void *pA
150b0 72 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  rg = sqlite3Glob
150c0 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
150d0 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Arg;.    sqlite3
150e0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
150f0 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a  llog(pArg, db, z
15100 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  Filename, 0);.  
15110 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
15120 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  n sqlite3ApiExit
15130 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (0, rc);.}../*.*
15140 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
15150 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
15160 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
15170 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
15180 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
15190 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29  qlite3 **ppDb .)
151a0 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44  {.  return openD
151b0 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
151c0 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20  e, ppDb,.       
151d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
151e0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
151f0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
15200 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d  EN_CREATE, 0);.}
15210 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
15220 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68  n_v2(.  const ch
15230 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20  ar *filename,   
15240 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
15250 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  name (UTF-8) */.
15260 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
15270 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
15280 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64  : SQLite db hand
15290 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
152a0 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
152b0 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  /* Flags */.  co
152c0 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
152d0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
152e0 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75   VFS module to u
152f0 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  se */.){.  retur
15300 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66  n openDatabase(f
15310 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28  ilename, ppDb, (
15320 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61  unsigned int)fla
15330 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69  gs, zVfs);.}..#i
15340 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15350 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70  T_UTF16./*.** Op
15360 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
15370 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
15380 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
15390 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
153a0 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
153b0 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20  ite3 **ppDb.){. 
153c0 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
153d0 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46  lename8;   /* zF
153e0 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20  ilename encoded 
153f0 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64  in UTF-8 instead
15400 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20   of UTF-16 */.  
15410 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
15420 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Val;.  int rc;..
15430 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
15440 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ame );.  assert(
15450 20 70 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62   ppDb );.  *ppDb
15460 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
15470 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
15480 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
15490 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
154a0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
154b0 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70  n rc;.#endif.  p
154c0 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
154d0 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69  ueNew(0);.  sqli
154e0 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
154f0 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  Val, -1, zFilena
15500 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  me, SQLITE_UTF16
15510 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53  NATIVE, SQLITE_S
15520 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e  TATIC);.  zFilen
15530 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61  ame8 = sqlite3Va
15540 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
15550 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66  LITE_UTF8);.  if
15560 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a  ( zFilename8 ){.
15570 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74      rc = openDat
15580 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38  abase(zFilename8
15590 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
155a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
155b0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
155c0 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
155d0 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20  N_CREATE, 0);.  
155e0 20 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20    assert( *ppDb 
155f0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
15600 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72  MEM );.    if( r
15610 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15620 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a  !DbHasProperty(*
15630 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65  ppDb, 0, DB_Sche
15640 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20  maLoaded) ){.   
15650 20 20 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20     ENC(*ppDb) = 
15660 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
15670 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  VE;.    }.  }els
15680 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
15690 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
156a0 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
156b0 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72  (pVal);..  retur
156c0 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  n sqlite3ApiExit
156d0 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69  (0, rc);.}.#endi
156e0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
156f0 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
15700 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
15710 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
15720 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
15730 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
15740 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
15750 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
15760 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
15770 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15780 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
15790 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
157a0 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
157b0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
157c0 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
157d0 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  t void*).){.  in
157e0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
157f0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
15800 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
15810 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
15820 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72  led );.  rc = cr
15830 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
15840 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63  , zName, (u8)enc
15850 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
15860 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
15870 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
15880 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
15890 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
158a0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
158b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  rc;.}../*.** Reg
158c0 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
158d0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
158e0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
158f0 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
15900 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
15910 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a  e_collation_v2(.
15920 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
15930 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
15940 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
15950 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
15960 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
15970 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
15980 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
15990 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28   void*),.  void(
159a0 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b  *xDel)(void*).){
159b0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
159c0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
159d0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
159e0 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
159f0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63  ocFailed );.  rc
15a00 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69   = createCollati
15a10 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75  on(db, zName, (u
15a20 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  8)enc, pCtx, xCo
15a30 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20  mpare, xDel);.  
15a40 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
15a50 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
15a60 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
15a70 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
15a80 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
15a90 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15aa0 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
15ab0 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
15ac0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
15ad0 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
15ae0 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
15af0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
15b00 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28  ate_collation16(
15b10 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
15b20 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
15b30 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  Name,.  int enc,
15b40 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
15b50 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
15b60 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
15b70 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
15b80 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
15b90 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15ba0 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b  .  char *zName8;
15bb0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
15bc0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
15bd0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
15be0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
15bf0 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c  ;.  zName8 = sql
15c00 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
15c10 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
15c20 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
15c30 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b  .  if( zName8 ){
15c40 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65  .    rc = create
15c50 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
15c60 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70  ame8, (u8)enc, p
15c70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30  Ctx, xCompare, 0
15c80 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
15c90 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29  Free(db, zName8)
15ca0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
15cb0 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
15cc0 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
15cd0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
15ce0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
15cf0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
15d00 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
15d10 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  6 */../*.** Regi
15d20 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  ster a collation
15d30 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
15d40 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  y callback with 
15d50 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
15d60 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61  dle.** db. Repla
15d70 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c  ce any previousl
15d80 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c  y installed coll
15d90 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
15da0 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73  actory..*/.int s
15db0 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
15dc0 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74  _needed(.  sqlit
15dd0 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20  e3 *db, .  void 
15de0 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c  *pCollNeededArg,
15df0 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e   .  void(*xCollN
15e00 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c  eeded)(void*,sql
15e10 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52  ite3*,int eTextR
15e20 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a  ep,const char*).
15e30 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
15e40 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
15e50 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ex);.  db->xColl
15e60 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65  Needed = xCollNe
15e70 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  eded;.  db->xCol
15e80 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20  lNeeded16 = 0;. 
15e90 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
15ea0 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
15eb0 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
15ec0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
15ed0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
15ee0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
15ef0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15f00 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
15f10 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74  egister a collat
15f20 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
15f30 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69  tory callback wi
15f40 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
15f50 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65  handle.** db. Re
15f60 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f  place any previo
15f70 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63  usly installed c
15f80 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
15f90 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  e factory..*/.in
15fa0 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  t sqlite3_collat
15fb0 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20  ion_needed16(.  
15fc0 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
15fd0 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
15fe0 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
15ff0 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f  CollNeeded16)(vo
16000 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
16010 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
16020 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69  void*).){.  sqli
16030 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
16040 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
16050 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20  ->xCollNeeded = 
16060 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  0;.  db->xCollNe
16070 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65  eded16 = xCollNe
16080 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43  eded16;.  db->pC
16090 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70  ollNeededArg = p
160a0 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20  CollNeededArg;. 
160b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
160c0 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
160d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
160e0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
160f0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
16100 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  16 */..#ifndef S
16110 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
16120 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CATED./*.** This
16130 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77   function is now
16140 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e   an anachronism.
16150 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 75   It used to be u
16160 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66  sed to recover f
16170 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28  rom a.** malloc(
16180 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53  ) failure, but S
16190 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74  QLite now does t
161a0 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  his automaticall
161b0 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
161c0 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72  3_global_recover
161d0 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
161e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
161f0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  ndif../*.** Test
16200 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
16210 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  or not the datab
16220 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
16230 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a  s in autocommit.
16240 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e  ** mode.  Return
16250 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 61   TRUE if it is a
16260 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e  nd FALSE if not.
16270 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64    Autocommit mod
16280 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65  e is on.** by de
16290 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d  fault.  Autocomm
162a0 69 74 20 69 73 20 64 69 73 61 62 6c 65 64 20 62  it is disabled b
162b0 79 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d  y a BEGIN statem
162c0 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65  ent and reenable
162d0 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74  d.** by the next
162e0 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42   COMMIT or ROLLB
162f0 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ACK..*/.int sqli
16300 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
16310 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
16320 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75  .  return db->au
16330 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a  toCommit;.}../*.
16340 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
16350 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75   routines are su
16360 62 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e  btitutes for con
16370 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f  stants SQLITE_CO
16380 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45  RRUPT,.** SQLITE
16390 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f  _MISUSE, SQLITE_
163a0 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45  CANTOPEN, SQLITE
163b0 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69  _IOERR and possi
163c0 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a  bly other error.
163d0 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54  ** constants.  T
163e0 68 65 79 20 73 65 72 76 65 72 20 74 77 6f 20 70  hey server two p
163f0 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  urposes:.**.**  
16400 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20   1.  Serve as a 
16410 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65  convenient place
16420 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
16430 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67  oint in a debugg
16440 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64  er.**       to d
16450 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69  etect when versi
16460 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  on error conditi
16470 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ons occurs..**.*
16480 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73  *   2.  Invoke s
16490 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20  qlite3_log() to 
164a0 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72  provide the sour
164b0 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e  ce code location
164c0 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20   where.**       
164d0 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  a low-level erro
164e0 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63  r is first detec
164f0 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
16500 74 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28  te3CorruptError(
16510 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
16520 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
16530 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
16540 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  g!=0 );.  sqlite
16550 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52  3_log(SQLITE_COR
16560 52 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20  RUPT,.          
16570 20 20 20 20 22 64 61 74 61 62 61 73 65 20 63 6f      "database co
16580 72 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65  rruption at line
16590 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c   %d of [%.10s]",
165a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
165b0 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
165c0 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
165d0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
165e0 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71  ORRUPT;.}.int sq
165f0 6c 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72  lite3MisuseError
16600 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
16610 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
16620 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
16630 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  og!=0 );.  sqlit
16640 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49  e3_log(SQLITE_MI
16650 53 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20  SUSE, .         
16660 20 20 20 20 20 22 6d 69 73 75 73 65 20 61 74 20       "misuse at 
16670 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
16680 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
16690 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
166a0 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
166b0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
166c0 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74  TE_MISUSE;.}.int
166d0 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e   sqlite3Cantopen
166e0 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
166f0 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
16700 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16710 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
16720 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
16730 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20  TE_CANTOPEN, .  
16740 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e              "can
16750 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74  not open file at
16760 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31   line %d of [%.1
16770 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  0s]",.          
16780 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73      lineno, 20+s
16790 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
167a0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
167b0 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a  ITE_CANTOPEN;.}.
167c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
167d0 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
167e0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
167f0 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75   convenience rou
16800 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20  tine that makes 
16810 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68  sure that all th
16820 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a  read-specific.**
16830 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74   data for this t
16840 68 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64  hread has been d
16850 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a  eallocated..**.*
16860 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67  * SQLite no long
16870 65 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73  er uses thread-s
16880 70 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20  pecific data so 
16890 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
168a0 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20  now a.** no-op. 
168b0 20 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20   It is retained 
168c0 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63  for historical c
168d0 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f  ompatibility..*/
168e0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68  .void sqlite3_th
168f0 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69  read_cleanup(voi
16900 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  d){.}.#endif../*
16910 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20  .** Return meta 
16920 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
16930 74 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c  t a specific col
16940 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73  umn of a databas
16950 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20  e table..** See 
16960 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74  comment in sqlit
16970 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69  e3.h (sqlite.h.i
16980 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  n) for details..
16990 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
169a0 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
169b0 45 54 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69  ETADATA.int sqli
169c0 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
169d0 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c  _metadata(.  sql
169e0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
169f0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e           /* Conn
16a00 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f  ection handle */
16a10 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16a20 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  DbName,        /
16a30 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * Database name 
16a40 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
16a50 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e  st char *zTableN
16a60 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c  ame,     /* Tabl
16a70 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73  e name */.  cons
16a80 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e  t char *zColumnN
16a90 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  ame,    /* Colum
16aa0 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72  n name */.  char
16ab0 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54   const **pzDataT
16ac0 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55  ype,    /* OUTPU
16ad0 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61  T: Declared data
16ae0 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20   type */.  char 
16af0 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65  const **pzCollSe
16b00 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  q,     /* OUTPUT
16b10 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  : Collation sequ
16b20 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  ence name */.  i
16b30 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20  nt *pNotNull,   
16b40 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
16b50 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f  TPUT: True if NO
16b60 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
16b70 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e  t exists */.  in
16b80 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20  t *pPrimaryKey, 
16b90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
16ba0 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c  PUT: True if col
16bb0 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a  umn part of PK *
16bc0 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e  /.  int *pAutoin
16bd0 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
16be0 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
16bf0 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74  if column is aut
16c00 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29  o-increment */.)
16c10 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
16c20 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
16c30 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
16c40 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   0;.  Column *pC
16c50 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  ol = 0;.  int iC
16c60 6f 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73  ol;..  char cons
16c70 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30  t *zDataType = 0
16c80 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
16c90 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20  zCollSeq = 0;.  
16ca0 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b  int notnull = 0;
16cb0 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65  .  int primaryke
16cc0 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74  y = 0;.  int aut
16cd0 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  oinc = 0;..  /* 
16ce0 45 6e 73 75 72 65 20 74 68 65 20 64 61 74 61 62  Ensure the datab
16cf0 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 62  ase schema has b
16d00 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20  een loaded */.  
16d10 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
16d20 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
16d30 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
16d40 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63  terAll(db);.  rc
16d50 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64   = sqlite3Init(d
16d60 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  b, &zErrMsg);.  
16d70 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
16d80 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72  c ){.    goto er
16d90 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ror_out;.  }..  
16da0 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  /* Locate the ta
16db0 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20  ble in question 
16dc0 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  */.  pTab = sqli
16dd0 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
16de0 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62   zTableName, zDb
16df0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54  Name);.  if( !pT
16e00 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  ab || pTab->pSel
16e10 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20  ect ){.    pTab 
16e20 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72  = 0;.    goto er
16e30 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ror_out;.  }..  
16e40 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75  /* Find the colu
16e50 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66  mn for which inf
16e60 6f 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a  o is requested *
16e70 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  /.  if( sqlite3I
16e80 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61  sRowid(zColumnNa
16e90 6d 65 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  me) ){.    iCol 
16ea0 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
16eb0 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29     if( iCol>=0 )
16ec0 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26  {.      pCol = &
16ed0 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
16ee0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
16ef0 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b  .    for(iCol=0;
16f00 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
16f10 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
16f20 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
16f30 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  Col[iCol];.     
16f40 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
16f50 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  trICmp(pCol->zNa
16f60 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29  me, zColumnName)
16f70 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
16f80 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
16f90 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70  .    if( iCol==p
16fa0 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
16fb0 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20     pTab = 0;.   
16fc0 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
16fd0 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
16fe0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
16ff0 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68   block stores th
17000 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  e meta informati
17010 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  on that will be 
17020 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f  returned.  ** to
17030 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c   the caller in l
17040 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a  ocal variables z
17050 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53  DataType, zCollS
17060 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69  eq, notnull, pri
17070 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64  marykey.  ** and
17080 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69   autoinc. At thi
17090 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72  s point there ar
170a0 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74  e two possibilit
170b0 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ies:.  ** .  ** 
170c0 20 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69      1. The speci
170d0 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fied column name
170e0 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69   was rowid", "oi
170f0 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20  d" or "_rowid_" 
17100 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64  .  **        and
17110 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70   there is no exp
17120 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64  licitly declared
17130 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20   IPK column. .  
17140 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54  **.  **     2. T
17150 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20  he table is not 
17160 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63  a view and the c
17170 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74  olumn name ident
17180 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20  ified an .  **  
17190 20 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79        explicitly
171a0 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e   declared column
171b0 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f  . Copy meta info
171c0 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43  rmation from *pC
171d0 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ol..  */ .  if( 
171e0 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74  pCol ){.    zDat
171f0 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54  aType = pCol->zT
17200 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65  ype;.    zCollSe
17210 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b  q = pCol->zColl;
17220 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70  .    notnull = p
17230 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b  Col->notNull!=0;
17240 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20  .    primarykey 
17250 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61   = (pCol->colFla
17260 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49  gs & COLFLAG_PRI
17270 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75  MKEY)!=0;.    au
17280 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50  toinc = pTab->iP
17290 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54  Key==iCol && (pT
172a0 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
172b0 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  F_Autoincrement)
172c0 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  !=0;.  }else{.  
172d0 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49    zDataType = "I
172e0 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69  NTEGER";.    pri
172f0 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d  marykey = 1;.  }
17300 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71  .  if( !zCollSeq
17310 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71   ){.    zCollSeq
17320 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d   = "BINARY";.  }
17330 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73  ..error_out:.  s
17340 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17350 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57  All(db);..  /* W
17360 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74  hether the funct
17370 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64  ion call succeed
17380 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65  ed or failed, se
17390 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72  t the output par
173a0 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20  ameters.  ** to 
173b0 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c  whatever their l
173c0 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74  ocal counterpart
173d0 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e  s contain. If an
173e0 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72   error did occur
173f0 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20  ,.  ** this has 
17400 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65  the effect of ze
17410 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74  roing all output
17420 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a   parameters..  *
17430 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79  /.  if( pzDataTy
17440 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65  pe ) *pzDataType
17450 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20   = zDataType;.  
17460 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20  if( pzCollSeq ) 
17470 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f  *pzCollSeq = zCo
17480 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f  llSeq;.  if( pNo
17490 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c  tNull ) *pNotNul
174a0 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69  l = notnull;.  i
174b0 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29  f( pPrimaryKey )
174c0 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20   *pPrimaryKey = 
174d0 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66  primarykey;.  if
174e0 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41  ( pAutoinc ) *pA
174f0 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63  utoinc = autoinc
17500 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
17510 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20  OK==rc && !pTab 
17520 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
17530 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
17540 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  );.    zErrMsg =
17550 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
17560 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  db, "no such tab
17570 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73  le column: %s.%s
17580 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20  ", zTableName,. 
17590 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61         zColumnNa
175a0 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
175b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
175c0 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
175d0 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f  b, rc, (zErrMsg?
175e0 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67  "%s":0), zErrMsg
175f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
17600 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b  ee(db, zErrMsg);
17610 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
17620 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
17630 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
17640 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
17650 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17660 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
17670 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
17680 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
17690 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
176a0 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e  ime slept..*/.in
176b0 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28  t sqlite3_sleep(
176c0 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74  int ms){.  sqlit
176d0 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20  e3_vfs *pVfs;.  
176e0 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d  int rc;.  pVfs =
176f0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
17700 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73  d(0);.  if( pVfs
17710 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17720 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
17730 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c  ion works in mil
17740 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74  liseconds, but t
17750 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73  he underlying Os
17760 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50  Sleep() .  ** AP
17770 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f  I uses microseco
17780 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31  nds. Hence the 1
17790 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  000's..  */.  rc
177a0 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65   = (sqlite3OsSle
177b0 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73  ep(pVfs, 1000*ms
177c0 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  )/1000);.  retur
177d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
177e0 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
177f0 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
17800 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69  sult codes..*/.i
17810 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
17820 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
17830 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
17840 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69  t onoff){.  sqli
17850 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
17860 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
17870 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66  ->errMask = onof
17880 66 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  f ? 0xffffffff :
17890 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33   0xff;.  sqlite3
178a0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
178b0 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
178c0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
178d0 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
178e0 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65   xFileControl me
178f0 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63  thod on a partic
17900 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a  ular database..*
17910 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69  /.int sqlite3_fi
17920 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  le_control(sqlit
17930 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
17940 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74  ar *zDbName, int
17950 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
17960 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
17970 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72  ITE_ERROR;.  Btr
17980 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a 20 20 73  ee *pBtree;..  s
17990 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
179a0 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
179b0 20 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65   pBtree = sqlite
179c0 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
179d0 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69  b, zDbName);.  i
179e0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
179f0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
17a00 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
17a10 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65   *fd;.    sqlite
17a20 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
17a30 65 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20  ee);.    pPager 
17a40 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
17a50 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ger(pBtree);.   
17a60 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
17a70 3d 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73  =0 );.    fd = s
17a80 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
17a90 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
17aa0 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20  ert( fd!=0 );.  
17ab0 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
17ac0 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e  _FCNTL_FILE_POIN
17ad0 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73  TER ){.      *(s
17ae0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41  qlite3_file**)pA
17af0 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72  rg = fd;.      r
17b00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
17b10 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d     }else if( fd-
17b20 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
17b30 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
17b40 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c  sFileControl(fd,
17b50 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20   op, pArg);.    
17b60 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
17b70 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
17b80 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  D;.    }.    sql
17b90 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
17ba0 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Btree);.  }.  sq
17bb0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
17bc0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
17bd0 72 65 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a  return rc;   .}.
17be0 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
17bf0 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20   to the testing 
17c00 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71  logic..*/.int sq
17c10 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
17c20 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  ol(int op, ...){
17c30 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23  .  int rc = 0;.#
17c40 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
17c50 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a  IT_BUILTIN_TEST.
17c60 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
17c70 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29  va_start(ap, op)
17c80 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
17c90 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  {..    /*.    **
17ca0 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
17cb0 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  t state of the P
17cc0 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  RNG..    */.    
17cd0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
17ce0 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20  CTRL_PRNG_SAVE: 
17cf0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
17d00 72 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a  rngSaveState();.
17d10 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
17d20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
17d30 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 73 74  * Restore the st
17d40 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20  ate of the PRNG 
17d50 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61 74  to the last stat
17d60 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20  e saved using.  
17d70 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20    ** PRNG_SAVE. 
17d80 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61   If PRNG_SAVE ha
17d90 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62  s never before b
17da0 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  een called, then
17db0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72  .    ** this ver
17dc0 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47  b acts like PRNG
17dd0 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20  _RESET..    */. 
17de0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
17df0 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
17e00 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  TORE: {.      sq
17e10 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65  lite3PrngRestore
17e20 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
17e30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
17e40 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74   /*.    ** Reset
17e50 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74   the PRNG back t
17e60 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69  o its uninitiali
17e70 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68 65 20  zed state.  The 
17e80 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  next call.    **
17e90 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   to sqlite3_rand
17ea0 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65  omness() will re
17eb0 73 65 65 64 20 74 68 65 20 50 52 4e 47 20 75 73  seed the PRNG us
17ec0 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c  ing a single cal
17ed0 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  l.    ** to the 
17ee0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68  xRandomness meth
17ef0 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  od of the defaul
17f00 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20  t VFS..    */.  
17f10 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
17f20 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45  STCTRL_PRNG_RESE
17f30 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
17f40 65 33 50 72 6e 67 52 65 73 65 74 53 74 61 74 65  e3PrngResetState
17f50 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
17f60 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
17f70 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
17f80 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56  est_control(BITV
17f90 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70  EC_TEST, size, p
17fa0 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20  rogram).    **. 
17fb0 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74     ** Run a test
17fc0 20 61 67 61 69 6e 73 74 20 61 20 42 69 74 76 65   against a Bitve
17fd0 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65  c object of size
17fe0 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61  .  The program a
17ff0 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69  rgument.    ** i
18000 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
18010 74 65 67 65 72 73 20 74 68 61 74 20 64 65 66 69  tegers that defi
18020 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20 20 52  nes the test.  R
18030 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20  eturn -1 on a.  
18040 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f    ** memory allo
18050 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20  cation error, 0 
18060 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e  on success, or n
18070 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65  on-zero for an e
18080 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65  rror..    ** See
18090 20 74 68 65 20 73 71 6c 69 74 65 33 42 69 74 76   the sqlite3Bitv
180a0 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20  ecBuiltinTest() 
180b0 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
180c0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20  nformation..    
180d0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
180e0 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56  TE_TESTCTRL_BITV
180f0 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20  EC_TEST: {.     
18100 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67   int sz = va_arg
18110 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
18120 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61   int *aProg = va
18130 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a  _arg(ap, int*);.
18140 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18150 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
18160 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a  est(sz, aProg);.
18170 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18180 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
18190 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
181a0 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d  control(BENIGN_M
181b0 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65  ALLOC_HOOKS, xBe
181c0 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a  gin, xEnd).    *
181d0 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65  *.    ** Registe
181e0 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20  r hooks to call 
181f0 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63  to indicate whic
18200 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  h malloc() failu
18210 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20  res .    ** are 
18220 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20  benign..    */. 
18230 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
18240 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d  ESTCTRL_BENIGN_M
18250 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20  ALLOC_HOOKS: {. 
18260 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
18270 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f  d (*void_functio
18280 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  n)(void);.      
18290 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
182a0 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20  enignBegin;.    
182b0 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
182c0 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20  xBenignEnd;.    
182d0 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d    xBenignBegin =
182e0 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
182f0 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
18300 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76    xBenignEnd = v
18310 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
18320 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
18330 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c  sqlite3BenignMal
18340 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e  locHooks(xBenign
18350 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e  Begin, xBenignEn
18360 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
18370 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
18380 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
18390 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
183a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
183b0 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e  ING_BYTE, unsign
183c0 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  ed int X).    **
183d0 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
183e0 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20  PENDING byte to 
183f0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
18400 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e   argument, if X>
18410 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e  0..    ** Make n
18420 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d  o changes if X==
18430 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76  0.  Return the v
18440 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64  alue of the pend
18450 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ing byte.    ** 
18460 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62  as it existing b
18470 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
18480 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  ne was called.. 
18490 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50     **.    ** IMP
184a0 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e  ORTANT:  Changin
184b0 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
184c0 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30  te from 0x400000
184d0 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20  00 results in.  
184e0 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74    ** an incompat
184f0 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69  ible database fi
18500 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e  le format.  Chan
18510 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
18520 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69   byte.    ** whi
18530 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  le any database 
18540 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70  connection is op
18550 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e  en results in un
18560 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20  defined and.    
18570 2a 2a 20 64 69 6c 65 74 65 72 69 6f 75 73 20 62  ** dileterious b
18580 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a  ehavior..    */.
18590 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
185a0 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
185b0 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72  _BYTE: {.      r
185c0 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  c = PENDING_BYTE
185d0 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
185e0 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20  _OMIT_WSD.      
185f0 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  {.        unsign
18600 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20  ed int newVal = 
18610 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
18620 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
18630 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73    if( newVal ) s
18640 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74  qlite3PendingByt
18650 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20  e = newVal;.    
18660 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
18670 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
18680 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
18690 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
186a0 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
186b0 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58  RL_ASSERT, int X
186c0 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
186d0 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
186e0 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
186f0 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  test to see whet
18700 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a  her or not.    *
18710 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65  * assert() was e
18720 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
18730 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73  e-time.  If X is
18740 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74   true and assert
18750 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61  ().    ** is ena
18760 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
18770 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
18780 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  rue.  If X is tr
18790 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73  ue and.    ** as
187a0 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
187b0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
187c0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
187d0 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20  o.  If X is.    
187e0 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  ** false and ass
187f0 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
18800 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72  , then the asser
18810 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74  tion fires and t
18820 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
18830 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20  s aborts.  If X 
18840 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  is false and ass
18850 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
18860 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  d, then the.    
18870 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
18880 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  is zero..    */.
18890 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
188a0 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a  TESTCTRL_ASSERT:
188b0 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c   {.      volatil
188c0 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20  e int x = 0;.   
188d0 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d 20     assert( (x = 
188e0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21  va_arg(ap,int))!
188f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
18900 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   x;.      break;
18910 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
18920 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
18930 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
18940 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
18950 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  AYS, int X).    
18960 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
18970 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
18980 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
18990 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c  o see how the AL
189a0 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20  WAYS and.    ** 
189b0 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72  NEVER macros wer
189c0 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  e defined at com
189d0 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a  pile-time..    *
189e0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74  *.    ** The ret
189f0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57  urn value is ALW
18a00 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a  AYS(X).  .    **
18a10 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
18a20 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20  mmended test is 
18a30 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65  X==2.  If the re
18a40 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c  turn value is 2,
18a50 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20   that means.    
18a60 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20  ** ALWAYS() and 
18a70 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68  NEVER() are both
18a80 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
18a90 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63  ugh macros, whic
18aa0 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  h is the.    ** 
18ab0 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e  default setting.
18ac0 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
18ad0 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e  value is 1, then
18ae0 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74   ALWAYS() is eit
18af0 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d  her.    ** hard-
18b00 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72  coded to true or
18b10 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73   else it asserts
18b20 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74   if its argument
18b30 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
18b40 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61  * The first beha
18b50 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64  vior (hard-coded
18b60 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65   to true) is the
18b70 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
18b80 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
18b90 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
18ba0 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  t assert() is di
18bb0 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73  sabled and the s
18bc0 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68  econd.    ** beh
18bd0 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66  avior (assert if
18be0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
18bf0 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c   ALWAYS() is fal
18c00 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20  se) is the case 
18c10 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
18c20 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
18c30 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65   shows that asse
18c40 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e  rt() is enabled.
18c50 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
18c60 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74  he run-time test
18c70 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74   procedure might
18c80 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20   look something 
18c90 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
18ca0 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20  *.    **    if( 
18cb0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
18cc0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
18cd0 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d  CTRL_ALWAYS, 2)=
18ce0 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  =2 ){.    **    
18cf0 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e    // ALWAYS() an
18d00 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f  d NEVER() are no
18d10 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
18d20 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20   macros.    **  
18d30 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
18d40 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
18d50 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
18d60 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20  _ASSERT, 1) ){. 
18d70 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
18d80 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20  WAYS(x) asserts 
18d90 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20  that x is true. 
18da0 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73  NEVER(x) asserts
18db0 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20   x is false..   
18dc0 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   **    }else{.  
18dd0 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
18de0 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73  AYS(x) is a cons
18df0 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78  tant 1.  NEVER(x
18e00 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
18e10 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20  0..    **    }. 
18e20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
18e30 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
18e40 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69  LWAYS: {.      i
18e50 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
18e60 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  ,int);.      rc 
18e70 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20  = ALWAYS(x);.   
18e80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18e90 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
18ea0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
18eb0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
18ec0 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20  ESERVE, sqlite3 
18ed0 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
18ee0 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
18ef0 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20  e nReserve size 
18f00 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69  to N for the mai
18f10 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68  n database on th
18f20 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
18f30 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
18f40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
18f50 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
18f60 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20  _RESERVE: {.    
18f70 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
18f80 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
18f90 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  e3*);.      int 
18fa0 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
18fb0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
18fc0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
18fd0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
18fe0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
18ff0 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b  ageSize(db->aDb[
19000 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29  0].pBt, 0, x, 0)
19010 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
19020 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
19030 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
19040 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
19050 2f 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 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
19080 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20  ATIONS, sqlite3 
19090 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
190a0 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65  **.    ** Enable
190b0 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69   or disable vari
190c0 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
190d0 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  s for testing pu
190e0 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20  rposes.  The .  
190f0 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20    ** argument N 
19100 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
19110 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f  optimizations to
19120 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46   be disabled.  F
19130 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a  or normal.    **
19140 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f   operation N sho
19150 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69  uld be 0.  The i
19160 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65  dea is that a te
19170 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65  st program (like
19180 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20   the.    ** SQL 
19190 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c  Logic Test or SL
191a0 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63  T test module) c
191b0 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20  an run the same 
191c0 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  SQL multiple tim
191d0 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76  es.    ** with v
191e0 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
191f0 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f  ions disabled to
19200 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
19210 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20   same answer.   
19220 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20   ** is obtained 
19230 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20  in every case.. 
19240 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19250 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
19260 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a  PTIMIZATIONS: {.
19270 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
19280 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
19290 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
192a0 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d  db->dbOptFlags =
192b0 20 28 75 31 36 29 28 76 61 5f 61 72 67 28 61 70   (u16)(va_arg(ap
192c0 2c 20 69 6e 74 29 20 26 20 30 78 66 66 66 66 29  , int) & 0xffff)
192d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
192e0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
192f0 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20  ITE_N_KEYWORD.  
19300 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
19310 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
19320 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57  _TESTCTRL_ISKEYW
19330 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ORD, const char 
19340 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20  *zWord).    **. 
19350 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69     ** If zWord i
19360 73 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f  s a keyword reco
19370 67 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61  gnized by the pa
19380 72 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72  rser, then retur
19390 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  n the.    ** num
193a0 62 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e  ber of keywords.
193b0 20 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73    Or if zWord is
193c0 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20   not a keyword, 
193d0 72 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a  return 0..    **
193e0 20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65   .    ** This te
193f0 73 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e  st feature is on
19400 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ly available in 
19410 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  the amalgamation
19420 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68   since.    ** th
19430 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  e SQLITE_N_KEYWO
19440 52 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  RD macro is not 
19450 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
19460 66 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20  file if SQLite. 
19470 20 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75     ** is built u
19480 73 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f  sing separate so
19490 75 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  urce files..    
194a0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
194b0 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45  TE_TESTCTRL_ISKE
194c0 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63  YWORD: {.      c
194d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
194e0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f   = va_arg(ap, co
194f0 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
19500 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
19510 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29  3Strlen30(zWord)
19520 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71  ;.      rc = (sq
19530 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
19540 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21  ((u8*)zWord, n)!
19550 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45  =TK_ID) ? SQLITE
19560 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a  _N_KEYWORD : 0;.
19570 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19580 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20   }.#endif ..    
19590 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
195a0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
195b0 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d  ESTCTRL_SCRATCHM
195c0 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77  ALLOC, sz, &pNew
195d0 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a  , pFree);.    **
195e0 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72  .    ** Pass pFr
195f0 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53  ee into sqlite3S
19600 63 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20  cratchFree(). . 
19610 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68     ** If sz>0 th
19620 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63  en allocate a sc
19630 72 61 74 63 68 20 62 75 66 66 65 72 20 69 6e 74  ratch buffer int
19640 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f  o pNew.  .    */
19650 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19660 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43  _TESTCTRL_SCRATC
19670 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  HMALLOC: {.     
19680 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a   void *pFree, **
19690 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74  ppNew;.      int
196a0 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20   sz;.      sz = 
196b0 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
196c0 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76  .      ppNew = v
196d0 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a  a_arg(ap, void**
196e0 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d  );.      pFree =
196f0 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
19700 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  *);.      if( sz
19710 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69   ) *ppNew = sqli
19720 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
19730 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (sz);.      sqli
19740 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 70  te3ScratchFree(p
19750 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Free);.      bre
19760 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
19770 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
19780 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
19790 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
197a0 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e  ME_FAULT, int on
197b0 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  off);.    **.   
197c0 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72   ** If parameter
197d0 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65   onoff is non-ze
197e0 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68  ro, configure th
197f0 65 20 77 72 61 70 70 65 72 73 20 73 6f 20 74 68  e wrappers so th
19800 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75  at all.    ** su
19810 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
19820 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e  o localtime() an
19830 64 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e  d variants fail.
19840 20 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72   If onoff is zer
19850 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74  o,.    ** undo t
19860 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20  his setting..   
19870 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
19880 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
19890 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a  ALTIME_FAULT: {.
198a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
198b0 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c  balConfig.bLocal
198c0 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61  timeFault = va_a
198d0 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
198e0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
198f0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
19900 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
19910 45 58 50 4c 41 49 4e 29 0a 20 20 20 20 2f 2a 20  EXPLAIN).    /* 
19920 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
19930 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
19940 53 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53  STCTRL_EXPLAIN_S
19950 54 4d 54 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20  TMT,.    **     
19960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19970 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a     sqlite3_stmt*
19980 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a  ,const char**);.
19990 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
199a0 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53   compiled with S
199b0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
199c0 45 5f 45 58 50 4c 41 49 4e 2c 20 65 61 63 68 20  E_EXPLAIN, each 
199d0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 6f 6c  sqlite3_stmt hol
199e0 64 73 0a 20 20 20 20 2a 2a 20 61 20 73 74 72 69  ds.    ** a stri
199f0 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
19a00 73 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20  s the optimized 
19a10 70 61 72 73 65 20 74 72 65 65 2e 20 20 54 68 69  parse tree.  Thi
19a20 73 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20  s test-control. 
19a30 20 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20     ** returns a 
19a40 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20  pointer to that 
19a50 73 74 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  string..    */. 
19a60 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
19a70 45 53 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f  ESTCTRL_EXPLAIN_
19a80 53 54 4d 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  STMT: {.      sq
19a90 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
19aa0 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  t = va_arg(ap, s
19ab0 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 3b 0a 20  qlite3_stmt*);. 
19ac0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
19ad0 2a 2a 70 7a 52 65 74 20 3d 20 76 61 5f 61 72 67  **pzRet = va_arg
19ae0 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
19af0 2a 29 3b 0a 20 20 20 20 20 20 2a 70 7a 52 65 74  *);.      *pzRet
19b00 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78   = sqlite3VdbeEx
19b10 70 6c 61 6e 61 74 69 6f 6e 28 28 56 64 62 65 2a  planation((Vdbe*
19b20 29 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 62  )pStmt);.      b
19b30 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
19b40 69 66 0a 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64  if..  }.  va_end
19b50 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  (ap);.#endif /* 
19b60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c  SQLITE_OMIT_BUIL
19b70 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65  TIN_TEST */.  re
19b80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19b90 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69 6c  * This is a util
19ba0 69 74 79 20 72 6f 75 74 69 6e 65 2c 20 75 73 65  ity routine, use
19bb0 66 75 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c 65  ful to VFS imple
19bc0 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61 74  mentations, that
19bd0 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65   checks.** to se
19be0 65 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20  e if a database 
19bf0 66 69 6c 65 20 77 61 73 20 61 20 55 52 49 20 74  file was a URI t
19c00 68 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61 20  hat contained a 
19c10 73 70 65 63 69 66 69 63 20 71 75 65 72 79 20 0a  specific query .
19c20 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 61 6e  ** parameter, an
19c30 64 20 69 66 20 73 6f 20 6f 62 74 61 69 6e 73 20  d if so obtains 
19c40 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
19c50 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
19c60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c  ..**.** The zFil
19c70 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 69  ename argument i
19c80 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 70  s the filename p
19c90 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20 69 6e  ointer passed in
19ca0 74 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a  to the xOpen().*
19cb0 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 56 46  * method of a VF
19cc0 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  S implementation
19cd0 2e 20 20 54 68 65 20 7a 50 61 72 61 6d 20 61 72  .  The zParam ar
19ce0 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e 61  gument is the na
19cf0 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65  me of the.** que
19d00 72 79 20 70 61 72 61 6d 65 74 65 72 20 77 65 20  ry parameter we 
19d10 73 65 65 6b 2e 20 20 54 68 69 73 20 72 6f 75 74  seek.  This rout
19d20 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
19d30 76 61 6c 75 65 20 6f 66 20 74 68 65 20 7a 50 61  value of the zPa
19d40 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ram.** parameter
19d50 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 20   if it exists.  
19d60 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
19d70 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
19d80 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
19d90 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20   returns a NULL 
19da0 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73  pointer..*/.cons
19db0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
19dc0 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 63 6f  uri_parameter(co
19dd0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
19de0 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
19df0 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66 28 20  *zParam){.  if( 
19e00 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 72  zFilename==0 ) r
19e10 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65  eturn 0;.  zFile
19e20 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
19e30 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
19e40 65 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28  e) + 1;.  while(
19e50 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b   zFilename[0] ){
19e60 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74 72  .    int x = str
19e70 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  cmp(zFilename, z
19e80 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c  Param);.    zFil
19e90 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
19ea0 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
19eb0 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66 28  me) + 1;.    if(
19ec0 20 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a   x==0 ) return z
19ed0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46  Filename;.    zF
19ee0 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74  ilename += sqlit
19ef0 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65  e3Strlen30(zFile
19f00 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20  name) + 1;.  }. 
19f10 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
19f20 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f 6f  .** Return a boo
19f30 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20 61  lean value for a
19f40 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
19f50 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19f60 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e  _uri_boolean(con
19f70 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
19f80 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  me, const char *
19f90 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c  zParam, int bDfl
19fa0 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  t){.  const char
19fb0 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72   *z = sqlite3_ur
19fc0 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c  i_parameter(zFil
19fd0 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a  ename, zParam);.
19fe0 20 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74 21    bDflt = bDflt!
19ff0 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f  =0;.  return z ?
1a000 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65   sqlite3GetBoole
1a010 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62  an(z, bDflt) : b
1a020 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
1a030 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20 69  eturn a 64-bit i
1a040 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f 72  nteger value for
1a050 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74   a query paramet
1a060 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69  er..*/.sqlite3_i
1a070 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72 69  nt64 sqlite3_uri
1a080 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74 20  _int64(.  const 
1a090 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1a0a0 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20      /* Filename 
1a0b0 61 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f 70  as passed to xOp
1a0c0 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  en */.  const ch
1a0d0 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20  ar *zParam,     
1a0e0 20 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65 74    /* URI paramet
1a0f0 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73  er sought */.  s
1a100 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44 66  qlite3_int64 bDf
1a110 6c 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74 75  lt       /* retu
1a120 72 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72 20  rn if parameter 
1a130 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b  is missing */.){
1a140 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a150 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
1a160 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61  arameter(zFilena
1a170 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73  me, zParam);.  s
1a180 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a  qlite3_int64 v;.
1a190 20 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69 74    if( z && sqlit
1a1a0 65 33 41 74 6f 69 36 34 28 7a 2c 20 26 76 2c 20  e3Atoi64(z, &v, 
1a1b0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
1a1c0 7a 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  z), SQLITE_UTF8)
1a1d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1a1e0 20 20 20 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20     bDflt = v;.  
1a1f0 7d 0a 20 20 72 65 74 75 72 6e 20 62 44 66 6c 74  }.  return bDflt
1a200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
1a210 6e 20 74 68 65 20 42 74 72 65 65 20 70 6f 69 6e  n the Btree poin
1a220 74 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62  ter identified b
1a230 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52 65 74 75  y zDbName.  Retu
1a240 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  rn NULL if not f
1a250 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a  ound..*/.Btree *
1a260 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1a270 74 72 65 65 28 73 71 6c 69 74 65 33 20 2a 64 62  tree(sqlite3 *db
1a280 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
1a290 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b  bName){.  int i;
1a2a0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
1a2b0 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
1a2c0 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
1a2d0 70 42 74 0a 20 20 20 20 20 26 26 20 28 7a 44 62  pBt.     && (zDb
1a2e0 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  Name==0 || sqlit
1a2f0 65 33 53 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d  e3StrICmp(zDbNam
1a300 65 2c 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e  e, db->aDb[i].zN
1a310 61 6d 65 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a  ame)==0).    ){.
1a320 20 20 20 20 20 20 72 65 74 75 72 6e 20 64 62 2d        return db-
1a330 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20  >aDb[i].pBt;.   
1a340 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1a350 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
1a360 72 6e 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  rn the filename 
1a370 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
1a380 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1a390 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f  a database.** co
1a3a0 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e  nnection..*/.con
1a3b0 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1a3c0 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c  _db_filename(sql
1a3d0 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20  ite3 *db, const 
1a3e0 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a  char *zDbName){.
1a3f0 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 73    Btree *pBt = s
1a400 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
1a410 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
1a420 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f  ;.  return pBt ?
1a430 20 73 71 6c 69 74 65 33 42 74 72 65 65 47 65 74   sqlite3BtreeGet
1a440 46 69 6c 65 6e 61 6d 65 28 70 42 74 29 20 3a 20  Filename(pBt) : 
1a450 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  0;.}../*.** Retu
1a460 72 6e 20 31 20 69 66 20 64 61 74 61 62 61 73 65  rn 1 if database
1a470 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72   is read-only or
1a480 20 30 20 69 66 20 72 65 61 64 2f 77 72 69 74 65   0 if read/write
1a490 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 0a  .  Return -1 if.
1a4a0 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61 74 61 62  ** no such datab
1a4b0 61 73 65 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69  ase exists..*/.i
1a4c0 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72 65  nt sqlite3_db_re
1a4d0 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a  adonly(sqlite3 *
1a4e0 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  db, const char *
1a4f0 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65  zDbName){.  Btre
1a500 65 20 2a 70 42 74 20 3d 20 73 71 6c 69 74 65 33  e *pBt = sqlite3
1a510 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62  DbNameToBtree(db
1a520 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65  , zDbName);.  re
1a530 74 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74  turn pBt ? sqlit
1a540 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c  e3PagerIsreadonl
1a550 79 28 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  y(sqlite3BtreePa
1a560 67 65 72 28 70 42 74 29 29 20 3a 20 2d 31 3b 0a  ger(pBt)) : -1;.
1a570 7d 0a                                            }.