/ Hex Artifact Content
Login

Artifact 31af732aa4363e85816b09794429c79fe4baa3ac:


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 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1110: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1120: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1130: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
1140: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1150: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1160: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1170: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20  .  /* If SQLite 
1180: 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c  is already compl
1190: 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65  etely initialize
11a0: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  d, then this cal
11b0: 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65  l.  ** to sqlite
11c0: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73  3_initialize() s
11d0: 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70  hould be a no-op
11e0: 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74 69  .  But the initi
11f0: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d  alization.  ** m
1200: 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e  ust be complete.
1210: 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74    So isInit must
1220: 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69   not be set unti
1230: 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20  l the very end. 
1240: 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74   ** of this rout
1250: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ine..  */.  if( 
1260: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1270: 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74  fig.isInit ) ret
1280: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1290: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
12a0: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
12b0: 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65  em is initialize
12c0: 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74 6f  d.  If unable to
12d0: 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69 7a   .  ** initializ
12e0: 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73  e the mutex subs
12f0: 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20 65 61  ystem, return ea
1300: 72 6c 79 20 77 69 74 68 20 74 68 65 20 65 72 72  rly with the err
1310: 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65 20  or..  ** If the 
1320: 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73 69 63  system is so sic
1330: 6b 20 74 68 61 74 20 77 65 20 61 72 65 20 75 6e  k that we are un
1340: 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65  able to allocate
1350: 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20 74   a mutex,.  ** t
1360: 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63 68  here is not much
1370: 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69 6e 67   SQLite is going
1380: 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20 64   to be able to d
1390: 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  o..  **.  ** The
13a0: 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d   mutex subsystem
13b0: 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72 65 20   must take care 
13c0: 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67 20 69  of serializing i
13d0: 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69 74  ts own.  ** init
13e0: 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f  ialization..  */
13f0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4d  .  rc = sqlite3M
1400: 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20 69 66  utexInit();.  if
1410: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
1420: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
1430: 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29 20  ze the malloc() 
1440: 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65 20 72  system and the r
1450: 65 63 75 72 73 69 76 65 20 70 49 6e 69 74 4d 75  ecursive pInitMu
1460: 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a 20  tex mutex..  ** 
1470: 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20 69  This operation i
1480: 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 74  s protected by t
1490: 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54 45 52  he STATIC_MASTER
14a0: 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20 74 68   mutex.  Note th
14b0: 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c 6c  at.  ** MutexAll
14c0: 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64 20 66  oc() is called f
14d0: 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75 74 65  or a static mute
14e0: 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69 74 69  x prior to initi
14f0: 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a 2a  alizing the.  **
1500: 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65   malloc subsyste
1510: 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69 65 73  m - this implies
1520: 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63 61   that the alloca
1530: 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74 69 63  tion of a static
1540: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73 74  .  ** mutex must
1550: 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73 75 70   not require sup
1560: 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20 6d 61  port from the ma
1570: 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 2e 0a  lloc subsystem..
1580: 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f 47    */.  MUTEX_LOG
1590: 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73 71  IC( pMaster = sq
15a0: 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
15b0: 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
15c0: 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a 20  TIC_MASTER); ). 
15d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
15e0: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
15f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1600: 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74  nfig.isMutexInit
1610: 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73 71 6c   = 1;.  if( !sql
1620: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1630: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
1640: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1650: 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a 20  3MallocInit();. 
1660: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
1670: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
1680: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1690: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d  g.isMallocInit =
16a0: 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73 71 6c   1;.    if( !sql
16b0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
16c0: 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20  .pInitMutex ){. 
16d0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
16e0: 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75  alConfig.pInitMu
16f0: 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20 20 20  tex =.          
1700: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
1710: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1720: 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20  RECURSIVE);.    
1730: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
1740: 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
1750: 75 74 65 78 20 26 26 20 21 73 71 6c 69 74 65 33  utex && !sqlite3
1760: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
1770: 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20 20  itMutex ){.     
1780: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
1790: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OMEM;.      }.  
17a0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63    }.  }.  if( rc
17b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17c0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
17d0: 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d  Config.nRefInitM
17e0: 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73 71  utex++;.  }.  sq
17f0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1800: 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f  e(pMaster);..  /
1810: 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74 20 53  * If rc is not S
1820: 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68 69 73  QLITE_OK at this
1830: 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69 74   point, then eit
1840: 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a 20  her the malloc. 
1850: 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20 63 6f   ** subsystem co
1860: 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69 74 69  uld not be initi
1870: 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20 73 79  alized or the sy
1880: 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f 20 61  stem failed to a
1890: 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68 65  llocate.  ** the
18a0: 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74 65   pInitMutex mute
18b0: 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  x. Return an err
18c0: 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63 61 73  or in either cas
18d0: 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 21  e.  */.  if( rc!
18e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
18f0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1900: 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 72 65  ..  /* Do the re
1910: 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61  st of the initia
1920: 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20 74  lization under t
1930: 68 65 20 72 65 63 75 72 73 69 76 65 20 6d 75 74  he recursive mut
1940: 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  ex so.  ** that 
1950: 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c 65 20  we will be able 
1960: 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75 72 73  to handle recurs
1970: 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a 20  ive calls into. 
1980: 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69 74   ** sqlite3_init
1990: 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65 20 72  ialize().  The r
19a0: 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20 6e  ecursive calls n
19b0: 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68 72  ormally come thr
19c0: 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74 65  ough.  ** sqlite
19d0: 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68 65 6e  3_os_init() when
19e0: 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c 69   it invokes sqli
19f0: 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
1a00: 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a 20 20  (), but other.  
1a10: 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63 61 6c  ** recursive cal
1a20: 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65  ls might also be
1a30: 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a 0a   possible..  **.
1a40: 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41 54    ** IMPLEMENTAT
1a50: 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30 2d  ION-OF: R-00140-
1a60: 33 37 34 34 35 20 53 51 4c 69 74 65 20 61 75 74  37445 SQLite aut
1a70: 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 72 69 61  omatically seria
1a80: 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a 2a  lizes calls.  **
1a90: 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20 6d 65   to the xInit me
1aa0: 74 68 6f 64 2c 20 73 6f 20 74 68 65 20 78 49 6e  thod, so the xIn
1ab0: 69 74 20 6d 65 74 68 6f 64 20 6e 65 65 64 20 6e  it method need n
1ac0: 6f 74 20 62 65 20 74 68 72 65 61 64 73 61 66 65  ot be threadsafe
1ad0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20  ..  **.  ** The 
1ae0: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78 20  following mutex 
1af0: 69 73 20 77 68 61 74 20 73 65 72 69 61 6c 69 7a  is what serializ
1b00: 65 73 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  es access to the
1b10: 20 61 70 70 64 65 66 20 70 63 61 63 68 65 20 78   appdef pcache x
1b20: 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f 64  Init.  ** method
1b30: 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33 5f  s.  The sqlite3_
1b40: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e 78  pcache_methods.x
1b50: 49 6e 69 74 28 29 20 61 6c 6c 20 69 73 20 65 6d  Init() all is em
1b60: 62 65 64 64 65 64 20 69 6e 20 74 68 65 0a 20 20  bedded in the.  
1b70: 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  ** call to sqlit
1b80: 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c 69  e3PcacheInitiali
1b90: 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  ze()..  */.  sql
1ba0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
1bb0: 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f  (sqlite3GlobalCo
1bc0: 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29  nfig.pInitMutex)
1bd0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  ;.  if( sqlite3G
1be0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1bf0: 69 74 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33  it==0 && sqlite3
1c00: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
1c10: 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20 20  rogress==0 ){.  
1c20: 20 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a 70    FuncDefHash *p
1c30: 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28 46  Hash = &GLOBAL(F
1c40: 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c 69  uncDefHash, sqli
1c50: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
1c60: 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ns);.    sqlite3
1c70: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e 50  GlobalConfig.inP
1c80: 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20 20  rogress = 1;.   
1c90: 20 6d 65 6d 73 65 74 28 70 48 61 73 68 2c 20 30   memset(pHash, 0
1ca0: 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65 33  , sizeof(sqlite3
1cb0: 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73 29  GlobalFunctions)
1cc0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65  );.    sqlite3Re
1cd0: 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e 63  gisterGlobalFunc
1ce0: 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66 28  tions();.    if(
1cf0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1d00: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
1d10: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  t==0 ){.      rc
1d20: 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
1d30: 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  Initialize();.  
1d40: 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d    }.    if( rc==
1d50: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1d60: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
1d70: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
1d80: 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 72  nit = 1;.      r
1d90: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e 69  c = sqlite3OsIni
1da0: 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  t();.    }.    i
1db0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1dc0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
1dd0: 33 50 43 61 63 68 65 42 75 66 66 65 72 53 65 74  3PCacheBufferSet
1de0: 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  up( sqlite3Globa
1df0: 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20 0a  lConfig.pPage, .
1e00: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1e10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
1e20: 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47 6c 6f  Page, sqlite3Glo
1e30: 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65 29  balConfig.nPage)
1e40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
1e50: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49 6e  lobalConfig.isIn
1e60: 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  it = 1;.    }.  
1e70: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1e80: 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65 73 73  onfig.inProgress
1e90: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
1ea0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
1eb0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1ec0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b  fig.pInitMutex);
1ed0: 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b 20 75  ..  /* Go back u
1ee0: 6e 64 65 72 20 74 68 65 20 73 74 61 74 69 63 20  nder the static 
1ef0: 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61 6e 20  mutex and clean 
1f00: 75 70 20 74 68 65 20 72 65 63 75 72 73 69 76 65  up the recursive
1f10: 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f 20 70  .  ** mutex to p
1f20: 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75 72 63  revent a resourc
1f30: 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73  e leak..  */.  s
1f40: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1f50: 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 73  er(pMaster);.  s
1f60: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1f70: 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78  ig.nRefInitMutex
1f80: 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  --;.  if( sqlite
1f90: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
1fa0: 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30 20 29  efInitMutex<=0 )
1fb0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71  {.    assert( sq
1fc0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1fd0: 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3d  g.nRefInitMutex=
1fe0: 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
1ff0: 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73 71 6c  3_mutex_free(sql
2000: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2010: 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 20 20  .pInitMutex);.  
2020: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2030: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
2040: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
2050: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
2060: 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f 2a 20  pMaster);..  /* 
2070: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  The following is
2080: 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79 20 63   just a sanity c
2090: 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73 75 72  heck to make sur
20a0: 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20 20 2a  e SQLite has.  *
20b0: 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65 64 20  * been compiled 
20c0: 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74 20 69  correctly.  It i
20d0: 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 72  s important to r
20e0: 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20 62 75  un this code, bu
20f0: 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27 74 20  t.  ** we don't 
2100: 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74 20 74  want to run it t
2110: 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73 6f 61  oo often and soa
2120: 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65 73 20  k up CPU cycles 
2130: 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65 61 73  for no.  ** reas
2140: 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e 20 69  on.  So we run i
2150: 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20 69 6e  t once during in
2160: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
2170: 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2180: 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  G.#ifndef SQLITE
2190: 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50  _OMIT_FLOATING_P
21a0: 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73 20 73  OINT.  /* This s
21b0: 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65 27 73  ection of code's
21c0: 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22 20 69   only "output" i
21d0: 73 20 76 69 61 20 61 73 73 65 72 74 28 29 20 73  s via assert() s
21e0: 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  tatements. */.  
21f0: 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  if ( rc==SQLITE_
2200: 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20 78 20  OK ){.    u64 x 
2210: 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36 33 29  = (((u64)1)<<63)
2220: 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65 20 79  -1;.    double y
2230: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73 69 7a  ;.    assert(siz
2240: 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20 20 20  eof(x)==8);.    
2250: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
2260: 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a 20 20  ==sizeof(y));.  
2270: 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26 78 2c    memcpy(&y, &x,
2280: 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   8);.    assert(
2290: 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28 79 29   sqlite3IsNaN(y)
22a0: 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 23   );.  }.#endif.#
22b0: 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20 65  endif..  /* Do e
22c0: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
22d0: 69 6f 6e 20 73 74 65 70 73 20 72 65 71 75 65 73  ion steps reques
22e0: 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49 54  ted by the SQLIT
22f0: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 2a  E_EXTRA_INIT.  *
2300: 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  * compile-time o
2310: 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64  ption..  */.#ifd
2320: 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  ef SQLITE_EXTRA_
2330: 49 4e 49 54 0a 20 20 69 66 28 20 72 63 3d 3d 53  INIT.  if( rc==S
2340: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69  QLITE_OK && sqli
2350: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2360: 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e  isInit ){.    in
2370: 74 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  t SQLITE_EXTRA_I
2380: 4e 49 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  NIT(const char*)
2390: 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
23a0: 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b  E_EXTRA_INIT(0);
23b0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72  .  }.#endif..  r
23c0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23d0: 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65  ** Undo the effe
23e0: 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69  cts of sqlite3_i
23f0: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75  nitialize().  Mu
2400: 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  st not be called
2410: 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20   while.** there 
2420: 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  are outstanding 
2430: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
2440: 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61  ions or memory a
2450: 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a  llocations or.**
2460: 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20   while any part 
2470: 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68  of SQLite is oth
2480: 65 72 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e  erwise in use in
2490: 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68   any thread.  Th
24a0: 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73  is.** routine is
24b0: 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e   not threadsafe.
24c0: 20 20 42 75 74 20 69 74 20 69 73 20 73 61 66 65    But it is safe
24d0: 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20   to invoke this 
24e0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68  routine.** on wh
24f0: 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72  en SQLite is alr
2500: 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20  eady shut down. 
2510: 20 49 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c   If SQLite is al
2520: 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a  ready shut down.
2530: 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ** when this rou
2540: 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c  tine is invoked,
2550: 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   then this routi
2560: 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73  ne is a harmless
2570: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73   no-op..*/.int s
2580: 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28  qlite3_shutdown(
2590: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 73 71 6c  void){.  if( sql
25a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
25b0: 2e 69 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65  .isInit ){.#ifde
25c0: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53  f SQLITE_EXTRA_S
25d0: 48 55 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64  HUTDOWN.    void
25e0: 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48   SQLITE_EXTRA_SH
25f0: 55 54 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20  UTDOWN(void);.  
2600: 20 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53    SQLITE_EXTRA_S
2610: 48 55 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69  HUTDOWN();.#endi
2620: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73  f.    sqlite3_os
2630: 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69  _end();.    sqli
2640: 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65  te3_reset_auto_e
2650: 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20  xtension();.    
2660: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2670: 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a  fig.isInit = 0;.
2680: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
2690: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
26a0: 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20  PCacheInit ){.  
26b0: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
26c0: 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73  hutdown();.    s
26d0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
26e0: 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20  ig.isPCacheInit 
26f0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  = 0;.  }.  if( s
2700: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2710: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
2720: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61  ){.    sqlite3Ma
2730: 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73  llocEnd();.    s
2740: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2750: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
2760: 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51  = 0;..#ifndef SQ
2770: 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f  LITE_OMIT_SHUTDO
2780: 57 4e 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20  WN_DIRECTORIES. 
2790: 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73     /* The heap s
27a0: 75 62 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77  ubsystem has now
27b0: 20 62 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61   been shutdown a
27c0: 6e 64 20 74 68 65 73 65 20 76 61 6c 75 65 73 20  nd these values 
27d0: 61 72 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20  are supposed.   
27e0: 20 2a 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f   ** to be NULL o
27f0: 72 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72  r point to memor
2800: 79 20 74 68 61 74 20 77 61 73 20 6f 62 74 61 69  y that was obtai
2810: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  ned from sqlite3
2820: 5f 6d 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a  _malloc(),.    *
2830: 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65  * which would re
2840: 6c 79 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20  ly on that heap 
2850: 73 75 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65  subsystem; there
2860: 66 6f 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  fore, make sure 
2870: 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c  these.    ** val
2880: 75 65 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72  ues cannot refer
2890: 20 74 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20   to heap memory 
28a0: 74 68 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e  that was just in
28b0: 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74  validated when t
28c0: 68 65 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73  he.    ** heap s
28d0: 75 62 73 79 73 74 65 6d 20 77 61 73 20 73 68 75  ubsystem was shu
28e0: 74 64 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20  tdown.  This is 
28f0: 6f 6e 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65  only done if the
2900: 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f   current call to
2910: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e  .    ** this fun
2920: 63 74 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69  ction resulted i
2930: 6e 20 74 68 65 20 68 65 61 70 20 73 75 62 73 79  n the heap subsy
2940: 73 74 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65  stem actually be
2950: 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20  ing shutdown..  
2960: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
2970: 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20  _data_directory 
2980: 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2990: 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20  _temp_directory 
29a0: 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  = 0;.#endif.  }.
29b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
29c0: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
29d0: 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c  xInit ){.    sql
29e0: 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a  ite3MutexEnd();.
29f0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
2a00: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2a10: 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20  nit = 0;.  }..  
2a20: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
2a30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
2a40: 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69  API allows appli
2a50: 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66  cations to modif
2a60: 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e  y the global con
2a70: 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a  figuration of.**
2a80: 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72   the SQLite libr
2a90: 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e  ary at run-time.
2aa0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
2ab0: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
2ac0: 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  be called when t
2ad0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
2ae0: 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62  tanding.** datab
2af0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  ase connections 
2b00: 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  or memory alloca
2b10: 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75  tions.  This rou
2b20: 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74  tine is not.** t
2b30: 68 72 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c  hreadsafe.  Fail
2b40: 75 72 65 20 74 6f 20 68 65 65 64 20 74 68 65 73  ure to heed thes
2b50: 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c  e warnings can l
2b60: 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74  ead to unpredict
2b70: 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72  able.** behavior
2b80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
2b90: 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20  _config(int op, 
2ba0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2bb0: 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  ap;.  int rc = S
2bc0: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
2bd0: 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29  sqlite3_config()
2be0: 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51   shall return SQ
2bf0: 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69  LITE_MISUSE if i
2c00: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69  t is invoked whi
2c10: 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69  le.  ** the SQLi
2c20: 74 65 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e  te library is in
2c30: 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73   use. */.  if( s
2c40: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2c50: 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75  ig.isInit ) retu
2c60: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
2c70: 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61  _BKPT;..  va_sta
2c80: 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77  rt(ap, op);.  sw
2c90: 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20  itch( op ){..   
2ca0: 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67   /* Mutex config
2cb0: 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20  uration options 
2cc0: 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62  are only availab
2cd0: 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64 73 61  le in a threadsa
2ce0: 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c  fe.    ** compil
2cf0: 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64  e. .    */.#if d
2d00: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48  efined(SQLITE_TH
2d10: 52 45 41 44 53 41 46 45 29 20 26 26 20 53 51 4c  READSAFE) && SQL
2d20: 49 54 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30  ITE_THREADSAFE>0
2d30: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
2d40: 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48  _CONFIG_SINGLETH
2d50: 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  READ: {.      /*
2d60: 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75 74   Disable all mut
2d70: 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73  exing */.      s
2d80: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2d90: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
2da0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
2db0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
2dc0: 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20  llMutex = 0;.   
2dd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
2de0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
2df0: 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45  CONFIG_MULTITHRE
2e00: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  AD: {.      /* D
2e10: 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20  isable mutexing 
2e20: 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  of database conn
2e30: 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20  ections */.     
2e40: 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78   /* Enable mutex
2e50: 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61 74 61  ing of core data
2e60: 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20   structures */. 
2e70: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2e80: 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
2e90: 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  tex = 1;.      s
2ea0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2eb0: 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20  ig.bFullMutex = 
2ec0: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
2ed0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
2ee0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52  QLITE_CONFIG_SER
2ef0: 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20  IALIZED: {.     
2f00: 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20 6d   /* Enable all m
2f10: 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20  utexing */.     
2f20: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2f30: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2f40: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
2f50: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2f60: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a 20  FullMutex = 1;. 
2f70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f80: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2f90: 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20  E_CONFIG_MUTEX: 
2fa0: 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69  {.      /* Speci
2fb0: 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76  fy an alternativ
2fc0: 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e  e mutex implemen
2fd0: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
2fe0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2ff0: 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f  fig.mutex = *va_
3000: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
3010: 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b  mutex_methods*);
3020: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3030: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3040: 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55  ITE_CONFIG_GETMU
3050: 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  TEX: {.      /* 
3060: 52 65 74 72 69 65 76 65 20 74 68 65 20 63 75 72  Retrieve the cur
3070: 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65  rent mutex imple
3080: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
3090: 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73     *va_arg(ap, s
30a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74  qlite3_mutex_met
30b0: 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33  hods*) = sqlite3
30c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74  GlobalConfig.mut
30d0: 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ex;.      break;
30e0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a  .    }.#endif...
30f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3100: 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b  CONFIG_MALLOC: {
3110: 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66  .      /* Specif
3120: 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  y an alternative
3130: 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e   malloc implemen
3140: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
3150: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3160: 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28  fig.m = *va_arg(
3170: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
3180: 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20  methods*);.     
3190: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
31a0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
31b0: 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20  NFIG_GETMALLOC: 
31c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69  {.      /* Retri
31d0: 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  eve the current 
31e0: 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65  malloc() impleme
31f0: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
3200: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
3210: 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c  alConfig.m.xMall
3220: 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d  oc==0 ) sqlite3M
3230: 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  emSetDefault();.
3240: 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70        *va_arg(ap
3250: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
3260: 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65  thods*) = sqlite
3270: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b  3GlobalConfig.m;
3280: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3290: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
32a0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54  ITE_CONFIG_MEMST
32b0: 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  ATUS: {.      /*
32c0: 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62   Enable or disab
32d0: 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 74  le the malloc st
32e0: 61 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f 6e 20  atus collection 
32f0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
3300: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65  GlobalConfig.bMe
3310: 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61  mstat = va_arg(a
3320: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3330: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3340: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3350: 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20  IG_SCRATCH: {.  
3360: 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65      /* Designate
3370: 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 73 63   a buffer for sc
3380: 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73 70 61  ratch memory spa
3390: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
33a0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
33b0: 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72  pScratch = va_ar
33c0: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
33d0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
33e0: 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63  lConfig.szScratc
33f0: 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  h = va_arg(ap, i
3400: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
3410: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3420: 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67  Scratch = va_arg
3430: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3440: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3450: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3460: 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20  NFIG_PAGECACHE: 
3470: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67  {.      /* Desig
3480: 6e 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f  nate a buffer fo
3490: 72 20 70 61 67 65 20 63 61 63 68 65 20 6d 65 6d  r page cache mem
34a0: 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20  ory space */.   
34b0: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
34c0: 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76  Config.pPage = v
34d0: 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29  a_arg(ap, void*)
34e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
34f0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61  lobalConfig.szPa
3500: 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ge = va_arg(ap, 
3510: 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  int);.      sqli
3520: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3530: 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61  nPage = va_arg(a
3540: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3550: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3560: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3570: 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20  FIG_PCACHE: {.  
3580: 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a      /* no-op */.
3590: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
35a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
35b0: 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41  TE_CONFIG_GETPCA
35c0: 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  CHE: {.      /* 
35d0: 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a  now an error */.
35e0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
35f0: 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62  E_ERROR;.      b
3600: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
3610: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
3620: 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a 20  FIG_PCACHE2: {. 
3630: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
3640: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70  an alternative p
3650: 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d  age cache implem
3660: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
3670: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3680: 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 20 3d 20  onfig.pcache2 = 
3690: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
36a0: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
36b0: 64 73 32 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ds2*);.      bre
36c0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
36d0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
36e0: 5f 47 45 54 50 43 41 43 48 45 32 3a 20 7b 0a 20  _GETPCACHE2: {. 
36f0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3700: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61  GlobalConfig.pca
3710: 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b  che2.xInit==0 ){
3720: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3730: 50 43 61 63 68 65 53 65 74 44 65 66 61 75 6c 74  PCacheSetDefault
3740: 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ();.      }.    
3750: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
3760: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
3770: 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c 69 74 65  hods2*) = sqlite
3780: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63  3GlobalConfig.pc
3790: 61 63 68 65 32 3b 0a 20 20 20 20 20 20 62 72 65  ache2;.      bre
37a0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64  ak;.    }..#if d
37b0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
37c0: 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c  ABLE_MEMSYS3) ||
37d0: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
37e0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a  ENABLE_MEMSYS5).
37f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3800: 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20  CONFIG_HEAP: {. 
3810: 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74       /* Designat
3820: 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 68  e a buffer for h
3830: 65 61 70 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  eap memory space
3840: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
3850: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48  3GlobalConfig.pH
3860: 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  eap = va_arg(ap,
3870: 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73   void*);.      s
3880: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3890: 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72  ig.nHeap = va_ar
38a0: 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
38b0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
38c0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61  onfig.mnReq = va
38d0: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a  _arg(ap, int);..
38e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
38f0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
3900: 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20  Req<1 ){.       
3910: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3920: 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a  nfig.mnReq = 1;.
3930: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
3940: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3950: 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32  fig.mnReq>(1<<12
3960: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
3970: 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20  cap min request 
3980: 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a  size at 2^12 */.
3990: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
39a0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
39b0: 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20  q = (1<<12);.   
39c0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
39d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
39e0: 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a  fig.pHeap==0 ){.
39f0: 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
3a00: 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69  e heap pointer i
3a10: 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65 73  s NULL, then res
3a20: 74 6f 72 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20  tore the malloc 
3a30: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20  implementation. 
3a40: 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74         ** back t
3a50: 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20  o NULL pointers 
3a60: 74 6f 6f 2e 20 20 54 68 69 73 20 77 69 6c 6c 20  too.  This will 
3a70: 63 61 75 73 65 20 74 68 65 20 6d 61 6c 6c 6f 63  cause the malloc
3a80: 20 74 6f 20 67 6f 0a 20 20 20 20 20 20 20 20 2a   to go.        *
3a90: 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20 64 65  * back to its de
3aa0: 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61  fault implementa
3ab0: 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65  tion when sqlite
3ac0: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69  3_initialize() i
3ad0: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6e  s.        ** run
3ae0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
3af0: 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c       memset(&sql
3b00: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3b10: 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71  .m, 0, sizeof(sq
3b20: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3b30: 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  g.m));.      }el
3b40: 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54  se{.        /* T
3b50: 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20  he heap pointer 
3b60: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  is not NULL, the
3b70: 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e 65 20 6f 66  n install one of
3b80: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
3b90: 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65  mem5.c/mem3.c me
3ba0: 74 68 6f 64 73 2e 20 49 66 20 6e 65 69 74 68 65  thods. If neithe
3bb0: 72 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33  r ENABLE_MEMSYS3
3bc0: 20 6e 6f 72 0a 20 20 20 20 20 20 20 20 2a 2a 20   nor.        ** 
3bd0: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35 20 69  ENABLE_MEMSYS5 i
3be0: 73 20 64 65 66 69 6e 65 64 2c 20 72 65 74 75 72  s defined, retur
3bf0: 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20  n an error..    
3c00: 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51      */.#ifdef SQ
3c10: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53  LITE_ENABLE_MEMS
3c20: 59 53 33 0a 20 20 20 20 20 20 20 20 73 71 6c 69  YS3.        sqli
3c30: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3c40: 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47  m = *sqlite3MemG
3c50: 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23 65 6e  etMemsys3();.#en
3c60: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
3c70: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
3c80: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
3c90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 20 3d  GlobalConfig.m =
3ca0: 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65 74 4d   *sqlite3MemGetM
3cb0: 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64 69 66  emsys5();.#endif
3cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
3cd0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
3ce0: 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c  if..    case SQL
3cf0: 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41  ITE_CONFIG_LOOKA
3d00: 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  SIDE: {.      sq
3d10: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3d20: 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20 3d 20  g.szLookaside = 
3d30: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3d40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3d50: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f 6b  obalConfig.nLook
3d60: 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61  aside = va_arg(a
3d70: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3d80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3d90: 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64 20 61  .    /* Record a
3da0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
3db0: 6c 6f 67 67 65 72 20 66 75 6e 63 63 74 69 6f 6e  logger funcction
3dc0: 20 61 6e 64 20 69 74 73 20 66 69 72 73 74 20 61   and its first a
3dd0: 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a 2a 20  rgument..    ** 
3de0: 54 68 65 20 64 65 66 61 75 6c 74 20 69 73 20 4e  The default is N
3df0: 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20 69 73  ULL.  Logging is
3e00: 20 64 69 73 61 62 6c 65 64 20 69 66 20 74 68 65   disabled if the
3e10: 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65   function pointe
3e20: 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55 4c 4c  r is.    ** NULL
3e30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
3e40: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3e50: 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  LOG: {.      /* 
3e60: 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20 61 62  MSVC is picky ab
3e70: 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75 6e 63  out pulling func
3e80: 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20 6c 69   ptrs from va li
3e90: 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20 68 74  sts..      ** ht
3ea0: 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d 69 63  tp://support.mic
3eb0: 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f 34 37  rosoft.com/kb/47
3ec0: 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  961.      ** sql
3ed0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3ee0: 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  .xLog = va_arg(a
3ef0: 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69 64 2a  p, void(*)(void*
3f00: 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72 2a  ,int,const char*
3f10: 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ));.      */.   
3f20: 20 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 28     typedef void(
3f30: 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64  *LOGFUNC_t)(void
3f40: 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61 72  *,int,const char
3f50: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
3f60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
3f70: 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  og = va_arg(ap, 
3f80: 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20  LOGFUNC_t);.    
3f90: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3fa0: 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20 3d 20  onfig.pLogArg = 
3fb0: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a  va_arg(ap, void*
3fc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3fd0: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
3fe0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 55 52  SQLITE_CONFIG_UR
3ff0: 49 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  I: {.      sqlit
4000: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
4010: 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61 72 67  OpenUri = va_arg
4020: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4030: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
4040: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4050: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4060: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
4070: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
4080: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
4090: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
40a0: 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f  * Set up the loo
40b0: 6b 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66  kaside buffers f
40c0: 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
40d0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74  nnection..** Ret
40e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
40f0: 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49   success.  .** I
4100: 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61  f lookaside is a
4110: 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72  lready active, r
4120: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
4130: 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20  Y..**.** The sz 
4140: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
4150: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
4160: 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69   in each lookasi
4170: 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20  de slot..** The 
4180: 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  cnt parameter is
4190: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
41a0: 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74  lots.  If pStart
41b0: 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20   is NULL the.** 
41c0: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f  space for the lo
41d0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69  okaside memory i
41e0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
41f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
4200: 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69  ..** If pStart i
4210: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
4220: 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74  it is sz*cnt byt
4230: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  es of memory to 
4240: 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c  use for.** the l
4250: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e  ookaside memory.
4260: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4270: 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71  etupLookaside(sq
4280: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
4290: 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69  *pBuf, int sz, i
42a0: 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20  nt cnt){.  void 
42b0: 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64  *pStart;.  if( d
42c0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
42d0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
42e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
42f0: 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65  .  /* Free any e
4300: 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  xisting lookasid
4310: 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 69  e buffer for thi
4320: 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a  s handle before.
4330: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20    ** allocating 
4340: 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20  a new one so we 
4350: 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61  don't have to ha
4360: 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20  ve space for .  
4370: 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20 73  ** both at the s
4380: 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20  ame time..  */. 
4390: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
43a0: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a  de.bMalloced ){.
43b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
43c0: 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70  (db->lookaside.p
43d0: 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Start);.  }.  /*
43e0: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c   The size of a l
43f0: 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66  ookaside slot af
4400: 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e  ter ROUNDDOWN8 n
4410: 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65  eeds to be large
4420: 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f  r.  ** than a po
4430: 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73 65 66  inter to be usef
4440: 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20  ul..  */.  sz = 
4450: 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20  ROUNDDOWN8(sz); 
4460: 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38   /* IMP: R-33038
4470: 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20  -09382 */.  if( 
4480: 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  sz<=(int)sizeof(
4490: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
44a0: 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  ) sz = 0;.  if( 
44b0: 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b  cnt<0 ) cnt = 0;
44c0: 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20  .  if( sz==0 || 
44d0: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a  cnt==0 ){.    sz
44e0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
44f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
4500: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
4510: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
4520: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
4530: 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   pStart = sqlite
4540: 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20  3Malloc( sz*cnt 
4550: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31  );  /* IMP: R-61
4560: 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20  949-35727 */.   
4570: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
4580: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
4590: 66 28 20 70 53 74 61 72 74 20 29 20 63 6e 74 20  f( pStart ) cnt 
45a0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  = sqlite3MallocS
45b0: 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a  ize(pStart)/sz;.
45c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74    }else{.    pSt
45d0: 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a  art = pBuf;.  }.
45e0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
45f0: 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b  pStart = pStart;
4600: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
4610: 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62  .pFree = 0;.  db
4620: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d  ->lookaside.sz =
4630: 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20   (u16)sz;.  if( 
4640: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e  pStart ){.    in
4650: 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69  t i;.    Lookasi
4660: 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61  deSlot *p;.    a
4670: 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74  ssert( sz > (int
4680: 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64  )sizeof(Lookasid
4690: 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70  eSlot*) );.    p
46a0: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
46b0: 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66  t*)pStart;.    f
46c0: 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30  or(i=cnt-1; i>=0
46d0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
46e0: 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f  >pNext = db->loo
46f0: 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20  kaside.pFree;.  
4700: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4710: 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20  e.pFree = p;.   
4720: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
4730: 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29  eSlot*)&((u8*)p)
4740: 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [sz];.    }.    
4750: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
4760: 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e  nd = p;.    db->
4770: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
4780: 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e  ed = 1;.    db->
4790: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
47a0: 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31  ced = pBuf==0 ?1
47b0: 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  :0;.  }else{.   
47c0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
47d0: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  End = 0;.    db-
47e0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
47f0: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  led = 0;.    db-
4800: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
4810: 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oced = 0;.  }.  
4820: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4840: 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  n the mutex asso
4850: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
4860: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
4870: 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75  n..*/.sqlite3_mu
4880: 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f  tex *sqlite3_db_
4890: 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64  mutex(sqlite3 *d
48a0: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
48b0: 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >mutex;.}../*.**
48c0: 20 46 72 65 65 20 75 70 20 61 73 20 6d 75 63 68   Free up as much
48d0: 20 6d 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61   memory as we ca
48e0: 6e 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  n from the given
48f0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
4900: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  nection..*/.int 
4910: 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61  sqlite3_db_relea
4920: 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65  se_memory(sqlite
4930: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
4940: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4950: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
4960: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
4970: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
4980: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4990: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
49a0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
49b0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
49c0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
49d0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
49e0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
49f0: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  er(pBt);.      s
4a00: 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
4a10: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
4a20: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
4a30: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
4a40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4a50: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
4a60: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
4a70: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4a80: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
4a90: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
4aa0: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
4ab0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
4ac0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
4ad0: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
4ae0: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
4af0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
4b00: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
4b10: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
4b20: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
4b30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
4b40: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
4b50: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
4b60: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
4b70: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
4b80: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
4b90: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
4ba0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4bb0: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
4bc0: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
4bd0: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
4be0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
4bf0: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
4c00: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
4c10: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
4c20: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
4c30: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
4c40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4c50: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
4c60: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
4c70: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
4c80: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
4c90: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
4ca0: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
4cb0: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
4cc0: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
4cd0: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
4ce0: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
4cf0: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
4d00: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
4d10: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
4d20: 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54  E_FKEY,    SQLIT
4d30: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20  E_ForeignKeys   
4d40: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
4d50: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
4d60: 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51  ABLE_TRIGGER, SQ
4d70: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
4d80: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  er  },.      };.
4d90: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
4da0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
4db0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
4dc0: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
4dd0: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
4de0: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
4df0: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
4e00: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
4e10: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
4e20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
4e30: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
4e40: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
4e50: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
4e60: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
4e70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
4e80: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
4e90: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
4ea0: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
4eb0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
4ec0: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
4ed0: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
4ee0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
4ef0: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
4f00: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
4f10: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
4f20: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
4f30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
4f40: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
4f50: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
4f60: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
4f70: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
4f80: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
4f90: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
4fa0: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20   pRes ){.       
4fb0: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62       *pRes = (db
4fc0: 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f  ->flags & aFlagO
4fd0: 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20  p[i].mask)!=0;. 
4fe0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
4ff0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5000: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  _OK;.          b
5010: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5020: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5030: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
5040: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
5050: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
5060: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
5070: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
5080: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
5090: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
50a0: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
50b0: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
50c0: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
50d0: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
50e0: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
50f0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
5100: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
5110: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
5120: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
5130: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
5140: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
5150: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
5160: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
5170: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
5180: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
5190: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
51a0: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
51b0: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
51c0: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
51d0: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
51e0: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
51f0: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
5200: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
5210: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
5220: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
5230: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
5240: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
5250: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
5260: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
5270: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
5280: 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d  y2;.  rc = memcm
5290: 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
52a0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
52b0: 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c  ){.    if( padFl
52c0: 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  ag.     && allSp
52d0: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
52e0: 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a  y1)+n, nKey1-n).
52f0: 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65       && allSpace
5300: 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29  s(((char*)pKey2)
5310: 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20  +n, nKey2-n).   
5320: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61   ){.      /* Lea
5330: 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20  ve rc unchanged 
5340: 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  at 0 */.    }els
5350: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b  e{.      rc = nK
5360: 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20  ey1 - nKey2;.   
5370: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
5380: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  rc;.}../*.** Ano
5390: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
53a0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
53b0: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
53c0: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
53d0: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
53e0: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
53f0: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
5400: 6e 64 61 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndant.** compari
5410: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
5420: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
5430: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
5440: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
5450: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
5460: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
5470: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
5480: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
5490: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
54a0: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
54b0: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
54c0: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
54d0: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
54e0: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
54f0: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
5500: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
5510: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
5520: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
5530: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
5540: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
5550: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
5560: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
5570: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
5580: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
5590: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
55a0: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
55b0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
55c0: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
55d0: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
55e0: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
55f0: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
5600: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
5610: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
5620: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
5630: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
5640: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
5650: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
5660: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
5670: 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  lastRowid;.}../*
5680: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5690: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
56a0: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
56b0: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
56c0: 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69  te3_exec()..*/.i
56d0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  nt sqlite3_chang
56e0: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
56f0: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
5700: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5710: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5720: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
5730: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
5740: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
5750: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5760: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
5770: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
5780: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61  return db->nTota
5790: 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  lChange;.}../*.*
57a0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e  * Close all open
57b0: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69   savepoints. Thi
57c0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
57d0: 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c  manipulates fiel
57e0: 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ds of the.** dat
57f0: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a  abase handle obj
5800: 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  ect, it does not
5810: 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70   close any savep
5820: 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62  oints that may b
5830: 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65  e open.** at the
5840: 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65   b-tree/pager le
5850: 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  vel..*/.void sql
5860: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
5870: 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
5880: 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70  {.  while( db->p
5890: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
58a0: 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
58b0: 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
58c0: 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65  t;.    db->pSave
58d0: 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e  point = pTmp->pN
58e0: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
58f0: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
5900: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76  ;.  }.  db->nSav
5910: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62  epoint = 0;.  db
5920: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
5930: 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61  ;.  db->isTransa
5940: 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
5950: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
5960: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
5970: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f  or function asso
5980: 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63  ciated with Func
5990: 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45  Def p, if any. E
59a0: 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69  xcept,.** if thi
59b0: 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  s is not the las
59c0: 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75  t copy of the fu
59d0: 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69  nction, do not i
59e0: 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70  nvoke it. Multip
59f0: 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20  le.** copies of 
5a00: 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f  a single functio
5a10: 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68  n are created wh
5a20: 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69  en create_functi
5a30: 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a  on() is called.*
5a40: 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e  * with SQLITE_AN
5a50: 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  Y as the encodin
5a60: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
5a70: 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f  d functionDestro
5a80: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  y(sqlite3 *db, F
5a90: 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75  uncDef *p){.  Fu
5aa0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
5ab0: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70  estructor = p->p
5ac0: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66  Destructor;.  if
5ad0: 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ( pDestructor ){
5ae0: 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72  .    pDestructor
5af0: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
5b00: 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e  ( pDestructor->n
5b10: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
5b20: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65  pDestructor->xDe
5b30: 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f  stroy(pDestructo
5b40: 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20  r->pUserData);. 
5b50: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
5b60: 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63 74  ee(db, pDestruct
5b70: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  or);.    }.  }.}
5b80: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65  ../*.** Disconne
5b90: 63 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76  ct all sqlite3_v
5ba0: 74 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74  tab objects that
5bb0: 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62   belong to datab
5bc0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
5bd0: 2a 20 64 62 2e 20 54 68 69 73 20 69 73 20 63 61  * db. This is ca
5be0: 6c 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73 20  lled when db is 
5bf0: 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f  being closed..*/
5c00: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
5c10: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73  connectAllVtab(s
5c20: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
5c30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
5c40: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
5c50: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
5c60: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
5c70: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
5c80: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
5c90: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
5ca0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ma = db->aDb[i].
5cb0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28  pSchema;.    if(
5cc0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68   db->aDb[i].pSch
5cd0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73  ema ){.      Has
5ce0: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20  hElem *p;.      
5cf0: 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68  for(p=sqliteHash
5d00: 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e  First(&pSchema->
5d10: 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73  tblHash); p; p=s
5d20: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29  qliteHashNext(p)
5d30: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
5d40: 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20   *pTab = (Table 
5d50: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
5d60: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
5d70: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
5d80: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 44 69   ) sqlite3VtabDi
5d90: 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61  sconnect(db, pTa
5da0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
5db0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
5dc0: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
5dd0: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
5de0: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
5df0: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
5e00: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 64  Return TRUE if d
5e10: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5e20: 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61  on db has unfina
5e30: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
5e40: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
5e50: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
5e60: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
5e70: 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s.  .*/.static i
5e80: 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  nt connectionIsB
5e90: 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29  usy(sqlite3 *db)
5ea0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
5eb0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
5ec0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
5ed0: 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  x) );.  if( db->
5ee0: 70 56 64 62 65 20 29 20 72 65 74 75 72 6e 20 31  pVdbe ) return 1
5ef0: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  ;.  for(j=0; j<d
5f00: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
5f10: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
5f20: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20  b->aDb[j].pBt;. 
5f30: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
5f40: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61  lite3BtreeIsInBa
5f50: 63 6b 75 70 28 70 42 74 29 20 29 20 72 65 74 75  ckup(pBt) ) retu
5f60: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
5f70: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
5f80: 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  lose an existing
5f90: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
5fa0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
5fb0: 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69  qlite3Close(sqli
5fc0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72  te3 *db, int for
5fd0: 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28  ceZombie){.  if(
5fe0: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
5ff0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6000: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
6010: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
6020: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
6030: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
6040: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
6050: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6060: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
6070: 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73  .  /* Force xDis
6080: 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e  connect calls on
6090: 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62   all virtual tab
60a0: 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e  les */.  disconn
60b0: 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a  ectAllVtab(db);.
60c0: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
60d0: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
60e0: 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  the disconnectAl
60f0: 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f  lVtab() call abo
6100: 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ve.  ** will not
6110: 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65   have called the
6120: 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d   xDisconnect() m
6130: 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72  ethod on any vir
6140: 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73  tual.  ** tables
6150: 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72   in the db->aVTr
6160: 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65  ans[] array. The
6170: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
6180: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29  e3VtabRollback()
6190: 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20  .  ** call will 
61a0: 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74  do so. We need t
61b0: 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65  o do this before
61c0: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
61d0: 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73  ctive.  ** SQL s
61e0: 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c  tatements below,
61f0: 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20   as the v-table 
6200: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
6210: 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20  ay be storing.  
6220: 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64  ** some prepared
6230: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65   statements inte
6240: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73  rnally..  */.  s
6250: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
6260: 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65  ck(db);..  /* Le
6270: 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28 73  gacy behavior (s
6280: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62  qlite3_close() b
6290: 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72  ehavior) is to r
62a0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
62b0: 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63 6f  E_BUSY if the co
62c0: 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74  nnection can not
62d0: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
62e0: 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  iately..  */.  i
62f0: 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20  f( !forceZombie 
6300: 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  && connectionIsB
6310: 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73  usy(db) ){.    s
6320: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
6330: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e  SQLITE_BUSY, "un
6340: 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75  able to close du
6350: 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64  e to unfinalized
6360: 20 22 0a 20 20 20 20 20 20 20 22 73 74 61 74 65   ".       "state
6370: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
6380: 68 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20  hed backups");. 
6390: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
63a0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
63b0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
63c0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
63d0: 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65    /* Convert the
63e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f   connection into
63f0: 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68   a zombie and th
6400: 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a  en close it..  *
6410: 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  /.  db->magic = 
6420: 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d  SQLITE_MAGIC_ZOM
6430: 42 49 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65  BIE;.  sqlite3Le
6440: 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65  aveMutexAndClose
6450: 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65  Zombie(db);.  re
6460: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6470: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72  }../*.** Two var
6480: 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70  iations on the p
6490: 75 62 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20  ublic interface 
64a0: 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61  for closing a da
64b0: 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63  tabase.** connec
64c0: 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65  tion. The sqlite
64d0: 33 5f 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f  3_close() versio
64e0: 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  n returns SQLITE
64f0: 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61  _BUSY and.** lea
6500: 76 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69  ves the connecti
6510: 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65  on option if the
6520: 72 65 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a  re are unfinaliz
6530: 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73  ed prepared.** s
6540: 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66  tatements or unf
6550: 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f  inished sqlite3_
6560: 62 61 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71  backups.  The sq
6570: 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29  lite3_close_v2()
6580: 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63  .** version forc
6590: 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  es the connectio
65a0: 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f  n to become a zo
65b0: 6d 62 69 65 20 69 66 20 74 68 65 72 65 20 61 72  mbie if there ar
65c0: 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65  e.** unclosed re
65d0: 73 6f 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72  sources, and arr
65e0: 61 6e 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f  anges for deallo
65f0: 63 61 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20  cation when the 
6600: 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20  last.** prepare 
6610: 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c  statement or sql
6620: 69 74 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73  ite3_backup clos
6630: 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  es..*/.int sqlit
6640: 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33  e3_close(sqlite3
6650: 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71   *db){ return sq
6660: 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29  lite3Close(db,0)
6670: 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  ; }.int sqlite3_
6680: 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33  close_v2(sqlite3
6690: 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71   *db){ return sq
66a0: 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29  lite3Close(db,1)
66b0: 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73  ; }.../*.** Clos
66c0: 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64  e the mutex on d
66d0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
66e0: 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72  on db..**.** Fur
66f0: 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74  thermore, if dat
6700: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6710: 20 64 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20   db is a zombie 
6720: 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68  (meaning that th
6730: 65 72 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20  ere.** has been 
6740: 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20  a prior call to 
6750: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62  sqlite3_close(db
6760: 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f  ) or sqlite3_clo
6770: 73 65 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a  se_v2(db)) and.*
6780: 2a 20 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f  * every sqlite3_
6790: 73 74 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65  stmt has now bee
67a0: 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20  n finalized and 
67b0: 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61  every sqlite3_ba
67c0: 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69  ckup has.** fini
67d0: 73 68 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20  shed, then free 
67e0: 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  all resources..*
67f0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65  /.void sqlite3Le
6800: 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65  aveMutexAndClose
6810: 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a  Zombie(sqlite3 *
6820: 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20  db){.  HashElem 
6830: 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  *i;             
6840: 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74         /* Hash t
6850: 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f  able iterator */
6860: 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20  .  int j;..  /* 
6870: 49 66 20 74 68 65 72 65 20 61 72 65 20 6f 75 74  If there are out
6880: 73 74 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33  standing sqlite3
6890: 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33  _stmt or sqlite3
68a0: 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a  _backup objects.
68b0: 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63    ** or if the c
68c0: 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f  onnection has no
68d0: 74 20 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65  t yet been close
68e0: 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f  d by sqlite3_clo
68f0: 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68  se_v2(),.  ** th
6900: 65 6e 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68  en just leave th
6910: 65 20 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75  e mutex and retu
6920: 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64  rn..  */.  if( d
6930: 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45  b->magic!=SQLITE
6940: 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c  _MAGIC_ZOMBIE ||
6950: 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73   connectionIsBus
6960: 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c  y(db) ){.    sql
6970: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6980: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20  (db->mutex);.   
6990: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20   return;.  }..  
69a0: 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68 20 74  /* If we reach t
69b0: 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65  his point, it me
69c0: 61 6e 73 20 74 68 61 74 20 74 68 65 20 64 61 74  ans that the dat
69d0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
69e0: 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64   has.  ** closed
69f0: 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d   all sqlite3_stm
6a00: 74 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61  t and sqlite3_ba
6a10: 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64  ckup objects and
6a20: 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70   has been.  ** p
6a30: 61 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f  ased to sqlite3_
6a40: 63 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74  close (meaning t
6a50: 68 61 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62  hat it is a zomb
6a60: 69 65 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c  ie).  Therefore,
6a70: 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61  .  ** go ahead a
6a80: 6e 64 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f  nd free all reso
6a90: 75 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f  urces..  */..  /
6aa0: 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74  * Free any outst
6ab0: 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74  anding Savepoint
6ac0: 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a   structures. */.
6ad0: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
6ae0: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20  vepoints(db);.. 
6af0: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61   /* Close all da
6b00: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
6b10: 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b  ns */.  for(j=0;
6b20: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
6b30: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
6b40: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
6b50: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  j];.    if( pDb-
6b60: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71  >pBt ){.      sq
6b70: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
6b80: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
6b90: 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20   pDb->pBt = 0;. 
6ba0: 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b       if( j!=1 ){
6bb0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53  .        pDb->pS
6bc0: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
6bd0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
6be0: 2a 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50  * Clear the TEMP
6bf0: 20 73 63 68 65 6d 61 20 73 65 70 61 72 61 74 65   schema separate
6c00: 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20  ly and last */. 
6c10: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
6c20: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73  pSchema ){.    s
6c30: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
6c40: 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  r(db->aDb[1].pSc
6c50: 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  hema);.  }.  sql
6c60: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
6c70: 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72  st(db);..  /* Fr
6c80: 65 65 20 75 70 20 74 68 65 20 61 72 72 61 79 20  ee up the array 
6c90: 6f 66 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  of auxiliary dat
6ca0: 61 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69  abases */.  sqli
6cb0: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
6cc0: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20  aseArray(db);.  
6cd0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
6ce0: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
6cf0: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
6d00: 53 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20  Static );..  /* 
6d10: 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e  Tell the code in
6d20: 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74   notify.c that t
6d30: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f  he connection no
6d40: 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e   longer holds an
6d50: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64  y.  ** locks and
6d60: 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
6d70: 65 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e  e any further un
6d80: 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
6d90: 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  backs..  */.  sq
6da0: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43  lite3ConnectionC
6db0: 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f  losed(db);..  fo
6dc0: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
6dd0: 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b  ze(db->aFunc.a);
6de0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44   j++){.    FuncD
6df0: 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73  ef *pNext, *pHas
6e00: 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  h, *p;.    for(p
6e10: 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b  =db->aFunc.a[j];
6e20: 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20   p; p=pHash){.  
6e30: 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70      pHash = p->p
6e40: 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c  Hash;.      whil
6e50: 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e( p ){.        
6e60: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
6e70: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
6e80: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
6e90: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
6ea0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
6eb0: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
6ec0: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
6ed0: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c  .  }.  for(i=sql
6ee0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
6ef0: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20  ->aCollSeq); i; 
6f00: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
6f10: 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  (i)){.    CollSe
6f20: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
6f30: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
6f40: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20  Data(i);.    /* 
6f50: 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72  Invoke any destr
6f60: 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65  uctors registere
6f70: 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20  d for collation 
6f80: 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61  sequence user da
6f90: 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ta. */.    for(j
6fa0: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
6fb0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a       if( pColl[j
6fc0: 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ].xDel ){.      
6fd0: 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28    pColl[j].xDel(
6fe0: 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b  pColl[j].pUser);
6ff0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7000: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7010: 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, pColl);.  }
7020: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
7030: 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ear(&db->aCollSe
7040: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
7050: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
7060: 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ABLE.  for(i=sql
7070: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
7080: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69  ->aModule); i; i
7090: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
70a0: 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  i)){.    Module 
70b0: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
70c0: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
70d0: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (i);.    if( pMo
70e0: 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  d->xDestroy ){. 
70f0: 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74       pMod->xDest
7100: 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b  roy(pMod->pAux);
7110: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7120: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f  e3DbFree(db, pMo
7130: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
7140: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
7150: 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
7160: 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
7170: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
7180: 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  0); /* Deallocat
7190: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
71a0: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
71b0: 20 20 69 66 28 20 64 62 2d 3e 70 45 72 72 20 29    if( db->pErr )
71c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 61 6c  {.    sqlite3Val
71d0: 75 65 46 72 65 65 28 64 62 2d 3e 70 45 72 72 29  ueFree(db->pErr)
71e0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 43  ;.  }.  sqlite3C
71f0: 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e 73 28 64  loseExtensions(d
7200: 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63  b);..  db->magic
7210: 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f   = SQLITE_MAGIC_
7220: 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65  ERROR;..  /* The
7230: 20 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73   temp-database s
7240: 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74  chema is allocat
7250: 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66  ed differently f
7260: 72 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63  rom the other sc
7270: 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74  hema.  ** object
7280: 73 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d  s (using sqliteM
7290: 61 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79  alloc() directly
72a0: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c  , instead of sql
72b0: 69 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28  ite3BtreeSchema(
72c0: 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e  ))..  ** So it n
72d0: 65 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64  eeds to be freed
72e0: 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79   here. Todo: Why
72f0: 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65   not roll the te
7300: 6d 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20  mp schema into. 
7310: 20 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c   ** the same sql
7320: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74  iteMalloc() as t
7330: 68 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f  he one that allo
7340: 63 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61  cates the databa
7350: 73 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75  se .  ** structu
7360: 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  re?.  */.  sqlit
7370: 65 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d  e3DbFree(db, db-
7380: 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29  >aDb[1].pSchema)
7390: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
73a0: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
73b0: 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  x);.  db->magic 
73c0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43  = SQLITE_MAGIC_C
73d0: 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33  LOSED;.  sqlite3
73e0: 5f 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e  _mutex_free(db->
73f0: 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
7400: 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e  ( db->lookaside.
7410: 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46  nOut==0 );  /* F
7420: 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73  ails on a lookas
7430: 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20  ide memory leak 
7440: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  */.  if( db->loo
7450: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
7460: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
7470: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
7480: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
7490: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
74a0: 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  b);.}../*.** Rol
74b0: 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61  lback all databa
74c0: 73 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72  se files.  If tr
74d0: 69 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51  ipCode is not SQ
74e0: 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a  LITE_OK, then.**
74f0: 20 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72   any open cursor
7500: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
7510: 64 20 28 22 74 72 69 70 70 65 64 22 20 2d 20 61  d ("tripped" - a
7520: 73 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61  s in "tripping a
7530: 20 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61   circuit.** brea
7540: 6b 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74  ker") and made t
7550: 6f 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64  o return tripCod
7560: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61  e if there are a
7570: 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74  ny further.** at
7580: 74 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68  tempts to use th
7590: 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f  at cursor..*/.vo
75a0: 69 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61  id sqlite3Rollba
75b0: 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64  ckAll(sqlite3 *d
75c0: 62 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29  b, int tripCode)
75d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  {.  int i;.  int
75e0: 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20   inTrans = 0;.  
75f0: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
7600: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
7610: 75 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74  utex) );.  sqlit
7620: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
7630: 6c 6f 63 28 29 3b 0a 20 20 66 6f 72 28 69 3d 30  loc();.  for(i=0
7640: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
7650: 29 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20  ){.    Btree *p 
7660: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  = db->aDb[i].pBt
7670: 3b 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20  ;.    if( p ){. 
7680: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7690: 42 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70  BtreeIsInTrans(p
76a0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54  ) ){.        inT
76b0: 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  rans = 1;.      
76c0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42  }.      sqlite3B
76d0: 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20  treeRollback(p, 
76e0: 74 72 69 70 43 6f 64 65 29 3b 0a 20 20 20 20 20  tripCode);.     
76f0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 69 6e 54 72   db->aDb[i].inTr
7700: 61 6e 73 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ans = 0;.    }. 
7710: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
7720: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20  Rollback(db);.  
7730: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
7740: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28  Malloc();..  if(
7750: 20 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   db->flags&SQLIT
7760: 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73 20  E_InternChanges 
7770: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
7780: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
7790: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
77a0: 73 71 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53  sqlite3ResetAllS
77b0: 63 68 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69  chemasOfConnecti
77c0: 6f 6e 28 64 62 29 3b 0a 20 20 7d 0a 0a 20 20 2f  on(db);.  }..  /
77d0: 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20 63  * Any deferred c
77e0: 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74  onstraint violat
77f0: 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62 65  ions have now be
7800: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f 0a  en resolved. */.
7810: 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 43    db->nDeferredC
7820: 6f 6e 73 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  ons = 0;..  /* I
7830: 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63  f one has been c
7840: 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b  onfigured, invok
7850: 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68  e the rollback-h
7860: 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a  ook callback */.
7870: 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62    if( db->xRollb
7880: 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28  ackCallback && (
7890: 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e  inTrans || !db->
78a0: 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20  autoCommit) ){. 
78b0: 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b     db->xRollback
78c0: 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f  Callback(db->pRo
78d0: 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a  llbackArg);.  }.
78e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
78f0: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
7900: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
7910: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
7920: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
7930: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  e.** argument..*
7940: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
7950: 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20  lite3ErrStr(int 
7960: 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rc){.  static co
7970: 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20  nst char* const 
7980: 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  aMsg[] = {.    /
7990: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20  * SQLITE_OK     
79a0: 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20       */ "not an 
79b0: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
79c0: 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20  QLITE_ERROR     
79d0: 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20    */ "SQL logic 
79e0: 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67  error or missing
79f0: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
7a00: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  /* SQLITE_INTERN
7a10: 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  AL    */ 0,.    
7a20: 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20  /* SQLITE_PERM  
7a30: 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73        */ "access
7a40: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
7a50: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
7a60: 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a  TE_ABORT       *
7a70: 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75  / "callback requ
7a80: 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f 72  ested query abor
7a90: 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  t",.    /* SQLIT
7aa0: 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f  E_BUSY        */
7ab0: 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   "database is lo
7ac0: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
7ad0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  LITE_LOCKED     
7ae0: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61   */ "database ta
7af0: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ble is locked",.
7b00: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
7b10: 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75  MEM       */ "ou
7b20: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20  t of memory",.  
7b30: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44    /* SQLITE_READ
7b40: 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65  ONLY    */ "atte
7b50: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
7b60: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
7b70: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
7b80: 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20  _INTERRUPT   */ 
7b90: 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20  "interrupted",. 
7ba0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45     /* SQLITE_IOE
7bb0: 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73  RR       */ "dis
7bc0: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20  k I/O error",.  
7bd0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52    /* SQLITE_CORR
7be0: 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61  UPT     */ "data
7bf0: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
7c00: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20  is malformed",. 
7c10: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
7c20: 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b  FOUND    */ "unk
7c30: 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c  nown operation",
7c40: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
7c50: 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64  ULL        */ "d
7c60: 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20  atabase or disk 
7c70: 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a  is full",.    /*
7c80: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
7c90: 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74      */ "unable t
7ca0: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
7cb0: 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  file",.    /* SQ
7cc0: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20  LITE_PROTOCOL   
7cd0: 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f   */ "locking pro
7ce0: 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53  tocol",.    /* S
7cf0: 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20  QLITE_EMPTY     
7d00: 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74    */ "table cont
7d10: 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20  ains no data",. 
7d20: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48     /* SQLITE_SCH
7d30: 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74  EMA      */ "dat
7d40: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
7d50: 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f   changed",.    /
7d60: 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  * SQLITE_TOOBIG 
7d70: 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20       */ "string 
7d80: 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22  or blob too big"
7d90: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
7da0: 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22  CONSTRAINT  */ "
7db0: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
7dc0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
7dd0: 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f  E_MISMATCH    */
7de0: 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61   "datatype misma
7df0: 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  tch",.    /* SQL
7e00: 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20  ITE_MISUSE      
7e10: 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74  */ "library rout
7e20: 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f  ine called out o
7e30: 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20  f sequence",.   
7e40: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   /* SQLITE_NOLFS
7e50: 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65         */ "large
7e60: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73   file support is
7e70: 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20   disabled",.    
7e80: 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20  /* SQLITE_AUTH  
7e90: 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72        */ "author
7ea0: 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c  ization denied",
7eb0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
7ec0: 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61  ORMAT      */ "a
7ed0: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
7ee0: 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c  e format error",
7ef0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
7f00: 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62  ANGE       */ "b
7f10: 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e  ind or column in
7f20: 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dex out of range
7f30: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
7f40: 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20  _NOTADB      */ 
7f50: 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74  "file is encrypt
7f60: 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64  ed or is not a d
7f70: 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20  atabase",.  };. 
7f80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
7f90: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  r = "unknown err
7fa0: 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72  or";.  switch( r
7fb0: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
7fc0: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
7fd0: 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ACK: {.      zEr
7fe0: 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74  r = "abort due t
7ff0: 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20  o ROLLBACK";.   
8000: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8010: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
8020: 20 20 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b       rc &= 0xff;
8030: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
8040: 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41  S(rc>=0) && rc<A
8050: 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26  rraySize(aMsg) &
8060: 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b  & aMsg[rc]!=0 ){
8070: 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
8080: 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20  aMsg[rc];.      
8090: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
80a0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
80b0: 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zErr;.}../*.**
80c0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
80d0: 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20  plements a busy 
80e0: 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c  callback that sl
80f0: 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a  eeps and tries.*
8100: 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20  * again until a 
8110: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
8120: 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74   reached.  The t
8130: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a  imeout value is.
8140: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  ** an integer nu
8150: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
8160: 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61  onds passed in a
8170: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
8180: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
8190: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66  ic int sqliteDef
81a0: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
81b0: 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20  (. void *ptr,   
81c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
81d0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
81e0: 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74  on */. int count
81f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8200: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
8210: 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65  es table has bee
8220: 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66  n busy */.){.#if
8230: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c   SQLITE_OS_WIN |
8240: 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f  | (defined(HAVE_
8250: 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
8260: 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63  USLEEP).  static
8270: 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73   const u8 delays
8280: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32  [] =.     { 1, 2
8290: 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c  , 5, 10, 15, 20,
82a0: 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35   25, 25,  25,  5
82b0: 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20  0,  50, 100 };. 
82c0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
82d0: 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20   totals[] =.    
82e0: 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20   { 0, 1, 3,  8, 
82f0: 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20  18, 33, 53, 78, 
8300: 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32  103, 128, 178, 2
8310: 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e  28 };.# define N
8320: 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28  DELAY ArraySize(
8330: 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65  delays).  sqlite
8340: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
8350: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
8360: 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79  meout = db->busy
8370: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64  Timeout;.  int d
8380: 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20  elay, prior;..  
8390: 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30  assert( count>=0
83a0: 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20   );.  if( count 
83b0: 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20  < NDELAY ){.    
83c0: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63  delay = delays[c
83d0: 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72  ount];.    prior
83e0: 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d   = totals[count]
83f0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
8400: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44  elay = delays[ND
8410: 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69  ELAY-1];.    pri
8420: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c  or = totals[NDEL
8430: 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63  AY-1] + delay*(c
8440: 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29  ount-(NDELAY-1))
8450: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f  ;.  }.  if( prio
8460: 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65  r + delay > time
8470: 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  out ){.    delay
8480: 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69   = timeout - pri
8490: 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61  or;.    if( dela
84a0: 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y<=0 ) return 0;
84b0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
84c0: 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20  Sleep(db->pVfs, 
84d0: 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72  delay*1000);.  r
84e0: 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20  eturn 1;.#else. 
84f0: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
8500: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
8510: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28   int timeout = (
8520: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d  (sqlite3 *)ptr)-
8530: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
8540: 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30  if( (count+1)*10
8550: 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  00 > timeout ){.
8560: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8570: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
8580: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30  ep(db->pVfs, 100
8590: 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0000);.  return 
85a0: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
85b0: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
85c0: 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ven busy handler
85d0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
85e0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
85f0: 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  hen an operation
8600: 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c   failed with a l
8610: 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20  ock..** If this 
8620: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
8630: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
8640: 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20  ck is retried.  
8650: 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73  If it.** returns
8660: 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f   0, the operatio
8670: 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e  n aborts with an
8680: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
8690: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
86a0: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
86b0: 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20  ler(BusyHandler 
86c0: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
86d0: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
86e0: 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20   || p->xFunc==0 
86f0: 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20  || p->nBusy<0 ) 
8700: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
8710: 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72   p->xFunc(p->pAr
8720: 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20  g, p->nBusy);.  
8730: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
8740: 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a   p->nBusy = -1;.
8750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
8760: 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72  nBusy++;.  }.  r
8770: 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a  eturn rc; .}../*
8780: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8790: 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63   sets the busy c
87a0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
87b0: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
87c0: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
87d0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
87e0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
87f0: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
8800: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
8810: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
8820: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42   *db,.  int (*xB
8830: 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c  usy)(void*,int),
8840: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
8850: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
8860: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
8870: 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  );.  db->busyHan
8880: 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75  dler.xFunc = xBu
8890: 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  sy;.  db->busyHa
88a0: 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72  ndler.pArg = pAr
88b0: 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  g;.  db->busyHan
88c0: 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
88d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
88e0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
88f0: 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
8900: 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  E_OK;.}..#ifndef
8910: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f   SQLITE_OMIT_PRO
8920: 47 52 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f  GRESS_CALLBACK./
8930: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
8940: 65 20 73 65 74 73 20 74 68 65 20 70 72 6f 67 72  e sets the progr
8950: 65 73 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  ess callback for
8960: 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62   an Sqlite datab
8970: 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69  ase to the.** gi
8980: 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e  ven callback fun
8990: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67  ction with the g
89a0: 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54  iven argument. T
89b0: 68 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c  he progress call
89c0: 62 61 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20  back will.** be 
89d0: 69 6e 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f  invoked every nO
89e0: 70 73 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76  ps opcodes..*/.v
89f0: 6f 69 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67  oid sqlite3_prog
8a00: 72 65 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20  ress_handler(.  
8a10: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
8a20: 69 6e 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20  int nOps,.  int 
8a30: 28 2a 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69  (*xProgress)(voi
8a40: 64 2a 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41  d*), .  void *pA
8a50: 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  rg.){.  sqlite3_
8a60: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
8a70: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f  mutex);.  if( nO
8a80: 70 73 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e  ps>0 ){.    db->
8a90: 78 50 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f  xProgress = xPro
8aa0: 67 72 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e  gress;.    db->n
8ab0: 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 6e 4f  ProgressOps = nO
8ac0: 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f  ps;.    db->pPro
8ad0: 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b  gressArg = pArg;
8ae0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
8af0: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->xProgress = 0;
8b00: 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65  .    db->nProgre
8b10: 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64  ssOps = 0;.    d
8b20: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
8b30: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
8b40: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
8b50: 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e  b->mutex);.}.#en
8b60: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
8b70: 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c   routine install
8b80: 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79  s a default busy
8b90: 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61   handler that wa
8ba0: 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  its for the.** s
8bb0: 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20  pecified number 
8bc0: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
8bd0: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
8be0: 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
8bf0: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
8c00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
8c10: 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30   ms){.  if( ms>0
8c20: 20 29 7b 0a 20 20 20 20 64 62 2d 3e 62 75 73 79   ){.    db->busy
8c30: 54 69 6d 65 6f 75 74 20 3d 20 6d 73 3b 0a 20 20  Timeout = ms;.  
8c40: 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68    sqlite3_busy_h
8c50: 61 6e 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74  andler(db, sqlit
8c60: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
8c70: 62 61 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29  back, (void*)db)
8c80: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
8c90: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d  b->busyTimeout =
8ca0: 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   0;.    sqlite3_
8cb0: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c  busy_handler(db,
8cc0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65   0, 0);.  }.  re
8cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8ce0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61  }../*.** Cause a
8cf0: 6e 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61  ny pending opera
8d00: 74 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20  tion to stop at 
8d10: 69 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70  its earliest opp
8d20: 6f 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69  ortunity..*/.voi
8d30: 64 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  d sqlite3_interr
8d40: 75 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29  upt(sqlite3 *db)
8d50: 7b 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74  {.  db->u1.isInt
8d60: 65 72 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a  errupted = 1;.}.
8d70: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
8d80: 63 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79  ction is exactly
8d90: 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c   the same as sql
8da0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
8db0: 74 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a  tion(), except.*
8dc0: 2a 20 74 68 61 74 20 69 74 20 69 73 20 64 65 73  * that it is des
8dd0: 69 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c  igned to be call
8de0: 65 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63  ed by internal c
8df0: 6f 64 65 2e 20 54 68 65 20 64 69 66 66 65 72 65  ode. The differe
8e00: 6e 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69  nce is.** that i
8e10: 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  f a malloc() fai
8e20: 6c 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72  ls in sqlite3_cr
8e30: 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c  eate_function(),
8e40: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a   an error code.*
8e50: 2a 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  * is returned an
8e60: 64 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c  d the mallocFail
8e70: 65 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e  ed flag cleared.
8e80: 20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33   .*/.int sqlite3
8e90: 43 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71  CreateFunc(.  sq
8ea0: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
8eb0: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69  st char *zFuncti
8ec0: 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41  onName,.  int nA
8ed0: 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20  rg,.  int enc,. 
8ee0: 20 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61   void *pUserData
8ef0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63  ,.  void (*xFunc
8f00: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
8f10: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
8f20: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
8f30: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
8f40: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
8f50: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
8f60: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
8f70: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
8f80: 78 74 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74  xt*),.  FuncDest
8f90: 72 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63  ructor *pDestruc
8fa0: 74 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66  tor.){.  FuncDef
8fb0: 20 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65   *p;.  int nName
8fc0: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c  ;..  assert( sql
8fd0: 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28  ite3_mutex_held(
8fe0: 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20  db->mutex) );.  
8ff0: 69 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  if( zFunctionNam
9000: 65 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78  e==0 ||.      (x
9010: 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20  Func && (xFinal 
9020: 7c 7c 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20  || xStep)) || . 
9030: 20 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20       (!xFunc && 
9040: 28 78 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65  (xFinal && !xSte
9050: 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78  p)) ||.      (!x
9060: 46 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c  Func && (!xFinal
9070: 20 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20   && xStep)) ||. 
9080: 20 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c       (nArg<-1 ||
9090: 20 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58   nArg>SQLITE_MAX
90a0: 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c  _FUNCTION_ARG) |
90b0: 7c 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e  |.      (255<(nN
90c0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
90d0: 6c 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e  len30( zFunction
90e0: 4e 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72  Name))) ){.    r
90f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
9100: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
9110: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
9120: 4f 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20  OMIT_UTF16.  /* 
9130: 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
9140: 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
9150: 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
9160: 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
9170: 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
9180: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
9190: 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
91a0: 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
91b0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
91c0: 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
91d0: 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
91e0: 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
91f0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c    **.  ** If SQL
9200: 49 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69  ITE_ANY is speci
9210: 66 69 65 64 2c 20 61 64 64 20 74 68 72 65 65 20  fied, add three 
9220: 76 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  versions of the 
9230: 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f  function.  ** to
9240: 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e   the hash table.
9250: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d  .  */.  if( enc=
9260: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b  =SQLITE_UTF16 ){
9270: 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  .    enc = SQLIT
9280: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20  E_UTF16NATIVE;. 
9290: 20 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d   }else if( enc==
92a0: 53 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20  SQLITE_ANY ){.  
92b0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63    int rc;.    rc
92c0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
92d0: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69  Func(db, zFuncti
92e0: 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51  onName, nArg, SQ
92f0: 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20  LITE_UTF8,.     
9300: 20 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78      pUserData, x
9310: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
9320: 6e 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72  nal, pDestructor
9330: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
9340: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
9350: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72    rc = sqlite3Cr
9360: 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75  eateFunc(db, zFu
9370: 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67  nctionName, nArg
9380: 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  , SQLITE_UTF16LE
9390: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65  ,.          pUse
93a0: 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53  rData, xFunc, xS
93b0: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65  tep, xFinal, pDe
93c0: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
93d0: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
93e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
93f0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
9400: 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  .    enc = SQLIT
9410: 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23  E_UTF16BE;.  }.#
9420: 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c  else.  enc = SQL
9430: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66  ITE_UTF8;.#endif
9440: 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
9450: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75  f an existing fu
9460: 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
9470: 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65  overridden or de
9480: 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20  leted. If so,.  
9490: 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
94a0: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65   active VMs, the
94b0: 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
94c0: 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74  BUSY. If a funct
94d0: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ion.  ** is bein
94e0: 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c  g overridden/del
94f0: 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61  eted but there a
9500: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
9510: 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a  , allow the.  **
9520: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f   operation to co
9530: 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c  ntinue but inval
9540: 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d  idate all precom
9550: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
9560: 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
9570: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
9580: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
9590: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
95a0: 20 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20   (u8)enc, 0);.  
95b0: 69 66 28 20 70 20 26 26 20 70 2d 3e 69 50 72 65  if( p && p->iPre
95c0: 66 45 6e 63 3d 3d 65 6e 63 20 26 26 20 70 2d 3e  fEnc==enc && p->
95d0: 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20  nArg==nArg ){.  
95e0: 20 20 69 66 28 20 64 62 2d 3e 61 63 74 69 76 65    if( db->active
95f0: 56 64 62 65 43 6e 74 20 29 7b 0a 20 20 20 20 20  VdbeCnt ){.     
9600: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
9610: 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a  , SQLITE_BUSY, .
9620: 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20          "unable 
9630: 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79  to delete/modify
9640: 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64   user-function d
9650: 75 65 20 74 6f 20 61 63 74 69 76 65 20 73 74 61  ue to active sta
9660: 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20  tements");.     
9670: 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
9680: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
9690: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
96a0: 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73  E_BUSY;.    }els
96b0: 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
96c0: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
96d0: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20  atements(db);.  
96e0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73    }.  }..  p = s
96f0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
9700: 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  on(db, zFunction
9710: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72  Name, nName, nAr
9720: 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a  g, (u8)enc, 1);.
9730: 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62    assert(p || db
9740: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b  ->mallocFailed);
9750: 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20  .  if( !p ){.   
9760: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
9770: 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  OMEM;.  }..  /* 
9780: 49 66 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73  If an older vers
9790: 69 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ion of the funct
97a0: 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69  ion with a confi
97b0: 67 75 72 65 64 20 64 65 73 74 72 75 63 74 6f 72  gured destructor
97c0: 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72   is.  ** being r
97d0: 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74  eplaced invoke t
97e0: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 75  he destructor fu
97f0: 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a  nction here. */.
9800: 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f    functionDestro
9810: 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28  y(db, p);..  if(
9820: 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a   pDestructor ){.
9830: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
9840: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70  >nRef++;.  }.  p
9850: 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20  ->pDestructor = 
9860: 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70  pDestructor;.  p
9870: 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70  ->flags = 0;.  p
9880: 2d 3e 78 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b  ->xFunc = xFunc;
9890: 0a 20 20 70 2d 3e 78 53 74 65 70 20 3d 20 78 53  .  p->xStep = xS
98a0: 74 65 70 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c  tep;.  p->xFinal
98b0: 69 7a 65 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20  ize = xFinal;.  
98c0: 70 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70  p->pUserData = p
98d0: 55 73 65 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e  UserData;.  p->n
98e0: 41 72 67 20 3d 20 28 75 31 36 29 6e 41 72 67 3b  Arg = (u16)nArg;
98f0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9900: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
9910: 65 61 74 65 20 6e 65 77 20 75 73 65 72 20 66 75  eate new user fu
9920: 6e 63 74 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20  nctions..*/.int 
9930: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
9940: 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  unction(.  sqlit
9950: 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3 *db,.  const 
9960: 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69  char *zFunc,.  i
9970: 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65  nt nArg,.  int e
9980: 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20  nc,.  void *p,. 
9990: 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73   void (*xFunc)(s
99a0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c  qlite3_context*,
99b0: 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75  int,sqlite3_valu
99c0: 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  e **),.  void (*
99d0: 78 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63  xStep)(sqlite3_c
99e0: 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69  ontext*,int,sqli
99f0: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20  te3_value **),. 
9a00: 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28   void (*xFinal)(
9a10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
9a20: 29 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  ).){.  return sq
9a30: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
9a40: 63 74 69 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75  ction_v2(db, zFu
9a50: 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70  nc, nArg, enc, p
9a60: 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a  , xFunc, xStep,.
9a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a90: 20 20 20 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a      xFinal, 0);.
9aa0: 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  }..int sqlite3_c
9ab0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
9ac0: 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  2(.  sqlite3 *db
9ad0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
9ae0: 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72  zFunc,.  int nAr
9af0: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
9b00: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
9b10: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
9b20: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
9b30: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
9b40: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
9b50: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
9b60: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
9b70: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
9b80: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
9b90: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76  3_context*),.  v
9ba0: 6f 69 64 20 28 2a 78 44 65 73 74 72 6f 79 29 28  oid (*xDestroy)(
9bb0: 76 6f 69 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74  void *).){.  int
9bc0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
9bd0: 4f 52 3b 0a 20 20 46 75 6e 63 44 65 73 74 72 75  OR;.  FuncDestru
9be0: 63 74 6f 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a  ctor *pArg = 0;.
9bf0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
9c00: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
9c10: 3b 0a 20 20 69 66 28 20 78 44 65 73 74 72 6f 79  ;.  if( xDestroy
9c20: 20 29 7b 0a 20 20 20 20 70 41 72 67 20 3d 20 28   ){.    pArg = (
9c30: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
9c40: 29 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63  )sqlite3DbMalloc
9c50: 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28  Zero(db, sizeof(
9c60: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 29 29  FuncDestructor))
9c70: 3b 0a 20 20 20 20 69 66 28 20 21 70 41 72 67 20  ;.    if( !pArg 
9c80: 29 7b 0a 20 20 20 20 20 20 78 44 65 73 74 72 6f  ){.      xDestro
9c90: 79 28 70 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  y(p);.      goto
9ca0: 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20   out;.    }.    
9cb0: 70 41 72 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d  pArg->xDestroy =
9cc0: 20 78 44 65 73 74 72 6f 79 3b 0a 20 20 20 20 70   xDestroy;.    p
9cd0: 41 72 67 2d 3e 70 55 73 65 72 44 61 74 61 20 3d  Arg->pUserData =
9ce0: 20 70 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73   p;.  }.  rc = s
9cf0: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
9d00: 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67  (db, zFunc, nArg
9d10: 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c  , enc, p, xFunc,
9d20: 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20   xStep, xFinal, 
9d30: 70 41 72 67 29 3b 0a 20 20 69 66 28 20 70 41 72  pArg);.  if( pAr
9d40: 67 20 26 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d  g && pArg->nRef=
9d50: 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  =0 ){.    assert
9d60: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
9d70: 29 3b 0a 20 20 20 20 78 44 65 73 74 72 6f 79 28  );.    xDestroy(
9d80: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  p);.    sqlite3D
9d90: 62 46 72 65 65 28 64 62 2c 20 70 41 72 67 29 3b  bFree(db, pArg);
9da0: 0a 20 20 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63  .  }.. out:.  rc
9db0: 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
9dc0: 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
9dd0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
9de0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
9df0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
9e00: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
9e10: 5f 55 54 46 31 36 0a 69 6e 74 20 73 71 6c 69 74  _UTF16.int sqlit
9e20: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
9e30: 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20  on16(.  sqlite3 
9e40: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69  *db,.  const voi
9e50: 64 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  d *zFunctionName
9e60: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
9e70: 69 6e 74 20 65 54 65 78 74 52 65 70 2c 0a 20 20  int eTextRep,.  
9e80: 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20  void *p,.  void 
9e90: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
9ea0: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
9eb0: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a  lite3_value**),.
9ec0: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
9ed0: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
9ee0: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
9ef0: 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ue**),.  void (*
9f00: 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f  xFinal)(sqlite3_
9f10: 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69  context*).){.  i
9f20: 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a  nt rc;.  char *z
9f30: 46 75 6e 63 38 3b 0a 20 20 73 71 6c 69 74 65 33  Func8;.  sqlite3
9f40: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
9f50: 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72  >mutex);.  asser
9f60: 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  t( !db->mallocFa
9f70: 69 6c 65 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38  iled );.  zFunc8
9f80: 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36 74   = sqlite3Utf16t
9f90: 6f 38 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  o8(db, zFunction
9fa0: 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
9fb0: 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
9fc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
9fd0: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
9fe0: 63 38 2c 20 6e 41 72 67 2c 20 65 54 65 78 74 52  c8, nArg, eTextR
9ff0: 65 70 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  ep, p, xFunc, xS
a000: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 30 29 3b 0a  tep, xFinal,0);.
a010: 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
a020: 64 62 2c 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72  db, zFunc8);.  r
a030: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
a040: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
a050: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
a060: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
a070: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
a080: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c  dif.../*.** Decl
a090: 61 72 65 20 74 68 61 74 20 61 20 66 75 6e 63 74  are that a funct
a0a0: 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 6f 76 65  ion has been ove
a0b0: 72 6c 6f 61 64 65 64 20 62 79 20 61 20 76 69 72  rloaded by a vir
a0c0: 74 75 61 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  tual table..**.*
a0d0: 2a 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f  * If the functio
a0e0: 6e 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  n already exists
a0f0: 20 61 73 20 61 20 72 65 67 75 6c 61 72 20 67 6c   as a regular gl
a100: 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74  obal function, t
a110: 68 65 6e 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  hen.** this rout
a120: 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20  ine is a no-op. 
a130: 20 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   If the function
a140: 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c   does not exist,
a150: 20 74 68 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20   then create.** 
a160: 61 20 6e 65 77 20 6f 6e 65 20 74 68 61 74 20 61  a new one that a
a170: 6c 77 61 79 73 20 74 68 72 6f 77 73 20 61 20 72  lways throws a r
a180: 75 6e 2d 74 69 6d 65 20 65 72 72 6f 72 2e 20 20  un-time error.  
a190: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74  .**.** When virt
a1a0: 75 61 6c 20 74 61 62 6c 65 73 20 69 6e 74 65 6e  ual tables inten
a1b0: 64 20 74 6f 20 70 72 6f 76 69 64 65 20 61 6e 20  d to provide an 
a1c0: 6f 76 65 72 6c 6f 61 64 65 64 20 66 75 6e 63 74  overloaded funct
a1d0: 69 6f 6e 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f  ion, they.** sho
a1e0: 75 6c 64 20 63 61 6c 6c 20 74 68 69 73 20 72 6f  uld call this ro
a1f0: 75 74 69 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75  utine to make su
a200: 72 65 20 74 68 65 20 67 6c 6f 62 61 6c 20 66 75  re the global fu
a210: 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a  nction exists..*
a220: 2a 20 41 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  * A global funct
a230: 69 6f 6e 20 6d 75 73 74 20 65 78 69 73 74 20 69  ion must exist i
a240: 6e 20 6f 72 64 65 72 20 66 6f 72 20 6e 61 6d 65  n order for name
a250: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77   resolution to w
a260: 6f 72 6b 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e  ork.** properly.
a270: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
a280: 6f 76 65 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f  overload_functio
a290: 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  n(.  sqlite3 *db
a2a0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
a2b0: 7a 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  zName,.  int nAr
a2c0: 67 0a 29 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  g.){.  int nName
a2d0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
a2e0: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74  30(zName);.  int
a2f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a300: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
a310: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
a320: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
a330: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c  FindFunction(db,
a340: 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e   zName, nName, n
a350: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
a360: 2c 20 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  , 0)==0 ){.    r
a370: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
a380: 65 46 75 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c  eFunc(db, zName,
a390: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
a3a0: 46 38 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  F8,.            
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
a3c0: 2c 20 73 71 6c 69 74 65 33 49 6e 76 61 6c 69 64  , sqlite3Invalid
a3d0: 46 75 6e 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20  Function, 0, 0, 
a3e0: 30 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  0);.  }.  rc = s
a3f0: 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64 62  qlite3ApiExit(db
a400: 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33  , rc);.  sqlite3
a410: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
a420: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
a430: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  n rc;.}..#ifndef
a440: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
a450: 43 45 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  CE./*.** Registe
a460: 72 20 61 20 74 72 61 63 65 20 66 75 6e 63 74 69  r a trace functi
a470: 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66 72  on.  The pArg fr
a480: 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  om the previousl
a490: 79 20 72 65 67 69 73 74 65 72 65 64 20 74 72 61  y registered tra
a4a0: 63 65 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  ce.** is returne
a4b0: 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c  d.  .**.** A NUL
a4c0: 4c 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e  L trace function
a4d0: 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 74   means that no t
a4e0: 72 61 63 69 6e 67 20 69 73 20 65 78 65 63 75 74  racing is execut
a4f0: 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a  es.  A non-NULL.
a500: 2a 2a 20 74 72 61 63 65 20 69 73 20 61 20 70 6f  ** trace is a po
a510: 69 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74  inter to a funct
a520: 69 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f  ion that is invo
a530: 6b 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74  ked at the start
a540: 20 6f 66 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20   of each.** SQL 
a550: 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f  statement..*/.vo
a560: 69 64 20 2a 73 71 6c 69 74 65 33 5f 74 72 61 63  id *sqlite3_trac
a570: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
a580: 6f 69 64 20 28 2a 78 54 72 61 63 65 29 28 76 6f  oid (*xTrace)(vo
a590: 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29  id*,const char*)
a5a0: 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
a5b0: 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73   void *pOld;.  s
a5c0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
a5d0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
a5e0: 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61   pOld = db->pTra
a5f0: 63 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72  ceArg;.  db->xTr
a600: 61 63 65 20 3d 20 78 54 72 61 63 65 3b 0a 20 20  ace = xTrace;.  
a610: 64 62 2d 3e 70 54 72 61 63 65 41 72 67 20 3d 20  db->pTraceArg = 
a620: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
a630: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
a640: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
a650: 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52   pOld;.}./*.** R
a660: 65 67 69 73 74 65 72 20 61 20 70 72 6f 66 69 6c  egister a profil
a670: 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65  e function.  The
a680: 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20 70   pArg from the p
a690: 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73 74  reviously regist
a6a0: 65 72 65 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65  ered .** profile
a6b0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 65 74   function is ret
a6c0: 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41  urned.  .**.** A
a6d0: 20 4e 55 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75   NULL profile fu
a6e0: 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61  nction means tha
a6f0: 74 20 6e 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69  t no profiling i
a700: 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20 6e  s executes.  A n
a710: 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69  on-NULL.** profi
a720: 6c 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  le is a pointer 
a730: 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68  to a function th
a740: 61 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74  at is invoked at
a750: 20 74 68 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20   the conclusion 
a760: 6f 66 0a 2a 2a 20 65 61 63 68 20 53 51 4c 20 73  of.** each SQL s
a770: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 69 73  tatement that is
a780: 20 72 75 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73   run..*/.void *s
a790: 71 6c 69 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a  qlite3_profile(.
a7a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
a7b0: 20 76 6f 69 64 20 28 2a 78 50 72 6f 66 69 6c 65   void (*xProfile
a7c0: 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68  )(void*,const ch
a7d0: 61 72 2a 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36  ar*,sqlite_uint6
a7e0: 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  4),.  void *pArg
a7f0: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  .){.  void *pOld
a800: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
a810: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
a820: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
a830: 3e 70 50 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20  >pProfileArg;.  
a840: 64 62 2d 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78  db->xProfile = x
a850: 50 72 6f 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70  Profile;.  db->p
a860: 50 72 6f 66 69 6c 65 41 72 67 20 3d 20 70 41 72  ProfileArg = pAr
a870: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
a880: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
a890: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
a8a0: 6c 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ld;.}.#endif /* 
a8b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
a8c0: 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  E */../*.** Regi
a8d0: 73 74 65 72 20 61 20 66 75 6e 63 74 69 6f 6e 20  ster a function 
a8e0: 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 77 68  to be invoked wh
a8f0: 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  en a transaction
a900: 20 63 6f 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66 20   commits..** If 
a910: 74 68 65 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63  the invoked func
a920: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e  tion returns non
a930: 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20  -zero, then the 
a940: 63 6f 6d 6d 69 74 20 62 65 63 6f 6d 65 73 20 61  commit becomes a
a950: 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f  .** rollback..*/
a960: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 63  .void *sqlite3_c
a970: 6f 6d 6d 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71  ommit_hook(.  sq
a980: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
a990: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
a9a0: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
a9b0: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
a9c0: 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b   int (*xCallback
a9d0: 29 28 76 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75  )(void*),  /* Fu
a9e0: 6e 63 74 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65  nction to invoke
a9f0: 20 6f 6e 20 65 61 63 68 20 63 6f 6d 6d 69 74 20   on each commit 
aa00: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
aa20: 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
aa30: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
aa40: 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20  .  void *pOld;. 
aa50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
aa60: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
aa70: 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43  .  pOld = db->pC
aa80: 6f 6d 6d 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e  ommitArg;.  db->
aa90: 78 43 6f 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20  xCommitCallback 
aaa0: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
aab0: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20  b->pCommitArg = 
aac0: 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pArg;.  sqlite3_
aad0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
aae0: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
aaf0: 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pOld;.}../*.** 
ab00: 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62  Register a callb
ab10: 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65  ack to be invoke
ab20: 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 72 6f  d each time a ro
ab30: 77 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a  w is updated,.**
ab40: 20 69 6e 73 65 72 74 65 64 20 6f 72 20 64 65 6c   inserted or del
ab50: 65 74 65 64 20 75 73 69 6e 67 20 74 68 69 73 20  eted using this 
ab60: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
ab70: 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ion..*/.void *sq
ab80: 6c 69 74 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f  lite3_update_hoo
ab90: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
aba0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
abb0: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
abc0: 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
abd0: 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  se */.  void (*x
abe0: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c  Callback)(void*,
abf0: 69 6e 74 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a  int,char const *
ac00: 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71  ,char const *,sq
ac10: 6c 69 74 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76  lite_int64),.  v
ac20: 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20  oid *pArg       
ac30: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75           /* Argu
ac40: 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63  ment to the func
ac50: 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69  tion */.){.  voi
ac60: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
ac70: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
ac80: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
ac90: 74 20 3d 20 64 62 2d 3e 70 55 70 64 61 74 65 41  t = db->pUpdateA
aca0: 72 67 3b 0a 20 20 64 62 2d 3e 78 55 70 64 61 74  rg;.  db->xUpdat
acb0: 65 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c  eCallback = xCal
acc0: 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70  lback;.  db->pUp
acd0: 64 61 74 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  dateArg = pArg;.
ace0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
acf0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
ad00: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
ad10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
ad20: 65 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f  er a callback to
ad30: 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68   be invoked each
ad40: 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74   time a transact
ad50: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a  ion is rolled.**
ad60: 20 62 61 63 6b 20 62 79 20 74 68 69 73 20 64 61   back by this da
ad70: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
ad80: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
ad90: 74 65 33 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f  te3_rollback_hoo
ada0: 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  k(.  sqlite3 *db
adb0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
adc0: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
add0: 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61 62 61  k to this databa
ade0: 73 65 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78  se */.  void (*x
adf0: 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29  Callback)(void*)
ae00: 2c 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75  , /* Callback fu
ae10: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64  nction */.  void
ae20: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
ae30: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
ae40: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
ae50: 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
ae60: 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pRet;.  sqlite3_
ae70: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
ae80: 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
ae90: 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72   db->pRollbackAr
aea0: 67 3b 0a 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61  g;.  db->xRollba
aeb0: 63 6b 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61  ckCallback = xCa
aec0: 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52  llback;.  db->pR
aed0: 6f 6c 6c 62 61 63 6b 41 72 67 20 3d 20 70 41 72  ollbackArg = pAr
aee0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
aef0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
af00: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52  ex);.  return pR
af10: 65 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  et;.}..#ifndef S
af20: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f  QLITE_OMIT_WAL./
af30: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
af40: 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c  _wal_hook() call
af50: 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20  back registered 
af60: 62 79 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61  by sqlite3_wal_a
af70: 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e  utocheckpoint().
af80: 0a 2a 2a 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74  .** Invoke sqlit
af90: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
afa0: 74 20 69 66 20 74 68 65 20 6e 75 6d 62 65 72 20  t if the number 
afb0: 6f 66 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65  of frames in the
afc0: 20 6c 6f 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20   log file.** is 
afd0: 67 72 65 61 74 65 72 20 74 68 61 6e 20 73 71 6c  greater than sql
afe0: 69 74 65 33 2e 70 57 61 6c 41 72 67 20 63 61 73  ite3.pWalArg cas
aff0: 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  t to an integer 
b000: 28 74 68 65 20 76 61 6c 75 65 20 63 6f 6e 66 69  (the value confi
b010: 67 75 72 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f  gured by.** wal_
b020: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29  autocheckpoint()
b030: 29 2e 0a 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74  )..*/ .int sqlit
b040: 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b  e3WalDefaultHook
b050: 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e  (.  void *pClien
b060: 74 44 61 74 61 2c 20 20 20 20 20 2f 2a 20 41 72  tData,     /* Ar
b070: 67 75 6d 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69  gument */.  sqli
b080: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
b090: 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e     /* Connection
b0a0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
b0b0: 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 2f 2a 20   *zDb,       /* 
b0c0: 44 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  Database */.  in
b0d0: 74 20 6e 46 72 61 6d 65 20 20 20 20 20 20 20 20  t nFrame        
b0e0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
b0f0: 57 41 4c 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  WAL */.){.  if( 
b100: 6e 46 72 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50  nFrame>=SQLITE_P
b110: 54 52 5f 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e  TR_TO_INT(pClien
b120: 74 44 61 74 61 29 20 29 7b 0a 20 20 20 20 73 71  tData) ){.    sq
b130: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
b140: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71  Malloc();.    sq
b150: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
b160: 6f 69 6e 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20  oint(db, zDb);. 
b170: 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e     sqlite3EndBen
b180: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d  ignMalloc();.  }
b190: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
b1a0: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
b1b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
b1c0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69   */../*.** Confi
b1d0: 67 75 72 65 20 61 6e 20 73 71 6c 69 74 65 33 5f  gure an sqlite3_
b1e0: 77 61 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62  wal_hook() callb
b1f0: 61 63 6b 20 74 6f 20 61 75 74 6f 6d 61 74 69 63  ack to automatic
b200: 61 6c 6c 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a  ally checkpoint.
b210: 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 61 66  ** a database af
b220: 74 65 72 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  ter committing a
b230: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 66 20   transaction if 
b240: 74 68 65 72 65 20 61 72 65 20 6e 46 72 61 6d 65  there are nFrame
b250: 20 6f 72 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d   or.** more fram
b260: 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69  es in the log fi
b270: 6c 65 2e 20 50 61 73 73 69 6e 67 20 7a 65 72 6f  le. Passing zero
b280: 20 6f 72 20 61 20 6e 65 67 61 74 69 76 65 20 76   or a negative v
b290: 61 6c 75 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e  alue as the.** n
b2a0: 46 72 61 6d 65 20 70 61 72 61 6d 65 74 65 72 20  Frame parameter 
b2b0: 64 69 73 61 62 6c 65 73 20 61 75 74 6f 6d 61 74  disables automat
b2c0: 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 73 20 65  ic checkpoints e
b2d0: 6e 74 69 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54  ntirely..**.** T
b2e0: 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69  he callback regi
b2f0: 73 74 65 72 65 64 20 62 79 20 74 68 69 73 20 66  stered by this f
b300: 75 6e 63 74 69 6f 6e 20 72 65 70 6c 61 63 65 73  unction replaces
b310: 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 63 61   any existing ca
b320: 6c 6c 62 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74  llback.** regist
b330: 65 72 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ered using sqlit
b340: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c  e3_wal_hook(). L
b350: 69 6b 65 77 69 73 65 2c 20 72 65 67 69 73 74 65  ikewise, registe
b360: 72 69 6e 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a  ring a callback.
b370: 2a 2a 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ** using sqlite3
b380: 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61  _wal_hook() disa
b390: 62 6c 65 73 20 74 68 65 20 61 75 74 6f 6d 61 74  bles the automat
b3a0: 69 63 20 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65  ic checkpoint me
b3b0: 63 68 61 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69  chanism.** confi
b3c0: 67 75 72 65 64 20 62 79 20 74 68 69 73 20 66 75  gured by this fu
b3d0: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  nction..*/.int s
b3e0: 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
b3f0: 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
b400: 33 20 2a 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d  3 *db, int nFram
b410: 65 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  e){.#ifdef SQLIT
b420: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55  E_OMIT_WAL.  UNU
b430: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62  SED_PARAMETER(db
b440: 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
b450: 4d 45 54 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23  METER(nFrame);.#
b460: 65 6c 73 65 0a 20 20 69 66 28 20 6e 46 72 61 6d  else.  if( nFram
b470: 65 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  e>0 ){.    sqlit
b480: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20  e3_wal_hook(db, 
b490: 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
b4a0: 74 48 6f 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e  tHook, SQLITE_IN
b4b0: 54 5f 54 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29  T_TO_PTR(nFrame)
b4c0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
b4d0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
b4e0: 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a  (db, 0, 0);.  }.
b4f0: 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
b500: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
b510: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63  .** Register a c
b520: 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e  allback to be in
b530: 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20  voked each time 
b540: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
b550: 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f   written.** into
b560: 20 74 68 65 20 77 72 69 74 65 2d 61 68 65 61 64   the write-ahead
b570: 2d 6c 6f 67 20 62 79 20 74 68 69 73 20 64 61 74  -log by this dat
b580: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
b590: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
b5a0: 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73  e3_wal_hook(.  s
b5b0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
b5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b5d0: 2a 20 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f  * Attach the hoo
b5e0: 6b 20 74 6f 20 74 68 69 73 20 64 62 20 68 61 6e  k to this db han
b5f0: 64 6c 65 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43  dle */.  int(*xC
b600: 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c  allback)(void *,
b610: 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74   sqlite3*, const
b620: 20 63 68 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20   char*, int),.  
b630: 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20 20  void *pArg      
b640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b650: 2f 2a 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e  /* First argumen
b660: 74 20 70 61 73 73 65 64 20 74 6f 20 78 43 61 6c  t passed to xCal
b670: 6c 62 61 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69  lback() */.){.#i
b680: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
b690: 54 5f 57 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52  T_WAL.  void *pR
b6a0: 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  et;.  sqlite3_mu
b6b0: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
b6c0: 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64  tex);.  pRet = d
b6d0: 62 2d 3e 70 57 61 6c 41 72 67 3b 0a 20 20 64 62  b->pWalArg;.  db
b6e0: 2d 3e 78 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d  ->xWalCallback =
b6f0: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
b700: 2d 3e 70 57 61 6c 41 72 67 20 3d 20 70 41 72 67  ->pWalArg = pArg
b710: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
b720: 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
b730: 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65  x);.  return pRe
b740: 74 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  t;.#else.  retur
b750: 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n 0;.#endif.}../
b760: 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
b770: 64 61 74 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f  database zDb..*/
b780: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c  .int sqlite3_wal
b790: 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a  _checkpoint_v2(.
b7a0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
b7b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7c0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
b7d0: 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndle */.  const 
b7e0: 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20 20  char *zDb,      
b7f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
b800: 65 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61  e of attached da
b810: 74 61 62 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29  tabase (or NULL)
b820: 20 2a 2f 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c   */.  int eMode,
b830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b840: 20 20 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f        /* SQLITE_
b850: 43 48 45 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c  CHECKPOINT_* val
b860: 75 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c  ue */.  int *pnL
b870: 6f 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  og,             
b880: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
b890: 53 69 7a 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20  Size of WAL log 
b8a0: 69 6e 20 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69  in frames */.  i
b8b0: 6e 74 20 2a 70 6e 43 6b 70 74 20 20 20 20 20 20  nt *pnCkpt      
b8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b8d0: 2a 20 4f 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d  * OUT: Total num
b8e0: 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 63 68  ber of frames ch
b8f0: 65 63 6b 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b  eckpointed */.){
b900: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
b910: 4d 49 54 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e  MIT_WAL.  return
b920: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73   SQLITE_OK;.#els
b930: 65 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  e.  int rc;     
b940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b950: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
b960: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20  de */.  int iDb 
b970: 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54  = SQLITE_MAX_ATT
b980: 41 43 48 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74  ACHED;  /* sqlit
b990: 65 33 2e 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f  e3.aDb[] index o
b9a0: 66 20 64 62 20 74 6f 20 63 68 65 63 6b 70 6f 69  f db to checkpoi
b9b0: 6e 74 20 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74  nt */..  /* Init
b9c0: 69 61 6c 69 7a 65 20 74 68 65 20 6f 75 74 70 75  ialize the outpu
b9d0: 74 20 76 61 72 69 61 62 6c 65 73 20 74 6f 20 2d  t variables to -
b9e0: 31 20 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72  1 in case an err
b9f0: 6f 72 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20  or occurs. */.  
ba00: 69 66 28 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c  if( pnLog ) *pnL
ba10: 6f 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70  og = -1;.  if( p
ba20: 6e 43 6b 70 74 20 29 20 2a 70 6e 43 6b 70 74 20  nCkpt ) *pnCkpt 
ba30: 3d 20 2d 31 3b 0a 0a 20 20 61 73 73 65 72 74 28  = -1;..  assert(
ba40: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49   SQLITE_CHECKPOI
ba50: 4e 54 5f 46 55 4c 4c 3e 53 51 4c 49 54 45 5f 43  NT_FULL>SQLITE_C
ba60: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
ba70: 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53  E );.  assert( S
ba80: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
ba90: 5f 46 55 4c 4c 3c 53 51 4c 49 54 45 5f 43 48 45  _FULL<SQLITE_CHE
baa0: 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20  CKPOINT_RESTART 
bab0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
bac0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
bad0: 41 53 53 49 56 45 2b 32 3d 3d 53 51 4c 49 54 45  ASSIVE+2==SQLITE
bae0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54  _CHECKPOINT_REST
baf0: 41 52 54 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f  ART );.  if( eMo
bb00: 64 65 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  de<SQLITE_CHECKP
bb10: 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 7c 7c 20  OINT_PASSIVE || 
bb20: 65 4d 6f 64 65 3e 53 51 4c 49 54 45 5f 43 48 45  eMode>SQLITE_CHE
bb30: 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54 20  CKPOINT_RESTART 
bb40: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
bb50: 4c 49 54 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d  LITE_MISUSE;.  }
bb60: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
bb70: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
bb80: 78 29 3b 0a 20 20 69 66 28 20 7a 44 62 20 26 26  x);.  if( zDb &&
bb90: 20 7a 44 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69   zDb[0] ){.    i
bba0: 44 62 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  Db = sqlite3Find
bbb0: 44 62 4e 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b  DbName(db, zDb);
bbc0: 0a 20 20 7d 0a 20 20 69 66 28 20 69 44 62 3c 30  .  }.  if( iDb<0
bbd0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
bbe0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73  ITE_ERROR;.    s
bbf0: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
bc00: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75  SQLITE_ERROR, "u
bc10: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a  nknown database:
bc20: 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65   %s", zDb);.  }e
bc30: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
bc40: 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
bc50: 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20  db, iDb, eMode, 
bc60: 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a  pnLog, pnCkpt);.
bc70: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
bc80: 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d  (db, rc, 0);.  }
bc90: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
bca0: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
bcb0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
bcc0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
bcd0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  ;.  return rc;.#
bce0: 65 6e 64 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  endif.}.../*.** 
bcf0: 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62  Checkpoint datab
bd00: 61 73 65 20 7a 44 62 2e 20 49 66 20 7a 44 62 20  ase zDb. If zDb 
bd10: 69 73 20 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74  is NULL, or if t
bd20: 68 65 20 62 75 66 66 65 72 20 7a 44 62 20 70 6f  he buffer zDb po
bd30: 69 6e 74 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61  ints.** to conta
bd40: 69 6e 73 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  ins a zero-lengt
bd50: 68 20 73 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74  h string, all at
bd60: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
bd70: 20 61 72 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f   are .** checkpo
bd80: 69 6e 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  inted..*/.int sq
bd90: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
bda0: 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62  oint(sqlite3 *db
bdb0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44  , const char *zD
bdc0: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  b){.  return sql
bdd0: 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f  ite3_wal_checkpo
bde0: 69 6e 74 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20  int_v2(db, zDb, 
bdf0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
be00: 54 5f 50 41 53 53 49 56 45 2c 20 30 2c 20 30 29  T_PASSIVE, 0, 0)
be10: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
be20: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a  ITE_OMIT_WAL./*.
be30: 2a 2a 20 52 75 6e 20 61 20 63 68 65 63 6b 70 6f  ** Run a checkpo
be40: 69 6e 74 20 6f 6e 20 64 61 74 61 62 61 73 65 20  int on database 
be50: 69 44 62 2e 20 54 68 69 73 20 69 73 20 61 20 6e  iDb. This is a n
be60: 6f 2d 6f 70 20 69 66 20 64 61 74 61 62 61 73 65  o-op if database
be70: 20 69 44 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63   iDb is.** not c
be80: 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e  urrently open in
be90: 20 57 41 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a   WAL mode..**.**
bea0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
beb0: 6e 20 69 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65  n is open on the
bec0: 20 64 61 74 61 62 61 73 65 20 62 65 69 6e 67 20   database being 
bed0: 63 68 65 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68  checkpointed, th
bee0: 69 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  is .** function 
bef0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c  returns SQLITE_L
bf00: 4f 43 4b 45 44 20 61 6e 64 20 61 20 63 68 65 63  OCKED and a chec
bf10: 6b 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 61 74  kpoint is not at
bf20: 74 65 6d 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20  tempted. If .** 
bf30: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
bf40: 77 68 69 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68  while running th
bf50: 65 20 63 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e  e checkpoint, an
bf60: 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
bf70: 64 65 20 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e  de is .** return
bf80: 65 64 20 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f  ed (i.e. SQLITE_
bf90: 49 4f 45 52 52 29 2e 20 4f 74 68 65 72 77 69 73  IOERR). Otherwis
bfa0: 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  e, SQLITE_OK..**
bfb0: 0a 2a 2a 20 54 68 65 20 6d 75 74 65 78 20 6f 6e  .** The mutex on
bfc0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
bfd0: 20 64 62 20 73 68 6f 75 6c 64 20 62 65 20 68 65   db should be he
bfe0: 6c 64 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72  ld by the caller
bff0: 2e 20 54 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61  . The mutex.** a
c000: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
c010: 68 65 20 73 70 65 63 69 66 69 63 20 62 2d 74 72  he specific b-tr
c020: 65 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f  ee being checkpo
c030: 69 6e 74 65 64 20 69 73 20 74 61 6b 65 6e 20 62  inted is taken b
c040: 79 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69  y.** this functi
c050: 6f 6e 20 77 68 69 6c 65 20 74 68 65 20 63 68 65  on while the che
c060: 63 6b 70 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69  ckpoint is runni
c070: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62  ng..**.** If iDb
c080: 20 69 73 20 70 61 73 73 65 64 20 53 51 4c 49 54   is passed SQLIT
c090: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 20  E_MAX_ATTACHED, 
c0a0: 74 68 65 6e 20 61 6c 6c 20 61 74 74 61 63 68 65  then all attache
c0b0: 64 20 64 61 74 61 62 61 73 65 73 20 61 72 65 0a  d databases are.
c0c0: 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e  ** checkpointed.
c0d0: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
c0e0: 65 6e 63 6f 75 6e 74 65 72 65 64 20 69 74 20 69  encountered it i
c0f0: 73 20 72 65 74 75 72 6e 65 64 20 69 6d 6d 65 64  s returned immed
c100: 69 61 74 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61  iately -.** no a
c110: 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74  ttempt is made t
c120: 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79  o checkpoint any
c130: 20 72 65 6d 61 69 6e 69 6e 67 20 64 61 74 61 62   remaining datab
c140: 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61  ases..**.** Para
c150: 6d 65 74 65 72 20 65 4d 6f 64 65 20 69 73 20 6f  meter eMode is o
c160: 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 48 45  ne of SQLITE_CHE
c170: 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c  CKPOINT_PASSIVE,
c180: 20 46 55 4c 4c 20 6f 72 20 52 45 53 54 41 52 54   FULL or RESTART
c190: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c1a0: 43 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74  Checkpoint(sqlit
c1b0: 65 33 20 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c  e3 *db, int iDb,
c1c0: 20 69 6e 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20   int eMode, int 
c1d0: 2a 70 6e 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43  *pnLog, int *pnC
c1e0: 6b 70 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  kpt){.  int rc =
c1f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
c200: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
c210: 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
c220: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
c230: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
c240: 73 65 64 20 74 6f 20 69 74 65 72 61 74 65 20 74  sed to iterate t
c250: 68 72 6f 75 67 68 20 61 74 74 61 63 68 65 64 20  hrough attached 
c260: 64 62 73 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75  dbs */.  int bBu
c270: 73 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  sy = 0;         
c280: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
c290: 20 69 66 20 53 51 4c 49 54 45 5f 42 55 53 59 20   if SQLITE_BUSY 
c2a0: 68 61 73 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74  has been encount
c2b0: 65 72 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  ered */..  asser
c2c0: 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  t( sqlite3_mutex
c2d0: 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29  _held(db->mutex)
c2e0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70   );.  assert( !p
c2f0: 6e 4c 6f 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d  nLog || *pnLog==
c300: 2d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  -1 );.  assert( 
c310: 21 70 6e 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b  !pnCkpt || *pnCk
c320: 70 74 3d 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72  pt==-1 );..  for
c330: 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20  (i=0; i<db->nDb 
c340: 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
c350: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
c360: 69 3d 3d 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53  i==iDb || iDb==S
c370: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
c380: 45 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ED ){.      rc =
c390: 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 68 65   sqlite3BtreeChe
c3a0: 63 6b 70 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b  ckpoint(db->aDb[
c3b0: 69 5d 2e 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70  i].pBt, eMode, p
c3c0: 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20  nLog, pnCkpt);. 
c3d0: 20 20 20 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a       pnLog = 0;.
c3e0: 20 20 20 20 20 20 70 6e 43 6b 70 74 20 3d 20 30        pnCkpt = 0
c3f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
c400: 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
c410: 20 20 20 20 20 20 20 62 42 75 73 79 20 3d 20 31         bBusy = 1
c420: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
c430: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
c440: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  }.    }.  }..  r
c450: 65 74 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54  eturn (rc==SQLIT
c460: 45 5f 4f 4b 20 26 26 20 62 42 75 73 79 29 20 3f  E_OK && bBusy) ?
c470: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 3a 20 72   SQLITE_BUSY : r
c480: 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  c;.}.#endif /* S
c490: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a  QLITE_OMIT_WAL *
c4a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  /../*.** This fu
c4b0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
c4c0: 72 75 65 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f  rue if main-memo
c4d0: 72 79 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  ry should be use
c4e0: 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20  d instead of.** 
c4f0: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
c500: 20 66 6f 72 20 74 72 61 6e 73 69 65 6e 74 20 70   for transient p
c510: 61 67 65 72 20 66 69 6c 65 73 20 61 6e 64 20 73  ager files and s
c520: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
c530: 73 2e 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  s..** The value 
c540: 72 65 74 75 72 6e 65 64 20 64 65 70 65 6e 64 73  returned depends
c550: 20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66   on the value of
c560: 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20   db->temp_store 
c570: 28 72 75 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61  (runtime.** para
c580: 6d 65 74 65 72 29 20 61 6e 64 20 74 68 65 20 63  meter) and the c
c590: 6f 6d 70 69 6c 65 20 74 69 6d 65 20 76 61 6c 75  ompile time valu
c5a0: 65 20 6f 66 20 53 51 4c 49 54 45 5f 54 45 4d 50  e of SQLITE_TEMP
c5b0: 5f 53 54 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66  _STORE. The.** f
c5c0: 6f 6c 6c 6f 77 69 6e 67 20 74 61 62 6c 65 20 64  ollowing table d
c5d0: 65 73 63 72 69 62 65 73 20 74 68 65 20 72 65 6c  escribes the rel
c5e0: 61 74 69 6f 6e 73 68 69 70 20 62 65 74 77 65 65  ationship betwee
c5f0: 6e 20 74 68 65 73 65 20 74 77 6f 20 76 61 6c 75  n these two valu
c600: 65 73 0a 2a 2a 20 61 6e 64 20 74 68 69 73 20 66  es.** and this f
c610: 75 6e 63 74 69 6f 6e 73 20 72 65 74 75 72 6e 20  unctions return 
c620: 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53  value..**.**   S
c630: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
c640: 20 20 20 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74       db->temp_st
c650: 6f 72 65 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e  ore     Location
c660: 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 64 61   of temporary da
c670: 74 61 62 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d  tabase.**   ----
c680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
c690: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
c6a0: 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       -----------
c6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c6c0: 2d 2d 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20  ---.**   0      
c6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
c6e0: 6e 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ny              
c6f0: 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
c700: 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
c710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c720: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
c730: 20 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28       file      (
c740: 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31  return 0).**   1
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c760: 20 20 20 20 20 32 20 20 20 20 20 20 20 20 20 20       2          
c770: 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20          memory  
c780: 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20    (return 1).** 
c790: 20 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20    1             
c7a0: 20 20 20 20 20 20 20 20 30 20 20 20 20 20 20 20          0       
c7b0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
c7c0: 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
c7d0: 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
c7e0: 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
c7f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
c800: 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
c810: 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  0).**   2       
c820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
c830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c840: 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
c850: 72 6e 20 31 29 0a 2a 2a 20 20 20 32 20 20 20 20  rn 1).**   2    
c860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c870: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
c880: 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
c890: 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20  eturn 1).**   3 
c8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c8b0: 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
c8c0: 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20         memory   
c8d0: 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69   (return 1).*/.i
c8e0: 6e 74 20 73 71 6c 69 74 65 33 54 65 6d 70 49 6e  nt sqlite3TempIn
c8f0: 4d 65 6d 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c  Memory(const sql
c900: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 20 53  ite3 *db){.#if S
c910: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
c920: 3d 3d 31 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==1.  return ( d
c930: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32  b->temp_store==2
c940: 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
c950: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
c960: 3d 3d 32 0a 20 20 72 65 74 75 72 6e 20 28 20 64  ==2.  return ( d
c970: 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31  b->temp_store!=1
c980: 20 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   );.#endif.#if S
c990: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
c9a0: 3d 3d 33 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  ==3.  return 1;.
c9b0: 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
c9c0: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c  E_TEMP_STORE<1 |
c9d0: 7c 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  | SQLITE_TEMP_ST
c9e0: 4f 52 45 3e 33 0a 20 20 72 65 74 75 72 6e 20 30  ORE>3.  return 0
c9f0: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
ca00: 2a 20 52 65 74 75 72 6e 20 55 54 46 2d 38 20 65  * Return UTF-8 e
ca10: 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c  ncoded English l
ca20: 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
ca30: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
ca40: 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e  recent.** error.
ca50: 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
ca60: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 73  sqlite3_errmsg(s
ca70: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63  qlite3 *db){.  c
ca80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
ca90: 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72  if( !db ){.    r
caa0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72  eturn sqlite3Err
cab0: 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
cac0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71  );.  }.  if( !sq
cad0: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
cae0: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
caf0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
cb00: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
cb10: 4d 49 53 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20  MISUSE_BKPT);.  
cb20: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
cb30: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
cb40: 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  x);.  if( db->ma
cb50: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
cb60: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
cb70: 53 74 72 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  Str(SQLITE_NOMEM
cb80: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
cb90: 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74  z = (char*)sqlit
cba0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 64 62  e3_value_text(db
cbb0: 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61 73 73  ->pErr);.    ass
cbc0: 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
cbd0: 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 69 66  Failed );.    if
cbe0: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
cbf0: 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74  z = sqlite3ErrSt
cc00: 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a  r(db->errCode);.
cc10: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
cc20: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
cc30: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
cc40: 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64  turn z;.}..#ifnd
cc50: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
cc60: 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  TF16./*.** Retur
cc70: 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 65 64  n UTF-16 encoded
cc80: 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
cc90: 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  e explanation of
cca0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
ccb0: 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f  .** error..*/.co
ccc0: 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69 74 65  nst void *sqlite
ccd0: 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c 69 74  3_errmsg16(sqlit
cce0: 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61 74 69  e3 *db){.  stati
ccf0: 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f  c const u16 outO
cd00: 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27  fMem[] = {.    '
cd10: 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20  o', 'u', 't', ' 
cd20: 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27  ', 'o', 'f', ' '
cd30: 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c  , 'm', 'e', 'm',
cd40: 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27 2c 20   'o', 'r', 'y', 
cd50: 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69 63 20  0.  };.  static 
cd60: 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75 73 65  const u16 misuse
cd70: 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20  [] = {.    'l', 
cd80: 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c 20 27  'i', 'b', 'r', '
cd90: 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 27 20  a', 'r', 'y', ' 
cda0: 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27 6f 27  ', .    'r', 'o'
cdb0: 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69 27 2c  , 'u', 't', 'i',
cdc0: 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27 2c 20   'n', 'e', ' ', 
cdd0: 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c 20 27  .    'c', 'a', '
cde0: 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20 27 64  l', 'l', 'e', 'd
cdf0: 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27  ', ' ', .    'o'
ce00: 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c  , 'u', 't', ' ',
ce10: 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27 2c 20   .    'o', 'f', 
ce20: 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c 20 27  ' ', .    's', '
ce30: 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20 27 65  e', 'q', 'u', 'e
ce40: 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27 65 27  ', 'n', 'c', 'e'
ce50: 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73  , 0.  };..  cons
ce60: 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28  t void *z;.  if(
ce70: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
ce80: 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66  rn (void *)outOf
ce90: 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  Mem;.  }.  if( !
cea0: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
ceb0: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
cec0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
ced0: 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d  id *)misuse;.  }
cee0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
cef0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
cf00: 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
cf10: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
cf20: 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74   z = (void *)out
cf30: 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a  OfMem;.  }else{.
cf40: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f      z = sqlite3_
cf50: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64 62 2d  value_text16(db-
cf60: 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  >pErr);.    if( 
cf70: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  z==0 ){.      sq
cf80: 6c 69 74 65 33 56 61 6c 75 65 53 65 74 53 74 72  lite3ValueSetStr
cf90: 28 64 62 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73  (db->pErr, -1, s
cfa0: 71 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d  qlite3ErrStr(db-
cfb0: 3e 65 72 72 43 6f 64 65 29 2c 0a 20 20 20 20 20  >errCode),.     
cfc0: 20 20 20 20 20 20 53 51 4c 49 54 45 5f 55 54 46        SQLITE_UTF
cfd0: 38 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  8, SQLITE_STATIC
cfe0: 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c  );.      z = sql
cff0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31  ite3_value_text1
d000: 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20  6(db->pErr);.   
d010: 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c   }.    /* A mall
d020: 6f 63 28 29 20 6d 61 79 20 68 61 76 65 20 66 61  oc() may have fa
d030: 69 6c 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  iled within the 
d040: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f  call to sqlite3_
d050: 76 61 6c 75 65 5f 74 65 78 74 31 36 28 29 0a 20  value_text16(). 
d060: 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20     ** above. If 
d070: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
d080: 2c 20 74 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d  , then the db->m
d090: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67  allocFailed flag
d0a0: 20 6e 65 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a   needs to.    **
d0b0: 20 62 65 20 63 6c 65 61 72 65 64 20 62 65 66 6f   be cleared befo
d0c0: 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f  re returning. Do
d0d0: 20 74 68 69 73 20 64 69 72 65 63 74 6c 79 2c 20   this directly, 
d0e0: 69 6e 73 74 65 61 64 20 6f 66 20 76 69 61 0a 20  instead of via. 
d0f0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 41 70 69     ** sqlite3Api
d100: 45 78 69 74 28 29 2c 20 74 6f 20 61 76 6f 69 64  Exit(), to avoid
d110: 20 73 65 74 74 69 6e 67 20 74 68 65 20 64 61 74   setting the dat
d120: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 65 72 72  abase handle err
d130: 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20 20 20 20  or message..    
d140: 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f  */.    db->mallo
d150: 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d  cFailed = 0;.  }
d160: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
d170: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
d180: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d  );.  return z;.}
d190: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
d1a0: 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a  E_OMIT_UTF16 */.
d1b0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
d1c0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72  e most recent er
d1d0: 72 6f 72 20 63 6f 64 65 20 67 65 6e 65 72 61 74  ror code generat
d1e0: 65 64 20 62 79 20 61 6e 20 53 51 4c 69 74 65 20  ed by an SQLite 
d1f0: 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c  routine. If NULL
d200: 20 69 73 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f   is.** passed to
d210: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20   this function, 
d220: 77 65 20 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c  we assume a mall
d230: 6f 63 28 29 20 66 61 69 6c 65 64 20 64 75 72 69  oc() failed duri
d240: 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ng sqlite3_open(
d250: 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
d260: 33 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65  3_errcode(sqlite
d270: 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62  3 *db){.  if( db
d280: 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66 65   && !sqlite3Safe
d290: 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28  tyCheckSickOrOk(
d2a0: 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  db) ){.    retur
d2b0: 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  n SQLITE_MISUSE_
d2c0: 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20  BKPT;.  }.  if( 
d2d0: 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  !db || db->mallo
d2e0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  cFailed ){.    r
d2f0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
d300: 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  EM;.  }.  return
d310: 20 64 62 2d 3e 65 72 72 43 6f 64 65 20 26 20 64   db->errCode & d
d320: 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e  b->errMask;.}.in
d330: 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64  t sqlite3_extend
d340: 65 64 5f 65 72 72 63 6f 64 65 28 73 71 6c 69 74  ed_errcode(sqlit
d350: 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28 20 64  e3 *db){.  if( d
d360: 62 20 26 26 20 21 73 71 6c 69 74 65 33 53 61 66  b && !sqlite3Saf
d370: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
d380: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
d390: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
d3a0: 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28  _BKPT;.  }.  if(
d3b0: 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c   !db || db->mall
d3c0: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
d3d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d3e0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  MEM;.  }.  retur
d3f0: 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d  n db->errCode;.}
d400: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
d410: 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66   new collating f
d420: 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61  unction for data
d430: 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20  base "db".  The 
d440: 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a  name is zName.**
d450: 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e   and the encodin
d460: 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61  g is enc..*/.sta
d470: 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f  tic int createCo
d480: 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
d490: 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3* db,.  const 
d4a0: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
d4b0: 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20  u8 enc,.  void* 
d4c0: 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
d4d0: 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
d4e0: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
d4f0: 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20  ,const void*),. 
d500: 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69   void(*xDel)(voi
d510: 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  d*).){.  CollSeq
d520: 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65   *pColl;.  int e
d530: 6e 63 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  nc2;.  int nName
d540: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
d550: 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20 20  30(zName);.  .  
d560: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
d570: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
d580: 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  utex) );..  /* I
d590: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  f SQLITE_UTF16 i
d5a0: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  s specified as t
d5b0: 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65  he encoding type
d5c0: 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73  , transform this
d5d0: 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20  .  ** to one of 
d5e0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f  SQLITE_UTF16LE o
d5f0: 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  r SQLITE_UTF16BE
d600: 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
d610: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
d620: 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45  VE macro. SQLITE
d630: 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73  _UTF16 is not us
d640: 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ed internally.. 
d650: 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63   */.  enc2 = enc
d660: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e  ;.  testcase( en
d670: 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
d680: 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20   );.  testcase( 
d690: 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
d6a0: 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20  16_ALIGNED );.  
d6b0: 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  if( enc2==SQLITE
d6c0: 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d  _UTF16 || enc2==
d6d0: 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
d6e0: 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32  GNED ){.    enc2
d6f0: 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e   = SQLITE_UTF16N
d700: 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28  ATIVE;.  }.  if(
d710: 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46   enc2<SQLITE_UTF
d720: 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45  8 || enc2>SQLITE
d730: 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20  _UTF16BE ){.    
d740: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
d750: 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a  SUSE_BKPT;.  }..
d760: 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68    /* Check if th
d770: 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76  is call is remov
d780: 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67  ing or replacing
d790: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c   an existing col
d7a0: 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71  lation .  ** seq
d7b0: 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e  uence. If so, an
d7c0: 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  d there are acti
d7d0: 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62  ve VMs, return b
d7e0: 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20  usy. If there.  
d7f0: 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  ** are no active
d800: 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65   VMs, invalidate
d810: 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65   any pre-compile
d820: 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20  d statements..  
d830: 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c  */.  pColl = sql
d840: 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28  ite3FindCollSeq(
d850: 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e  db, (u8)enc2, zN
d860: 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70  ame, 0);.  if( p
d870: 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78  Coll && pColl->x
d880: 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Cmp ){.    if( d
d890: 62 2d 3e 61 63 74 69 76 65 56 64 62 65 43 6e 74  b->activeVdbeCnt
d8a0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d8b0: 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54  3Error(db, SQLIT
d8c0: 45 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20  E_BUSY, .       
d8d0: 20 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65   "unable to dele
d8e0: 74 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74  te/modify collat
d8f0: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65  ion sequence due
d900: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
d910: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72  ments");.      r
d920: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
d930: 59 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  Y;.    }.    sql
d940: 69 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72  ite3ExpirePrepar
d950: 65 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29  edStatements(db)
d960: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c  ;..    /* If col
d970: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
d980: 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65  pColl was create
d990: 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 61 20  d directly by a 
d9a0: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
d9b0: 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
d9c0: 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74  llation, and not
d9d0: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73 79   generated by sy
d9e0: 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20  nthCollSeq(),.  
d9f0: 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f    ** then any co
da00: 70 69 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e  pies made by syn
da10: 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64  thCollSeq() need
da20: 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74   to be invalidat
da30: 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c  ed..    ** Also,
da40: 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72   collation destr
da50: 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e  uctor - CollSeq.
da60: 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f  xDel() - functio
da70: 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a  n may need.    *
da80: 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a  * to be called..
da90: 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20      */ .    if( 
daa0: 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53  (pColl->enc & ~S
dab0: 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
dac0: 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20  NED)==enc2 ){.  
dad0: 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f      CollSeq *aCo
dae0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ll = sqlite3Hash
daf0: 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  Find(&db->aCollS
db00: 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  eq, zName, nName
db10: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
db20: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
db30: 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
db40: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26    CollSeq *p = &
db50: 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
db60: 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43    if( p->enc==pC
db70: 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
db80: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65        if( p->xDe
db90: 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
dba0: 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65   p->xDel(p->pUse
dbb0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
dbc0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d            p->xCm
dbd0: 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  p = 0;.        }
dbe0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
dbf0: 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   }..  pColl = sq
dc00: 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
dc10: 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
dc20: 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  Name, 1);.  if( 
dc30: 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  pColl==0 ) retur
dc40: 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
dc50: 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20    pColl->xCmp = 
dc60: 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c  xCompare;.  pCol
dc70: 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b  l->pUser = pCtx;
dc80: 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d  .  pColl->xDel =
dc90: 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e   xDel;.  pColl->
dca0: 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20  enc = (u8)(enc2 
dcb0: 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f  | (enc & SQLITE_
dcc0: 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b  UTF16_ALIGNED));
dcd0: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
dce0: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
dcf0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
dd00: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
dd10: 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69   This array defi
dd20: 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62  nes hard upper b
dd30: 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76  ounds on limit v
dd40: 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69  alues.  The.** i
dd50: 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20  nitializer must 
dd60: 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20  be kept in sync 
dd70: 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
dd80: 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69  LIMIT_*.** #defi
dd90: 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  nes in sqlite3.h
dda0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
ddb0: 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74  t int aHardLimit
ddc0: 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f  [] = {.  SQLITE_
ddd0: 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  MAX_LENGTH,.  SQ
dde0: 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
ddf0: 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
de00: 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49  X_COLUMN,.  SQLI
de10: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
de20: 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
de30: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c  COMPOUND_SELECT,
de40: 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  .  SQLITE_MAX_VD
de50: 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f  BE_OP,.  SQLITE_
de60: 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
de70: 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  ,.  SQLITE_MAX_A
de80: 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54  TTACHED,.  SQLIT
de90: 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
dea0: 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  RN_LENGTH,.  SQL
deb0: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
dec0: 5f 4e 55 4d 42 45 52 2c 0a 20 20 53 51 4c 49 54  _NUMBER,.  SQLIT
ded0: 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
dee0: 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  PTH,.};../*.** M
def0: 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61 72  ake sure the har
df00: 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74  d limits are set
df10: 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76   to reasonable v
df20: 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c  alues.*/.#if SQL
df30: 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31  ITE_MAX_LENGTH<1
df40: 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
df50: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73  E_MAX_LENGTH mus
df60: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
df70: 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
df80: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
df90: 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53  TH<100.# error S
dfa0: 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
dfb0: 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
dfc0: 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
dfd0: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
dfe0: 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54  SQL_LENGTH>SQLIT
dff0: 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65  E_MAX_LENGTH.# e
e000: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
e010: 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  SQL_LENGTH must 
e020: 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20 74  not be greater t
e030: 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  han SQLITE_MAX_L
e040: 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66  ENGTH.#endif.#if
e050: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
e060: 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20  OUND_SELECT<2.# 
e070: 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
e080: 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
e090: 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
e0a0: 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 2.#endif.#if S
e0b0: 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
e0c0: 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  P<40.# error SQL
e0d0: 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20  ITE_MAX_VDBE_OP 
e0e0: 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
e0f0: 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   40.#endif.#if S
e100: 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
e110: 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49  ON_ARG<0 || SQLI
e120: 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
e130: 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72  ARG>1000.# error
e140: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
e150: 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65  TION_ARG must be
e160: 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31   between 0 and 1
e170: 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  000.#endif.#if S
e180: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
e190: 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  ED<0 || SQLITE_M
e1a0: 41 58 5f 41 54 54 41 43 48 45 44 3e 36 32 0a 23  AX_ATTACHED>62.#
e1b0: 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
e1c0: 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74 20  X_ATTACHED must 
e1d0: 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
e1e0: 20 36 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   62.#endif.#if S
e1f0: 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
e200: 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a  ATTERN_LENGTH<1.
e210: 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
e220: 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
e230: 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
e240: 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66  t least 1.#endif
e250: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
e260: 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65  COLUMN>32767.# e
e270: 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
e280: 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20  COLUMN must not 
e290: 65 78 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e  exceed 32767.#en
e2a0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
e2b0: 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
e2c0: 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <1.# error SQLIT
e2d0: 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
e2e0: 50 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  PTH must be at l
e2f0: 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a 0a  east 1.#endif...
e300: 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
e310: 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69   value of a limi
e320: 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f  t.  Report the o
e330: 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20  ld value..** If 
e340: 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74  an invalid limit
e350: 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69   index is suppli
e360: 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a  ed, report -1..*
e370: 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
e380: 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f  s but still repo
e390: 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
e3a0: 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c   if the.** new l
e3b0: 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
e3c0: 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f  ..**.** A new lo
e3d0: 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e  wer limit does n
e3e0: 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69  ot shrink existi
e3f0: 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a  ng constructs..*
e400: 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76  * It merely prev
e410: 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75  ents new constru
e420: 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20  cts that exceed 
e430: 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f  the limit.** fro
e440: 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e  m forming..*/.in
e450: 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28  t sqlite3_limit(
e460: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
e470: 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65   limitId, int ne
e480: 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f  wLimit){.  int o
e490: 6c 64 4c 69 6d 69 74 3b 0a 0a 0a 20 20 2f 2a 20  ldLimit;...  /* 
e4a0: 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
e4b0: 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65  0189-54097 For e
e4c0: 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f  ach limit catego
e4d0: 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  ry SQLITE_LIMIT_
e4e0: 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20  NAME.  ** there 
e4f0: 69 73 20 61 20 68 61 72 64 20 75 70 70 65 72 20  is a hard upper 
e500: 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d  bound set at com
e510: 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43  pile-time by a C
e520: 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20   preprocessor.  
e530: 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20  ** macro called 
e540: 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e  SQLITE_MAX_NAME.
e550: 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20   (The "_LIMIT_" 
e560: 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63  in the name is c
e570: 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22  hanged to.  ** "
e580: 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20  _MAX_".).  */.  
e590: 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
e5a0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
e5b0: 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  LENGTH]==SQLITE_
e5c0: 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  MAX_LENGTH );.  
e5d0: 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
e5e0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
e5f0: 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c  SQL_LENGTH]==SQL
e600: 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
e610: 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
e620: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
e630: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d  E_LIMIT_COLUMN]=
e640: 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55  =SQLITE_MAX_COLU
e650: 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  MN );.  assert( 
e660: 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
e670: 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
e680: 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
e690: 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20  EXPR_DEPTH );.  
e6a0: 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
e6b0: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
e6c0: 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d  COMPOUND_SELECT]
e6d0: 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  ==SQLITE_MAX_COM
e6e0: 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20  POUND_SELECT);. 
e6f0: 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
e700: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
e710: 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54  _VDBE_OP]==SQLIT
e720: 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b  E_MAX_VDBE_OP );
e730: 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
e740: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
e750: 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d  IT_FUNCTION_ARG]
e760: 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  ==SQLITE_MAX_FUN
e770: 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61  CTION_ARG );.  a
e780: 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
e790: 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41  t[SQLITE_LIMIT_A
e7a0: 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45  TTACHED]==SQLITE
e7b0: 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b  _MAX_ATTACHED );
e7c0: 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
e7d0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
e7e0: 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
e7f0: 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20  LENGTH]==.      
e800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e820: 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
e830: 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
e840: 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
e850: 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
e860: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
e870: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53  IABLE_NUMBER]==S
e880: 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
e890: 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73  LE_NUMBER);.  as
e8a0: 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
e8b0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52  [SQLITE_LIMIT_TR
e8c0: 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51  IGGER_DEPTH]==SQ
e8d0: 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
e8e0: 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
e8f0: 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  rt( SQLITE_LIMIT
e900: 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3d 3d  _TRIGGER_DEPTH==
e910: 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d  (SQLITE_N_LIMIT-
e920: 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69  1) );...  if( li
e930: 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74  mitId<0 || limit
e940: 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d  Id>=SQLITE_N_LIM
e950: 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  IT ){.    return
e960: 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69   -1;.  }.  oldLi
e970: 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  mit = db->aLimit
e980: 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28  [limitId];.  if(
e990: 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20   newLimit>=0 ){ 
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9b0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37    /* IMP: R-5247
e9c0: 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69  6-28732 */.    i
e9d0: 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72  f( newLimit>aHar
e9e0: 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20  dLimit[limitId] 
e9f0: 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69  ){.      newLimi
ea00: 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c  t = aHardLimit[l
ea10: 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50  imitId];  /* IMP
ea20: 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20  : R-51463-25634 
ea30: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  */.    }.    db-
ea40: 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
ea50: 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d   = newLimit;.  }
ea60: 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d  .  return oldLim
ea70: 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
ea80: 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
ea90: 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f  R-53341-35419 */
eaa0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
eab0: 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
eac0: 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55 52  to parse both UR
ead0: 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66  Is and non-URI f
eae0: 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20  ilenames passed 
eaf0: 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74  by the.** user t
eb00: 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20  o API functions 
eb10: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f  sqlite3_open() o
eb20: 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
eb30: 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74  2(), and for dat
eb40: 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70  abase.** URIs sp
eb50: 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
eb60: 6f 66 20 41 54 54 41 43 48 20 73 74 61 74 65 6d  of ATTACH statem
eb70: 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ents..**.** The 
eb80: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
eb90: 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
eba0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
ebb0: 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f  he VFS to use (o
ebc0: 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73  r.** a NULL to s
ebd0: 69 67 6e 69 66 79 20 74 68 65 20 64 65 66 61 75  ignify the defau
ebe0: 6c 74 20 56 46 53 29 20 69 66 20 74 68 65 20 55  lt VFS) if the U
ebf0: 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  RI does not cont
ec00: 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a  ain a "vfs=xxx".
ec10: 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ** query paramet
ec20: 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  er. The second a
ec30: 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73  rgument contains
ec40: 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e   the URI (or non
ec50: 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a  -URI filename).*
ec60: 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74  * itself. When t
ec70: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
ec80: 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61  called the *pFla
ec90: 67 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75  gs variable shou
eca0: 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68  ld contain.** th
ecb0: 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20  e default flags 
ecc0: 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
ecd0: 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68  base handle with
ece0: 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72  . The value stor
ecf0: 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73  ed in.** *pFlags
ed00: 20 6d 61 79 20 62 65 20 75 70 64 61 74 65 64 20   may be updated 
ed10: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
ed20: 20 69 66 20 74 68 65 20 55 52 49 20 66 69 6c 65   if the URI file
ed30: 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a  name contains .*
ed40: 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72  * "cache=xxx" or
ed50: 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72   "mode=xxx" quer
ed60: 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a  y parameters..**
ed70: 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
ed80: 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
ed90: 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
eda0: 73 20 63 61 73 65 20 2a 70 70 56 66 73 20 69 73  s case *ppVfs is
edb0: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
edc0: 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61 74  .** the VFS that
edd0: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
ede0: 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
edf0: 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69  base file. *pzFi
ee00: 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  le is set to.** 
ee10: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
ee20: 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
ee30: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
ee40: 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73  e to open. It is
ee50: 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
ee60: 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
ee70: 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
ee80: 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  lly call sqlite3
ee90: 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61  _free() to relea
eea0: 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  se.** this buffe
eeb0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  r..**.** If an e
eec0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
eed0: 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
eee0: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
eef0: 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67  ed and *pzErrMsg
ef00: 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74  .** may be set t
ef10: 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
ef20: 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
ef30: 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
ef40: 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73  ge error .** mes
ef50: 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20  sage. It is the 
ef60: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
ef70: 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
ef80: 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
ef90: 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  se.** this buffe
efa0: 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  r by calling sql
efb0: 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
efc0: 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73 65  int sqlite3Parse
efd0: 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  Uri(.  const cha
efe0: 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20  r *zDefaultVfs, 
eff0: 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f         /* VFS to
f000: 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d   use if no "vfs=
f010: 78 78 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f  xxx" query optio
f020: 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
f030: 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20  r *zUri,        
f040: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65         /* Nul-te
f050: 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20  rminated URI to 
f060: 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67  parse */.  unsig
f070: 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c  ned int *pFlags,
f080: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
f090: 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45  /OUT: SQLITE_OPE
f0a0: 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  N_XXX flags */. 
f0b0: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70   sqlite3_vfs **p
f0c0: 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
f0d0: 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20   /* OUT: VFS to 
f0e0: 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a  use */ .  char *
f0f0: 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20  *pzFile,        
f100: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
f110: 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f  : Filename compo
f120: 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20  nent of URI */. 
f130: 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
f140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f150: 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d   /* OUT: Error m
f160: 65 73 73 61 67 65 20 28 69 66 20 72 63 21 3d 53  essage (if rc!=S
f170: 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a  QLITE_OK) */.){.
f180: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
f190: 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64  E_OK;.  unsigned
f1a0: 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46   int flags = *pF
f1b0: 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68  lags;.  const ch
f1c0: 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61  ar *zVfs = zDefa
f1d0: 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a  ultVfs;.  char *
f1e0: 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b  zFile;.  char c;
f1f0: 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71  .  int nUri = sq
f200: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55  lite3Strlen30(zU
f210: 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ri);..  assert( 
f220: 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a  *pzErrMsg==0 );.
f230: 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73 20 26  .  if( ((flags &
f240: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
f250: 29 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62  ) || sqlite3Glob
f260: 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72  alConfig.bOpenUr
f270: 69 29 20 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d  i) .   && nUri>=
f280: 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69  5 && memcmp(zUri
f290: 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30  , "file:", 5)==0
f2a0: 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20   .  ){.    char 
f2b0: 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20 65  *zOpt;.    int e
f2c0: 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  State;          
f2d0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
f2e0: 65 72 20 73 74 61 74 65 20 77 68 65 6e 20 70 61  er state when pa
f2f0: 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20  rsing URI */.   
f300: 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20 20   int iIn;       
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f320: 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63 74 65  * Input characte
f330: 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  r index */.    i
f340: 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20 20  nt iOut = 0;    
f350: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f360: 4f 75 74 70 75 74 20 63 68 61 72 61 63 74 65 72  Output character
f370: 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
f380: 74 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b 32  t nByte = nUri+2
f390: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
f3a0: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f  ytes of space to
f3b0: 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20   allocate */..  
f3c0: 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
f3d0: 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  he SQLITE_OPEN_U
f3e0: 52 49 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  RI flag is set t
f3f0: 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74 68  o indicate to th
f400: 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20 20  e VFS xOpen .   
f410: 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74 20   ** method that 
f420: 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 78 74  there may be ext
f430: 72 61 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f  ra parameters fo
f440: 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  llowing the file
f450: 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66  -name.  */.    f
f460: 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
f470: 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f  PEN_URI;..    fo
f480: 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72  r(iIn=0; iIn<nUr
f490: 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20  i; iIn++) nByte 
f4a0: 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27  += (zUri[iIn]=='
f4b0: 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d  &');.    zFile =
f4c0: 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
f4d0: 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
f4e0: 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !zFile ) return 
f4f0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20  SQLITE_NOMEM;.. 
f500: 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
f510: 65 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74  e scheme and aut
f520: 68 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20  hority segments 
f530: 6f 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20  of the URI. */. 
f540: 20 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d     if( zUri[5]==
f550: 27 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d  '/' && zUri[6]==
f560: 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e  '/' ){.      iIn
f570: 20 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 7;.      whil
f580: 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20  e( zUri[iIn] && 
f590: 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29  zUri[iIn]!='/' )
f5a0: 20 69 49 6e 2b 2b 3b 0a 0a 20 20 20 20 20 20 69   iIn++;..      i
f5b0: 66 28 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49  f( iIn!=7 && (iI
f5c0: 6e 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28  n!=16 || memcmp(
f5d0: 22 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55  "localhost", &zU
f5e0: 72 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20  ri[7], 9)) ){.  
f5f0: 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
f600: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
f610: 66 28 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61  f("invalid uri a
f620: 75 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c  uthority: %.*s",
f630: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49   .            iI
f640: 6e 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a  n-7, &zUri[7]);.
f650: 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
f660: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
f670: 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
f680: 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20  i_out;.      }. 
f690: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f6a0: 69 49 6e 20 3d 20 35 3b 0a 20 20 20 20 7d 0a 0a  iIn = 5;.    }..
f6b0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
f6c0: 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 61 6e 79  filename and any
f6d0: 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
f6e0: 73 20 69 6e 74 6f 20 74 68 65 20 7a 46 69 6c 65  s into the zFile
f6f0: 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 2a 2a   buffer. .    **
f700: 20 44 65 63 6f 64 65 20 25 48 48 20 65 73 63 61   Decode %HH esca
f710: 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e 67 20 74  pe codes along t
f720: 68 65 20 77 61 79 2e 20 0a 20 20 20 20 2a 2a 0a  he way. .    **.
f730: 20 20 20 20 2a 2a 20 57 69 74 68 69 6e 20 74 68      ** Within th
f740: 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69 61 62 6c  is loop, variabl
f750: 65 20 65 53 74 61 74 65 20 6d 61 79 20 62 65 20  e eState may be 
f760: 73 65 74 20 74 6f 20 30 2c 20 31 20 6f 72 20 32  set to 0, 1 or 2
f770: 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20 20  , depending.    
f780: 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72 73 69 6e  ** on the parsin
f790: 67 20 63 6f 6e 74 65 78 74 2e 20 41 73 20 66 6f  g context. As fo
f7a0: 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20 20  llows:.    **.  
f7b0: 20 20 2a 2a 20 20 20 30 3a 20 50 61 72 73 69 6e    **   0: Parsin
f7c0: 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20  g file-name..   
f7d0: 20 2a 2a 20 20 20 31 3a 20 50 61 72 73 69 6e 67   **   1: Parsing
f7e0: 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e 20 6f 66   name section of
f7f0: 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75   a name=value qu
f800: 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20  ery parameter.. 
f810: 20 20 20 2a 2a 20 20 20 32 3a 20 50 61 72 73 69     **   2: Parsi
f820: 6e 67 20 76 61 6c 75 65 20 73 65 63 74 69 6f 6e  ng value section
f830: 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65   of a name=value
f840: 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
f850: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 53 74  ..    */.    eSt
f860: 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 77 68 69  ate = 0;.    whi
f870: 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49  le( (c = zUri[iI
f880: 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27  n])!=0 && c!='#'
f890: 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 2b 2b 3b   ){.      iIn++;
f8a0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 25  .      if( c=='%
f8b0: 27 20 0a 20 20 20 20 20 20 20 26 26 20 73 71 6c  ' .       && sql
f8c0: 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55 72  ite3Isxdigit(zUr
f8d0: 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20 20 20 20  i[iIn]) .       
f8e0: 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67  && sqlite3Isxdig
f8f0: 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31 5d 29 20  it(zUri[iIn+1]) 
f900: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
f910: 20 20 69 6e 74 20 6f 63 74 65 74 20 3d 20 28 73    int octet = (s
f920: 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28 7a  qlite3HexToInt(z
f930: 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34  Uri[iIn++]) << 4
f940: 29 3b 0a 20 20 20 20 20 20 20 20 6f 63 74 65 74  );.        octet
f950: 20 2b 3d 20 73 71 6c 69 74 65 33 48 65 78 54 6f   += sqlite3HexTo
f960: 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29  Int(zUri[iIn++])
f970: 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ;..        asser
f980: 74 28 20 6f 63 74 65 74 3e 3d 30 20 26 26 20 6f  t( octet>=0 && o
f990: 63 74 65 74 3c 32 35 36 20 29 3b 0a 20 20 20 20  ctet<256 );.    
f9a0: 20 20 20 20 69 66 28 20 6f 63 74 65 74 3d 3d 30      if( octet==0
f9b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
f9c0: 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73 20   This branch is 
f9d0: 74 61 6b 65 6e 20 77 68 65 6e 20 22 25 30 30 22  taken when "%00"
f9e0: 20 61 70 70 65 61 72 73 20 77 69 74 68 69 6e 20   appears within 
f9f0: 74 68 65 20 55 52 49 2e 20 49 6e 20 74 68 69 73  the URI. In this
fa00: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
fa10: 73 65 20 77 65 20 69 67 6e 6f 72 65 20 61 6c 6c  se we ignore all
fa20: 20 74 65 78 74 20 69 6e 20 74 68 65 20 72 65 6d   text in the rem
fa30: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 70 61  ainder of the pa
fa40: 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20 20  th, name or.    
fa50: 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 63        ** value c
fa60: 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20 70  urrently being p
fa70: 61 72 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72 65  arsed. So ignore
fa80: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61   the current cha
fa90: 72 61 63 74 65 72 0a 20 20 20 20 20 20 20 20 20  racter.         
faa0: 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f 20   ** and skip to 
fab0: 74 68 65 20 6e 65 78 74 20 22 3f 22 2c 20 22 3d  the next "?", "=
fac0: 22 20 6f 72 20 22 26 22 2c 20 61 73 20 61 70 70  " or "&", as app
fad0: 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20 20  ropriate. */.   
fae0: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63         while( (c
faf0: 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d 30   = zUri[iIn])!=0
fb00: 20 26 26 20 63 21 3d 27 23 27 20 0a 20 20 20 20   && c!='#' .    
fb10: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
fb20: 74 61 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27 3f  tate!=0 || c!='?
fb30: 27 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ').             
fb40: 20 26 26 20 28 65 53 74 61 74 65 21 3d 31 20 7c   && (eState!=1 |
fb50: 7c 20 28 63 21 3d 27 3d 27 20 26 26 20 63 21 3d  | (c!='=' && c!=
fb60: 27 26 27 29 29 0a 20 20 20 20 20 20 20 20 20 20  '&')).          
fb70: 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d      && (eState!=
fb80: 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20 20  2 || c!='&').   
fb90: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
fba0: 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20        iIn++;.   
fbb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
fbc0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
fbd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
fbe0: 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20 20 20   = octet;.      
fbf0: 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74 65  }else if( eState
fc00: 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26 27 20 7c  ==1 && (c=='&' |
fc10: 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20 20  | c=='=') ){.   
fc20: 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 69       if( zFile[i
fc30: 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20  Out-1]==0 ){.   
fc40: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d 70         /* An emp
fc50: 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e 20  ty option name. 
fc60: 49 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74 69  Ignore this opti
fc70: 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e 20 2a  on altogether. *
fc80: 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  /.          whil
fc90: 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20  e( zUri[iIn] && 
fca0: 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20 26  zUri[iIn]!='#' &
fcb0: 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d 27  & zUri[iIn-1]!='
fcc0: 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20 20  &' ) iIn++;.    
fcd0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
fce0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fcf0: 20 20 69 66 28 20 63 3d 3d 27 26 27 20 29 7b 0a    if( c=='&' ){.
fd00: 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65 5b            zFile[
fd10: 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
fd20: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
fd30: 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20           eState 
fd40: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 2;.        }. 
fd50: 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20 20         c = 0;.  
fd60: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 65      }else if( (e
fd70: 53 74 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d 27  State==0 && c=='
fd80: 3f 27 29 20 7c 7c 20 28 65 53 74 61 74 65 3d 3d  ?') || (eState==
fd90: 32 20 26 26 20 63 3d 3d 27 26 27 29 20 29 7b 0a  2 && c=='&') ){.
fda0: 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20          c = 0;. 
fdb0: 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d 20         eState = 
fdc0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
fdd0: 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d   zFile[iOut++] =
fde0: 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   c;.    }.    if
fdf0: 28 20 65 53 74 61 74 65 3d 3d 31 20 29 20 7a 46  ( eState==1 ) zF
fe00: 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
fe10: 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f  0';.    zFile[iO
fe20: 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  ut++] = '\0';.  
fe30: 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
fe40: 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20  = '\0';..    /* 
fe50: 43 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 77  Check if there w
fe60: 65 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73 20  ere any options 
fe70: 73 70 65 63 69 66 69 65 64 20 74 68 61 74 20 73  specified that s
fe80: 68 6f 75 6c 64 20 62 65 20 69 6e 74 65 72 70 72  hould be interpr
fe90: 65 74 65 64 20 0a 20 20 20 20 2a 2a 20 68 65 72  eted .    ** her
fea0: 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61 74 20  e. Options that 
feb0: 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 64 20  are interpreted 
fec0: 68 65 72 65 20 69 6e 63 6c 75 64 65 20 22 76 66  here include "vf
fed0: 73 22 20 61 6e 64 20 74 68 6f 73 65 20 74 68 61  s" and those tha
fee0: 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 73 70  t.    ** corresp
fef0: 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20 74 68 61  ond to flags tha
ff00: 74 20 6d 61 79 20 62 65 20 70 61 73 73 65 64 20  t may be passed 
ff10: 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6f  to the sqlite3_o
ff20: 70 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a 20  pen_v2().    ** 
ff30: 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a  method. */.    z
ff40: 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71 6c  Opt = &zFile[sql
ff50: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
ff60: 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69 6c  le)+1];.    whil
ff70: 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20 20  e( zOpt[0] ){.  
ff80: 20 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20 73      int nOpt = s
ff90: 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
ffa0: 4f 70 74 29 3b 0a 20 20 20 20 20 20 63 68 61 72  Opt);.      char
ffb0: 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e   *zVal = &zOpt[n
ffc0: 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69 6e  Opt+1];.      in
ffd0: 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65 33  t nVal = sqlite3
ffe0: 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b 0a  Strlen30(zVal);.
fff0: 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d  .      if( nOpt=
10000 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 22 76 66  =3 && memcmp("vf
10010 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30 20  s", zOpt, 3)==0 
10020 29 7b 0a 20 20 20 20 20 20 20 20 7a 56 66 73 20  ){.        zVfs 
10030 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d 65  = zVal;.      }e
10040 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 72  lse{.        str
10050 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20  uct OpenMode {. 
10060 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
10070 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20 20  har *z;.        
10080 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20 20    int mode;.    
10090 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20 30      } *aMode = 0
100a0 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  ;.        char *
100b0 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a 20  zModeType = 0;. 
100c0 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b 20         int mask 
100d0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
100e0 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20 20   limit = 0;..   
100f0 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 35       if( nOpt==5
10100 20 26 26 20 6d 65 6d 63 6d 70 28 22 63 61 63 68   && memcmp("cach
10110 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30 20  e", zOpt, 5)==0 
10120 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 61  ){.          sta
10130 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e 4d  tic struct OpenM
10140 6f 64 65 20 61 43 61 63 68 65 4d 6f 64 65 5b 5d  ode aCacheMode[]
10150 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
10160 20 7b 20 22 73 68 61 72 65 64 22 2c 20 20 53 51   { "shared",  SQ
10170 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
10180 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20 20  CACHE },.       
10190 20 20 20 20 20 7b 20 22 70 72 69 76 61 74 65 22       { "private"
101a0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  , SQLITE_OPEN_PR
101b0 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20 20  IVATECACHE },.  
101c0 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30            { 0, 0
101d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a   }.          };.
101e0 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20  .          mask 
101f0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48  = SQLITE_OPEN_SH
10200 41 52 45 44 43 41 43 48 45 7c 53 51 4c 49 54 45  AREDCACHE|SQLITE
10210 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
10220 48 45 3b 0a 20 20 20 20 20 20 20 20 20 20 61 4d  HE;.          aM
10230 6f 64 65 20 3d 20 61 43 61 63 68 65 4d 6f 64 65  ode = aCacheMode
10240 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69  ;.          limi
10250 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20 20  t = mask;.      
10260 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20      zModeType = 
10270 22 63 61 63 68 65 22 3b 0a 20 20 20 20 20 20 20  "cache";.       
10280 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e   }.        if( n
10290 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d 70  Opt==4 && memcmp
102a0 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20 34  ("mode", zOpt, 4
102b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
102c0 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74 20    static struct 
102d0 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f  OpenMode aOpenMo
102e0 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20  de[] = {.       
102f0 20 20 20 20 20 7b 20 22 72 6f 22 2c 20 20 53 51       { "ro",  SQ
10300 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
10310 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  LY },.          
10320 20 20 7b 20 22 72 77 22 2c 20 20 53 51 4c 49 54    { "rw",  SQLIT
10330 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
10340 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20   }, .           
10350 20 7b 20 22 72 77 63 22 2c 20 53 51 4c 49 54 45   { "rwc", SQLITE
10360 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20  _OPEN_READWRITE 
10370 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
10380 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 20 20  EATE },.        
10390 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c 20      { "memory", 
103a0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
103b0 52 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20  RY },.          
103c0 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20    { 0, 0 }.     
103d0 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20       };..       
103e0 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45     mask = SQLITE
103f0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c  _OPEN_READONLY |
10400 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
10410 44 57 52 49 54 45 0a 20 20 20 20 20 20 20 20 20  DWRITE.         
10420 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
10430 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c  TE_OPEN_CREATE |
10440 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
10450 4f 52 59 3b 0a 20 20 20 20 20 20 20 20 20 20 61  ORY;.          a
10460 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64 65  Mode = aOpenMode
10470 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d 69  ;.          limi
10480 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67 73  t = mask & flags
10490 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64  ;.          zMod
104a0 65 54 79 70 65 20 3d 20 22 61 63 63 65 73 73 22  eType = "access"
104b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
104c0 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65 20 29       if( aMode )
104d0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
104e0 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  i;.          int
104f0 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20 20   mode = 0;.     
10500 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61 4d       for(i=0; aM
10510 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a  ode[i].z; i++){.
10520 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
10530 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f 64  t char *z = aMod
10540 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20 20  e[i].z;.        
10550 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73 71      if( nVal==sq
10560 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29  lite3Strlen30(z)
10570 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56   && 0==memcmp(zV
10580 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a  al, z, nVal) ){.
10590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f                mo
105a0 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f  de = aMode[i].mo
105b0 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  de;.            
105c0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
105d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
105e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
105f0 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20 20   mode==0 ){.    
10600 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
10610 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
10620 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25 73 20  ntf("no such %s 
10630 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64 65  mode: %s", zMode
10640 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20  Type, zVal);.   
10650 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
10660 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
10670 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
10680 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20  se_uri_out;.    
10690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
106a0 20 20 69 66 28 20 28 6d 6f 64 65 20 26 20 7e 53    if( (mode & ~S
106b0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52  QLITE_OPEN_MEMOR
106c0 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20 20  Y)>limit ){.    
106d0 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73          *pzErrMs
106e0 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  g = sqlite3_mpri
106f0 6e 74 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f 74  ntf("%s mode not
10700 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a 20   allowed: %s",. 
10710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10730 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65         zModeType
10740 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , zVal);.       
10750 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
10760 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 20 20 20  _PERM;.         
10770 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72     goto parse_ur
10780 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 20  i_out;.         
10790 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6c 61   }.          fla
107a0 67 73 20 3d 20 28 66 6c 61 67 73 20 26 20 7e 6d  gs = (flags & ~m
107b0 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20 20  ask) | mode;.   
107c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
107d0 20 20 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 56        zOpt = &zV
107e0 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20 20  al[nVal+1];.    
107f0 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  }..  }else{.    
10800 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  zFile = sqlite3_
10810 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b 32 29 3b 0a  malloc(nUri+2);.
10820 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29      if( !zFile )
10830 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
10840 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 63 70 79  OMEM;.    memcpy
10850 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e 55  (zFile, zUri, nU
10860 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e  ri);.    zFile[n
10870 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  Uri] = '\0';.   
10880 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d   zFile[nUri+1] =
10890 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67 73   '\0';.    flags
108a0 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
108b0 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70  _URI;.  }..  *pp
108c0 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
108d0 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20 20  s_find(zVfs);.  
108e0 69 66 28 20 2a 70 70 56 66 73 3d 3d 30 20 29 7b  if( *ppVfs==0 ){
108f0 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d  .    *pzErrMsg =
10900 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
10910 28 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20 25  ("no such vfs: %
10920 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20 72  s", zVfs);.    r
10930 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
10940 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75 72 69  ;.  }. parse_uri
10950 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21 3d  _out:.  if( rc!=
10960 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
10970 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 46   sqlite3_free(zF
10980 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20  ile);.    zFile 
10990 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c 61  = 0;.  }.  *pFla
109a0 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a 70  gs = flags;.  *p
109b0 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20  zFile = zFile;. 
109c0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
109d0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
109e0 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72 6b  ne does the work
109f0 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20 64 61   of opening a da
10a00 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61 6c 66  tabase on behalf
10a10 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f   of.** sqlite3_o
10a20 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74 65  pen() and sqlite
10a30 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68 65 20  3_open16(). The 
10a40 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  database filenam
10a50 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20 0a  e "zFilename"  .
10a60 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e 63 6f  ** is UTF-8 enco
10a70 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ded..*/.static i
10a80 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28  nt openDatabase(
10a90 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
10aa0 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61 74  Filename, /* Dat
10ab0 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 55  abase filename U
10ac0 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f 0a  TF-8 encoded */.
10ad0 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
10ae0 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a  ,        /* OUT:
10af0 20 52 65 74 75 72 6e 65 64 20 64 61 74 61 62 61   Returned databa
10b00 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 75  se handle */.  u
10b10 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67  nsigned int flag
10b20 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 69  s,    /* Operati
10b30 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20 20  onal flags */.  
10b40 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73  const char *zVfs
10b50 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
10b60 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73 65  f the VFS to use
10b70 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
10b80 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
10b90 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72           /* Stor
10ba0 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e 64  e allocated hand
10bb0 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74  le here */.  int
10bc0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10be0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
10bf0 20 69 6e 74 20 69 73 54 68 72 65 61 64 73 61 66   int isThreadsaf
10c00 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
10c10 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68 72   /* True for thr
10c20 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63 74 69  eadsafe connecti
10c30 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ons */.  char *z
10c40 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20 20  Open = 0;       
10c50 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
10c60 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74 6f  name argument to
10c70 20 70 61 73 73 20 74 6f 20 42 74 72 65 65 4f 70   pass to BtreeOp
10c80 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  en() */.  char *
10c90 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20 20  zErrMsg = 0;    
10ca0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72            /* Err
10cb0 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d 20  or message from 
10cc0 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
10cd0 29 20 2a 2f 0a 0a 20 20 2a 70 70 44 62 20 3d 20  ) */..  *ppDb = 
10ce0 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
10cf0 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
10d00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69    rc = sqlite3_i
10d10 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
10d20 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
10d30 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20  c;.#endif..  /* 
10d40 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73 69  Only allow sensi
10d50 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73  ble combinations
10d60 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20   of bits in the 
10d70 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e 20  flags argument. 
10d80 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e 20   .  ** Throw an 
10d90 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f 6e  error if any non
10da0 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74 69  -sense combinati
10db0 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66 20  on is used.  If 
10dc0 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20 62  we.  ** do not b
10dd0 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f 6d  lock illegal com
10de0 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c 20  binations here, 
10df0 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65 72  it could trigger
10e00 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 73  .  ** assert() s
10e10 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65 65  tatements in dee
10e20 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65 6e  per layers.  Sen
10e30 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sible combinatio
10e40 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20 2a  ns.  ** are:.  *
10e50 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c 49  *.  **  1:  SQLI
10e60 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
10e70 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49 54  .  **  2:  SQLIT
10e80 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
10e90 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49 54  .  **  6:  SQLIT
10ea0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
10eb0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
10ec0 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73 73  REATE.  */.  ass
10ed0 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e  ert( SQLITE_OPEN
10ee0 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30 78  _READONLY  == 0x
10ef0 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  01 );.  assert( 
10f00 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
10f10 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29 3b  WRITE == 0x02 );
10f20 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
10f30 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20 20  E_OPEN_CREATE   
10f40 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74 65   == 0x04 );.  te
10f50 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61  stcase( (1<<(fla
10f60 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b 20  gs&7))==0x02 ); 
10f70 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20  /* READONLY */. 
10f80 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
10f90 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34 20  flags&7))==0x04 
10fa0 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20  ); /* READWRITE 
10fb0 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20 28  */.  testcase( (
10fc0 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30  1<<(flags&7))==0
10fd0 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57 52  x40 ); /* READWR
10fe0 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f 0a  ITE | CREATE */.
10ff0 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61 67    if( ((1<<(flag
11000 73 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d 30  s&7)) & 0x46)==0
11010 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
11020 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a 20  _MISUSE_BKPT;.. 
11030 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
11040 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75  alConfig.bCoreMu
11050 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69 73  tex==0 ){.    is
11060 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b 0a  Threadsafe = 0;.
11070 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61 67    }else if( flag
11080 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
11090 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69  NOMUTEX ){.    i
110a0 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
110b0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
110c0 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
110d0 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20 20  _FULLMUTEX ){.  
110e0 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
110f0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
11100 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
11110 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
11120 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b 0a  fig.bFullMutex;.
11130 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73 20    }.  if( flags 
11140 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  & SQLITE_OPEN_PR
11150 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20 20  IVATECACHE ){.  
11160 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49    flags &= ~SQLI
11170 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
11180 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  CHE;.  }else if(
11190 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
111a0 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68 65  nfig.sharedCache
111b0 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20 66  Enabled ){.    f
111c0 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
111d0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b  PEN_SHAREDCACHE;
111e0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76  .  }..  /* Remov
111f0 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20 66  e harmful bits f
11200 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70 61  rom the flags pa
11210 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20 2a  rameter.  **.  *
11220 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50 45  * The SQLITE_OPE
11230 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53 51  N_NOMUTEX and SQ
11240 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
11250 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a 20  TEX flags were. 
11260 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20 69   ** dealt with i
11270 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 63  n the previous c
11280 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73 69  ode block.  Besi
11290 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20 6f  des these, the o
112a0 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20 69  nly.  ** valid i
112b0 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20 73  nput flags for s
112c0 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29  qlite3_open_v2()
112d0 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e   are SQLITE_OPEN
112e0 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20  _READONLY,.  ** 
112f0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
11300 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50  WRITE, SQLITE_OP
11310 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49 54  EN_CREATE, SQLIT
11320 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43  E_OPEN_SHAREDCAC
11330 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  HE,.  ** SQLITE_
11340 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48  OPEN_PRIVATECACH
11350 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73 65  E, and some rese
11360 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c 65  rved bits.  Sile
11370 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f  ntly mask.  ** o
11380 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c 61  ff all other fla
11390 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67 73  gs..  */.  flags
113a0 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f 4f   &=  ~( SQLITE_O
113b0 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
113c0 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
113d0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
113e0 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20 20  XCLUSIVE |.     
113f0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
11400 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a  _OPEN_MAIN_DB |.
11410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
11420 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
11430 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20  DB | .          
11440 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
11450 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c 20  _TRANSIENT_DB | 
11460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11470 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
11480 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  _JOURNAL | .    
11490 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
114a0 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52  E_OPEN_TEMP_JOUR
114b0 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20  NAL | .         
114c0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
114d0 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a  N_SUBJOURNAL | .
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
114f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
11500 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20 20  R_JOURNAL |.    
11510 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
11520 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c  E_OPEN_NOMUTEX |
11530 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
11540 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
11550 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20 20  MUTEX |.        
11560 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
11570 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20 20  EN_WAL.         
11580 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c      );..  /* All
11590 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74 65  ocate the sqlite
115a0 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65 20   data structure 
115b0 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65  */.  db = sqlite
115c0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69 7a  3MallocZero( siz
115d0 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b 0a  eof(sqlite3) );.
115e0 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67 6f    if( db==0 ) go
115f0 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
11600 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61 66   if( isThreadsaf
11610 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75 74  e ){.    db->mut
11620 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74 65  ex = sqlite3Mute
11630 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  xAlloc(SQLITE_MU
11640 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a  TEX_RECURSIVE);.
11650 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74 65      if( db->mute
11660 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  x==0 ){.      sq
11670 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b 0a  lite3_free(db);.
11680 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20        db = 0;.  
11690 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f      goto opendb_
116a0 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  out;.    }.  }. 
116b0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
116c0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
116d0 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
116e0 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44 62   0xff;.  db->nDb
116f0 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67 69   = 2;.  db->magi
11700 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43  c = SQLITE_MAGIC
11710 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44 62  _BUSY;.  db->aDb
11720 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69 63   = db->aDbStatic
11730 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69 7a  ;..  assert( siz
11740 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29 3d  eof(db->aLimit)=
11750 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69 6d  =sizeof(aHardLim
11760 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79 28  it) );.  memcpy(
11770 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61 72  db->aLimit, aHar
11780 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28 64  dLimit, sizeof(d
11790 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20 64  b->aLimit));.  d
117a0 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20  b->autoCommit = 
117b0 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75 74  1;.  db->nextAut
117c0 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d  ovac = -1;.  db-
117d0 3e 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20  >nextPagesize = 
117e0 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73 20 7c  0;.  db->flags |
117f0 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74 43 6f  = SQLITE_ShortCo
11800 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54 45 5f  lNames | SQLITE_
11810 41 75 74 6f 49 6e 64 65 78 20 7c 20 53 51 4c 49  AutoIndex | SQLI
11820 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
11830 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  .#if SQLITE_DEFA
11840 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c  ULT_FILE_FORMAT<
11850 34 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  4.              
11860 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61     | SQLITE_Lega
11870 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66  cyFileFmt.#endif
11880 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
11890 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e  NABLE_LOAD_EXTEN
118a0 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20 20 20  SION.           
118b0 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c        | SQLITE_L
118c0 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e  oadExtension.#en
118d0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  dif.#if SQLITE_D
118e0 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49 56 45  EFAULT_RECURSIVE
118f0 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20 20 20  _TRIGGERS.      
11900 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
11910 49 54 45 5f 52 65 63 54 72 69 67 67 65 72 73 0a  ITE_RecTriggers.
11920 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
11930 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  ed(SQLITE_DEFAUL
11940 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20  T_FOREIGN_KEYS) 
11950 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c  && SQLITE_DEFAUL
11960 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20  T_FOREIGN_KEYS. 
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11980 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e  | SQLITE_Foreign
11990 4b 65 79 73 0a 23 65 6e 64 69 66 0a 20 20 20 20  Keys.#endif.    
119a0 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48 61 73    ;.  sqlite3Has
119b0 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c  hInit(&db->aColl
119c0 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  Seq);.#ifndef SQ
119d0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
119e0 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74 65 33  LTABLE.  sqlite3
119f0 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d  HashInit(&db->aM
11a00 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
11a10 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64 65 66    /* Add the def
11a20 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ault collation s
11a30 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59 2e 20  equence BINARY. 
11a40 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66 6f 72  BINARY works for
11a50 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a   both UTF-8.  **
11a60 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73 6f 20   and UTF-16, so 
11a70 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20 66 6f  add a version fo
11a80 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69 64 20  r each to avoid 
11a90 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72 79 0a  any unnecessary.
11aa0 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73    ** conversions
11ab0 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72  . The only error
11ac0 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75 72 20   that can occur 
11ad0 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63  here is a malloc
11ae0 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2f  () failure..  */
11af0 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69  .  createCollati
11b00 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c  on(db, "BINARY",
11b10 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
11b20 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29   binCollFunc, 0)
11b30 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  ;.  createCollat
11b40 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59 22  ion(db, "BINARY"
11b50 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  , SQLITE_UTF16BE
11b60 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63  , 0, binCollFunc
11b70 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f  , 0);.  createCo
11b80 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e  llation(db, "BIN
11b90 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  ARY", SQLITE_UTF
11ba0 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c  16LE, 0, binColl
11bb0 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61  Func, 0);.  crea
11bc0 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20  teCollation(db, 
11bd0 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f  "RTRIM", SQLITE_
11be0 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20  UTF8, (void*)1, 
11bf0 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b  binCollFunc, 0);
11c00 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
11c10 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67  cFailed ){.    g
11c20 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
11c30 20 20 7d 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43    }.  db->pDfltC
11c40 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  oll = sqlite3Fin
11c50 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c  dCollSeq(db, SQL
11c60 49 54 45 5f 55 54 46 38 2c 20 22 42 49 4e 41 52  ITE_UTF8, "BINAR
11c70 59 22 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  Y", 0);.  assert
11c80 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21  ( db->pDfltColl!
11c90 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f  =0 );..  /* Also
11ca0 20 61 64 64 20 61 20 55 54 46 2d 38 20 63 61 73   add a UTF-8 cas
11cb0 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20 63 6f  e-insensitive co
11cc0 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
11cd0 2e 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c  . */.  createCol
11ce0 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41  lation(db, "NOCA
11cf0 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  SE", SQLITE_UTF8
11d00 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61  , 0, nocaseColla
11d10 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20  tingFunc, 0);.. 
11d20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 66 69   /* Parse the fi
11d30 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72 67 75 6d  lename/URI argum
11d40 65 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70  ent. */.  db->op
11d50 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  enFlags = flags;
11d60 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
11d70 61 72 73 65 55 72 69 28 7a 56 66 73 2c 20 7a 46  arseUri(zVfs, zF
11d80 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c  ilename, &flags,
11d90 20 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70   &db->pVfs, &zOp
11da0 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  en, &zErrMsg);. 
11db0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11dc0 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  OK ){.    if( rc
11dd0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
11de0 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
11df0 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74  d = 1;.    sqlit
11e00 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20  e3Error(db, rc, 
11e10 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22 20 3a  zErrMsg ? "%s" :
11e20 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20   0, zErrMsg);.  
11e30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
11e40 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74  ErrMsg);.    got
11e50 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
11e60 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  }..  /* Open the
11e70 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62 61 73   backend databas
11e80 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20 72 63  e driver */.  rc
11e90 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 4f   = sqlite3BtreeO
11ea0 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f  pen(db->pVfs, zO
11eb0 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44  pen, db, &db->aD
11ec0 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20  b[0].pBt, 0,.   
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ee0 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53 51 4c       flags | SQL
11ef0 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
11f00 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
11f10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
11f20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
11f30 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  RR_NOMEM ){.    
11f40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
11f50 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  MEM;.    }.    s
11f60 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
11f70 72 63 2c 20 30 29 3b 0a 20 20 20 20 67 6f 74 6f  rc, 0);.    goto
11f80 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
11f90 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 53  .  db->aDb[0].pS
11fa0 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
11fb0 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62 2d  chemaGet(db, db-
11fc0 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20 20  >aDb[0].pBt);.  
11fd0 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
11fe0 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68 65  ma = sqlite3Sche
11ff0 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a 0a  maGet(db, 0);...
12000 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
12010 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f   safety_level fo
12020 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
12030 61 73 65 20 69 73 20 27 66 75 6c 6c 27 3b 20 66  ase is 'full'; f
12040 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a  or the temp.  **
12050 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73 20   database it is 
12060 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61 74  'NONE'. This mat
12070 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 6c  ches the pager l
12080 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20  ayer defaults.  
12090 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b  .  */.  db->aDb[
120a0 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e  0].zName = "main
120b0 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  ";.  db->aDb[0].
120c0 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33  safety_level = 3
120d0 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a  ;.  db->aDb[1].z
120e0 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20  Name = "temp";. 
120f0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65   db->aDb[1].safe
12100 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a 20  ty_level = 1;.. 
12110 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
12120 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a  ITE_MAGIC_OPEN;.
12130 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
12140 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
12150 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
12160 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
12170 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66  r all built-in f
12180 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f  unctions, but do
12190 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
121a0 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61  read the.  ** da
121b0 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 79 65  tabase schema ye
121c0 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61 79  t. This is delay
121d0 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  ed until the fir
121e0 73 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61  st time the data
121f0 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63  base.  ** is acc
12200 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  essed..  */.  sq
12210 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
12220 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20 20  QLITE_OK, 0);.  
12230 73 71 6c 69 74 65 33 52 65 67 69 73 74 65 72 42  sqlite3RegisterB
12240 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28  uiltinFunctions(
12250 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20  db);..  /* Load 
12260 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65 6e 73  automatic extens
12270 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e  ions - extension
12280 73 20 74 68 61 74 20 68 61 76 65 20 62 65 65 6e  s that have been
12290 20 72 65 67 69 73 74 65 72 65 64 0a 20 20 2a 2a   registered.  **
122a0 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c 69 74   using the sqlit
122b0 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65 78 74  e3_automatic_ext
122c0 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20  ension() API..  
122d0 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
122e0 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20  3_errcode(db);. 
122f0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12300 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
12310 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69  3AutoLoadExtensi
12320 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20 72 63 20  ons(db);.    rc 
12330 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
12340 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28 20 72  e(db);.    if( r
12350 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12360 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64        goto opend
12370 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  b_out;.    }.  }
12380 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
12390 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20 69 66  ENABLE_FTS1.  if
123a0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
123b0 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74 65 72  led ){.    exter
123c0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74 73  n int sqlite3Fts
123d0 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29 3b  1Init(sqlite3*);
123e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
123f0 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b 0a 20  3Fts1Init(db);. 
12400 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65   }.#endif..#ifde
12410 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
12420 46 54 53 32 0a 20 20 69 66 28 20 21 64 62 2d 3e  FTS2.  if( !db->
12430 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
12440 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
12450 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20  .    extern int 
12460 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74 28  sqlite3Fts2Init(
12470 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 72  sqlite3*);.    r
12480 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 32 49  c = sqlite3Fts2I
12490 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
124a0 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
124b0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20  TE_ENABLE_FTS3. 
124c0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
124d0 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51  Failed && rc==SQ
124e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
124f0 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73 33 49  c = sqlite3Fts3I
12500 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
12510 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
12520 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20  TE_ENABLE_ICU.  
12530 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
12540 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
12550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
12560 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49 6e 69   = sqlite3IcuIni
12570 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  t(db);.  }.#endi
12580 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  f..#ifdef SQLITE
12590 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a 20 20  _ENABLE_RTREE.  
125a0 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
125b0 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c  ailed && rc==SQL
125c0 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20  ITE_OK){.    rc 
125d0 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65 49 6e  = sqlite3RtreeIn
125e0 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64  it(db);.  }.#end
125f0 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72  if..  sqlite3Err
12600 6f 72 28 64 62 2c 20 72 63 2c 20 30 29 3b 0a 0a  or(db, rc, 0);..
12610 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44 45    /* -DSQLITE_DE
12620 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
12630 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c 55  DE=1 makes EXCLU
12640 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c 74  SIVE the default
12650 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f   locking.  ** mo
12660 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44 45  de.  -DSQLITE_DE
12670 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
12680 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41 4c  DE=0 make NORMAL
12690 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63   the default loc
126a0 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20  king.  ** mode. 
126b0 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20 61   Doing nothing a
126c0 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65 73  t all also makes
126d0 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61   NORMAL the defa
126e0 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66  ult..  */.#ifdef
126f0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
12700 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20 64  LOCKING_MODE.  d
12710 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65 20  b->dfltLockMode 
12720 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
12730 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a 20  _LOCKING_MODE;. 
12740 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 63   sqlite3PagerLoc
12750 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65 33  kingMode(sqlite3
12760 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e 61  BtreePager(db->a
12770 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20 20  Db[0].pBt),.    
12780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12790 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45 46        SQLITE_DEF
127a0 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44  AULT_LOCKING_MOD
127b0 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  E);.#endif..  /*
127c0 20 45 6e 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b   Enable the look
127d0 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62  aside-malloc sub
127e0 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75  system */.  setu
127f0 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 30  pLookaside(db, 0
12800 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  , sqlite3GlobalC
12810 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64  onfig.szLookasid
12820 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
12830 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
12840 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
12850 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73  Lookaside);..  s
12860 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63  qlite3_wal_autoc
12870 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51  heckpoint(db, SQ
12880 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c  LITE_DEFAULT_WAL
12890 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29  _AUTOCHECKPOINT)
128a0 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20  ;..opendb_out:. 
128b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f   sqlite3_free(zO
128c0 70 65 6e 29 3b 0a 20 20 69 66 28 20 64 62 20 29  pen);.  if( db )
128d0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 64 62  {.    assert( db
128e0 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c 20 69 73  ->mutex!=0 || is
128f0 54 68 72 65 61 64 73 61 66 65 3d 3d 30 20 7c 7c  Threadsafe==0 ||
12900 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
12910 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d  nfig.bFullMutex=
12920 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
12930 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
12940 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20  ->mutex);.  }.  
12950 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
12960 63 6f 64 65 28 64 62 29 3b 0a 20 20 61 73 73 65  code(db);.  asse
12970 72 74 28 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d  rt( db!=0 || rc=
12980 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b  =SQLITE_NOMEM );
12990 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
129a0 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73  E_NOMEM ){.    s
129b0 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29  qlite3_close(db)
129c0 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b 0a 20 20  ;.    db = 0;.  
129d0 7d 65 6c 73 65 20 69 66 28 20 72 63 21 3d 53 51  }else if( rc!=SQ
129e0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64  LITE_OK ){.    d
129f0 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
12a00 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20  E_MAGIC_SICK;.  
12a10 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a  }.  *ppDb = db;.
12a20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12a30 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
12a40 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
12a50 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
12a60 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
12a70 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73  te3_open(.  cons
12a80 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
12a90 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a  e, .  sqlite3 **
12aa0 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72  ppDb .){.  retur
12ab0 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  n openDatabase(z
12ac0 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a  Filename, ppDb,.
12ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ae0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
12af0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
12b00 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
12b10 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
12b20 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63  te3_open_v2(.  c
12b30 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
12b40 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61  ame,   /* Databa
12b50 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46  se filename (UTF
12b60 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
12b70 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
12b80 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20   /* OUT: SQLite 
12b90 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
12ba0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
12bb0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
12bc0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
12bd0 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20  *zVfs        /* 
12be0 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75  Name of VFS modu
12bf0 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  le to use */.){.
12c00 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
12c10 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20  abase(filename, 
12c20 70 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20  ppDb, (unsigned 
12c30 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29  int)flags, zVfs)
12c40 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
12c50 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
12c60 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
12c70 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
12c80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
12c90 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20  open16(.  const 
12ca0 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  void *zFilename,
12cb0 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
12cc0 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  Db.){.  char con
12cd0 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20  st *zFilename8; 
12ce0 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65    /* zFilename e
12cf0 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20  ncoded in UTF-8 
12d00 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31  instead of UTF-1
12d10 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  6 */.  sqlite3_v
12d20 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
12d30 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
12d40 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20   zFilename );.  
12d50 61 73 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a  assert( ppDb );.
12d60 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
12d70 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
12d80 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
12d90 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
12da0 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
12db0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
12dc0 64 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  dif.  pVal = sql
12dd0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
12de0 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
12df0 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
12e00 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54  zFilename, SQLIT
12e10 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53  E_UTF16NATIVE, S
12e20 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
12e30 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71   zFilename8 = sq
12e40 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
12e50 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Val, SQLITE_UTF8
12e60 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
12e70 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
12e80 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
12e90 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20  lename8, ppDb,. 
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12eb0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
12ec0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
12ed0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
12ee0 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
12ef0 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51   *ppDb || rc==SQ
12f00 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
12f10 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
12f20 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f  _OK && !DbHasPro
12f30 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20  perty(*ppDb, 0, 
12f40 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
12f50 20 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a 70   ){.      ENC(*p
12f60 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54  pDb) = SQLITE_UT
12f70 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d  F16NATIVE;.    }
12f80 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
12f90 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
12fa0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61  .  }.  sqlite3Va
12fb0 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a  lueFree(pVal);..
12fc0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
12fd0 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
12fe0 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
12ff0 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
13000 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
13010 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
13020 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
13030 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
13040 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
13050 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
13060 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
13070 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
13080 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
13090 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
130a0 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
130b0 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
130c0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
130d0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
130e0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
130f0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
13100 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
13110 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
13120 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
13130 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
13140 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
13150 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78  (u8)enc, pCtx, x
13160 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72  Compare, 0);.  r
13170 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
13180 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
13190 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
131a0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
131b0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
131c0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
131d0 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
131e0 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
131f0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
13200 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
13210 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
13220 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
13230 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
13240 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
13250 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
13260 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
13270 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
13280 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
13290 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
132a0 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
132b0 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
132c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
132d0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
132e0 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
132f0 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
13300 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
13310 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
13320 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  ame, (u8)enc, pC
13330 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44  tx, xCompare, xD
13340 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  el);.  rc = sqli
13350 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
13360 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
13370 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
13380 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
13390 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
133a0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
133b0 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
133c0 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
133d0 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
133e0 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
133f0 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
13400 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
13410 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
13420 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
13430 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  void *zName,.  i
13440 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
13450 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
13460 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
13470 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
13480 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
13490 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
134a0 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
134b0 7a 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65  zName8;.  sqlite
134c0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
134d0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
134e0 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
134f0 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65  ailed );.  zName
13500 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
13510 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d  to8(db, zName, -
13520 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  1, SQLITE_UTF16N
13530 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e  ATIVE);.  if( zN
13540 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
13550 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
13560 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38  (db, zName8, (u8
13570 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
13580 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  pare, 0);.    sq
13590 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
135a0 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72  zName8);.  }.  r
135b0 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
135c0 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
135d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
135e0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
135f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
13600 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
13610 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
13620 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
13630 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
13640 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
13650 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
13660 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
13670 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
13680 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
13690 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
136a0 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
136b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
136c0 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a  llation_needed(.
136d0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
136e0 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
136f0 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
13700 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f  *xCollNeeded)(vo
13710 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
13720 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
13730 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69  char*).){.  sqli
13740 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
13750 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
13760 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20  ->xCollNeeded = 
13770 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64  xCollNeeded;.  d
13780 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
13790 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c   = 0;.  db->pCol
137a0 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
137b0 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
137c0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
137d0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
137e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
137f0 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
13800 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
13810 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
13820 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
13830 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c  nce factory call
13840 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61  back with the da
13850 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
13860 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79   db. Replace any
13870 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74   previously inst
13880 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  alled collation 
13890 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
138a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
138b0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
138c0 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  d16(.  sqlite3 *
138d0 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  db, .  void *pCo
138e0 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20  llNeededArg, .  
138f0 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65  void(*xCollNeede
13900 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  d16)(void*,sqlit
13910 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
13920 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
13930 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
13940 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
13950 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
13960 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eded = 0;.  db->
13970 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
13980 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20  xCollNeeded16;. 
13990 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
139a0 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
139b0 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
139c0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
139d0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
139e0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
139f0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
13a00 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
13a10 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
13a20 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
13a30 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
13a40 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68   is now an anach
13a50 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20  ronism. It used 
13a60 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  to be used to re
13a70 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20  cover from a.** 
13a80 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
13a90 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77  , but SQLite now
13aa0 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d   does this autom
13ab0 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  atically..*/.int
13ac0 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
13ad0 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20  recover(void){. 
13ae0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13af0 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
13b00 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77  ** Test to see w
13b10 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
13b20 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
13b30 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f  ction is in auto
13b40 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20  commit.** mode. 
13b50 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
13b60 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20  it is and FALSE 
13b70 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d  if not.  Autocom
13b80 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a  mit mode is on.*
13b90 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41  * by default.  A
13ba0 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73  utocommit is dis
13bb0 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e  abled by a BEGIN
13bc0 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
13bd0 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74  eenabled.** by t
13be0 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f  he next COMMIT o
13bf0 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a  r ROLLBACK..**.*
13c00 2a 2a 2a 2a 2a 2a 20 54 48 49 53 20 49 53 20 41  ****** THIS IS A
13c10 4e 20 45 58 50 45 52 49 4d 45 4e 54 41 4c 20 41  N EXPERIMENTAL A
13c20 50 49 20 41 4e 44 20 49 53 20 53 55 42 4a 45 43  PI AND IS SUBJEC
13c30 54 20 54 4f 20 43 48 41 4e 47 45 20 2a 2a 2a 2a  T TO CHANGE ****
13c40 2a 2a 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  **.*/.int sqlite
13c50 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
13c60 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
13c70 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f   return db->auto
13c80 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Commit;.}../*.**
13c90 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
13ca0 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62 74  outines are subt
13cb0 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74  itutes for const
13cc0 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52  ants SQLITE_CORR
13cd0 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d  UPT,.** SQLITE_M
13ce0 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41  ISUSE, SQLITE_CA
13cf0 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49  NTOPEN, SQLITE_I
13d00 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c  OERR and possibl
13d10 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a  y other error.**
13d20 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65   constants.  The
13d30 79 20 73 65 72 76 65 72 20 74 77 6f 20 70 75 72  y server two pur
13d40 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  poses:.**.**   1
13d50 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63 6f  .  Serve as a co
13d60 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74  nvenient place t
13d70 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
13d80 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65 72  nt in a debugger
13d90 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74  .**       to det
13da0 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e  ect when version
13db0 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
13dc0 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  s occurs..**.** 
13dd0 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c    2.  Invoke sql
13de0 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72  ite3_log() to pr
13df0 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63 65  ovide the source
13e00 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77   code location w
13e10 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20  here.**       a 
13e20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20  low-level error 
13e30 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65  is first detecte
13e40 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
13e50 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e  3CorruptError(in
13e60 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
13e70 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
13e80 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
13e90 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
13ea0 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  log(SQLITE_CORRU
13eb0 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT,.            
13ec0 20 20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72    "database corr
13ed0 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25  uption at line %
13ee0 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20  d of [%.10s]",. 
13ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e               lin
13f00 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f  eno, 20+sqlite3_
13f10 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72  sourceid());.  r
13f20 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
13f30 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  RUPT;.}.int sqli
13f40 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69  te3MisuseError(i
13f50 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
13f60 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
13f70 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
13f80 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
13f90 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55  _log(SQLITE_MISU
13fa0 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  SE, .           
13fb0 20 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69     "misuse at li
13fc0 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d  ne %d of [%.10s]
13fd0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
13fe0 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69   lineno, 20+sqli
13ff0 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
14000 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
14010 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73  _MISUSE;.}.int s
14020 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72  qlite3CantopenEr
14030 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
14040 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
14050 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
14060 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
14070 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
14080 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20  _CANTOPEN, .    
14090 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
140a0 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c  t open file at l
140b0 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
140c0 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
140d0 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
140e0 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
140f0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
14100 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a  E_CANTOPEN;.}...
14110 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14120 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
14130 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63  *.** This is a c
14140 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69  onvenience routi
14150 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ne that makes su
14160 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65  re that all thre
14170 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64  ad-specific.** d
14180 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72  ata for this thr
14190 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61  ead has been dea
141a0 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
141b0 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72  SQLite no longer
141c0 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65   uses thread-spe
141d0 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68  cific data so th
141e0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
141f0 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49  w a.** no-op.  I
14200 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f  t is retained fo
14210 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d  r historical com
14220 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76  patibility..*/.v
14230 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65  oid sqlite3_thre
14240 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29  ad_cleanup(void)
14250 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  {.}.#endif../*.*
14260 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e  * Return meta in
14270 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
14280 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d  a specific colum
14290 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  n of a database 
142a0 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  table..** See co
142b0 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33  mment in sqlite3
142c0 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29  .h (sqlite.h.in)
142d0 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
142e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
142f0 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
14300 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65  ADATA.int sqlite
14310 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
14320 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74  etadata(.  sqlit
14330 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
14340 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
14350 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  tion handle */. 
14360 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
14370 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
14380 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72  Database name or
14390 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
143a0 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d   char *zTableNam
143b0 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  e,     /* Table 
143c0 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  name */.  const 
143d0 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d  char *zColumnNam
143e0 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  e,    /* Column 
143f0 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  name */.  char c
14400 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70  onst **pzDataTyp
14410 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  e,    /* OUTPUT:
14420 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74   Declared data t
14430 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ype */.  char co
14440 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c  nst **pzCollSeq,
14450 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
14460 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
14470 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  ce name */.  int
14480 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20   *pNotNull,     
14490 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
144a0 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20  UT: True if NOT 
144b0 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20  NULL constraint 
144c0 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20  exists */.  int 
144d0 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20  *pPrimaryKey,   
144e0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
144f0 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
14500 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a  n part of PK */.
14510 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20    int *pAutoinc 
14520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
14530 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
14540 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d   column is auto-
14550 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  increment */.){.
14560 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
14570 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
14580 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
14590 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
145a0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
145b0 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ;..  char const 
145c0 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a  *zDataType = 0;.
145d0 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43    char const *zC
145e0 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e  ollSeq = 0;.  in
145f0 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20  t notnull = 0;. 
14600 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20   int primarykey 
14610 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69  = 0;.  int autoi
14620 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e  nc = 0;..  /* En
14630 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
14640 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65  e schema has bee
14650 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71  n loaded */.  sq
14660 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
14670 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
14680 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
14690 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d  rAll(db);.  rc =
146a0 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c   sqlite3Init(db,
146b0 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   &zErrMsg);.  if
146c0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
146d0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  ){.    goto erro
146e0 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
146f0 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
14700 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f  e in question */
14710 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
14720 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
14730 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61  TableName, zDbNa
14740 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62  me);.  if( !pTab
14750 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
14760 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20  t ){.    pTab = 
14770 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  0;.    goto erro
14780 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
14790 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e   Find the column
147a0 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20   for which info 
147b0 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  is requested */.
147c0 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52    if( sqlite3IsR
147d0 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  owid(zColumnName
147e0 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  ) ){.    iCol = 
147f0 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
14800 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
14810 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
14820 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
14830 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
14840 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
14850 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
14860 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70  iCol++){.      p
14870 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
14880 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69  l[iCol];.      i
14890 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
148a0 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
148b0 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29  , zColumnName) )
148c0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
148d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
148e0 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61     if( iCol==pTa
148f0 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
14900 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20   pTab = 0;.     
14910 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
14920 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
14930 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
14940 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20  lock stores the 
14950 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
14960 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
14970 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74  turned.  ** to t
14980 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63  he caller in loc
14990 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61  al variables zDa
149a0 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71  taType, zCollSeq
149b0 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61  , notnull, prima
149c0 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61  rykey.  ** and a
149d0 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20  utoinc. At this 
149e0 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65 20  point there are 
149f0 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65  two possibilitie
14a00 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20  s:.  ** .  **   
14a10 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66 69    1. The specifi
14a20 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77  ed column name w
14a30 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22  as rowid", "oid"
14a40 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20   or "_rowid_" . 
14a50 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74   **        and t
14a60 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69  here is no expli
14a70 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49  citly declared I
14a80 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a  PK column. .  **
14a90 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65  .  **     2. The
14aa0 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20   table is not a 
14ab0 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c  view and the col
14ac0 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66  umn name identif
14ad0 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20  ied an .  **    
14ae0 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64      explicitly d
14af0 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20  eclared column. 
14b00 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d  Copy meta inform
14b10 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c  ation from *pCol
14b20 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43  ..  */ .  if( pC
14b30 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54  ol ){.    zDataT
14b40 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70  ype = pCol->zTyp
14b50 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  e;.    zCollSeq 
14b60 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20  = pCol->zColl;. 
14b70 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f     notnull = pCo
14b80 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20  l->notNull!=0;. 
14b90 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d     primarykey  =
14ba0 20 70 43 6f 6c 2d 3e 69 73 50 72 69 6d 4b 65 79   pCol->isPrimKey
14bb0 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69 6e 63  !=0;.    autoinc
14bc0 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d   = pTab->iPKey==
14bd0 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d 3e 74  iCol && (pTab->t
14be0 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41 75 74  abFlags & TF_Aut
14bf0 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30 3b 0a  oincrement)!=0;.
14c00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 44 61    }else{.    zDa
14c10 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45 47 45  taType = "INTEGE
14c20 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72 79 6b  R";.    primaryk
14c30 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  ey = 1;.  }.  if
14c40 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b 0a 20  ( !zCollSeq ){. 
14c50 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20 22 42     zCollSeq = "B
14c60 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65 72 72  INARY";.  }..err
14c70 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65  or_out:.  sqlite
14c80 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64  3BtreeLeaveAll(d
14c90 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74 68 65  b);..  /* Whethe
14ca0 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 63  r the function c
14cb0 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20 6f 72  all succeeded or
14cc0 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74 68 65   failed, set the
14cd0 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
14ce0 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61 74 65  rs.  ** to whate
14cf0 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61 6c 20  ver their local 
14d00 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63 6f 6e  counterparts con
14d10 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72 72 6f  tain. If an erro
14d20 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20 20 2a  r did occur,.  *
14d30 2a 20 74 68 69 73 20 68 61 73 20 74 68 65 20 65  * this has the e
14d40 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69 6e 67  ffect of zeroing
14d50 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61 72 61   all output para
14d60 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 69  meters..  */.  i
14d70 66 28 20 70 7a 44 61 74 61 54 79 70 65 20 29 20  f( pzDataType ) 
14d80 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20 7a 44  *pzDataType = zD
14d90 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28 20 70  ataType;.  if( p
14da0 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a 43 6f  zCollSeq ) *pzCo
14db0 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53 65 71  llSeq = zCollSeq
14dc0 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75 6c 6c  ;.  if( pNotNull
14dd0 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e   ) *pNotNull = n
14de0 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20 70 50  otnull;.  if( pP
14df0 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70 50 72  rimaryKey ) *pPr
14e00 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69 6d 61  imaryKey = prima
14e10 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70 41 75  rykey;.  if( pAu
14e20 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f 69 6e  toinc ) *pAutoin
14e30 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20  c = autoinc;..  
14e40 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72  if( SQLITE_OK==r
14e50 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a 20 20  c && !pTab ){.  
14e60 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
14e70 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
14e80 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69    zErrMsg = sqli
14e90 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c 20 22  te3MPrintf(db, "
14ea0 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20 63 6f  no such table co
14eb0 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20 7a 54  lumn: %s.%s", zT
14ec0 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20  ableName,.      
14ed0 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a    zColumnName);.
14ee0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14ef0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73 71 6c  ERROR;.  }.  sql
14f00 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
14f10 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73 22 3a  , (zErrMsg?"%s":
14f20 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0), zErrMsg);.  
14f30 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
14f40 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 72 63  , zErrMsg);.  rc
14f50 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
14f60 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
14f70 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
14f80 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
14f90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
14fa0 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65 70 20  if../*.** Sleep 
14fb0 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77 68 69  for a little whi
14fc0 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  le.  Return the 
14fd0 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65 20 73  amount of time s
14fe0 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  lept..*/.int sql
14ff0 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74 20 6d  ite3_sleep(int m
15000 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  s){.  sqlite3_vf
15010 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  s *pVfs;.  int r
15020 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71 6c 69  c;.  pVfs = sqli
15030 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29 3b  te3_vfs_find(0);
15040 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30 20 29  .  if( pVfs==0 )
15050 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a   return 0;..  /*
15060 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
15070 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73 65 63  orks in millisec
15080 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20 75 6e  onds, but the un
15090 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65 65 70  derlying OsSleep
150a0 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75 73 65  () .  ** API use
150b0 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20  s microseconds. 
150c0 48 65 6e 63 65 20 74 68 65 20 31 30 30 30 27 73  Hence the 1000's
150d0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 28 73  ..  */.  rc = (s
150e0 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 70 56  qlite3OsSleep(pV
150f0 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31 30 30  fs, 1000*ms)/100
15100 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  0);.  return rc;
15110 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  .}../*.** Enable
15120 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68 65 20   or disable the 
15130 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c 74 20  extended result 
15140 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  codes..*/.int sq
15150 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 72  lite3_extended_r
15160 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71 6c 69  esult_codes(sqli
15170 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f 6e 6f  te3 *db, int ono
15180 66 66 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ff){.  sqlite3_m
15190 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
151a0 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65 72 72  utex);.  db->err
151b0 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f 20 30  Mask = onoff ? 0
151c0 78 66 66 66 66 66 66 66 66 20 3a 20 30 78 66 66  xffffffff : 0xff
151d0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
151e0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
151f0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  x);.  return SQL
15200 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
15210 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46 69 6c   Invoke the xFil
15220 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20  eControl method 
15230 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  on a particular 
15240 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
15250 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
15260 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20 2a 64  ntrol(sqlite3 *d
15270 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
15280 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70 2c 20  DbName, int op, 
15290 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
152a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45  nt rc = SQLITE_E
152b0 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20 2a 70  RROR;.  Btree *p
152c0 42 74 72 65 65 3b 0a 0a 20 20 73 71 6c 69 74 65  Btree;..  sqlite
152d0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
152e0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42 74 72  ->mutex);.  pBtr
152f0 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61  ee = sqlite3DbNa
15300 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44  meToBtree(db, zD
15310 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 70 42  bName);.  if( pB
15320 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61 67 65  tree ){.    Page
15330 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 73  r *pPager;.    s
15340 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
15350 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
15360 65 45 6e 74 65 72 28 70 42 74 72 65 65 29 3b 0a  eEnter(pBtree);.
15370 20 20 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c      pPager = sql
15380 69 74 65 33 42 74 72 65 65 50 61 67 65 72 28 70  ite3BtreePager(p
15390 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73 73 65  Btree);.    asse
153a0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
153b0 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69 74 65  .    fd = sqlite
153c0 33 50 61 67 65 72 46 69 6c 65 28 70 50 61 67 65  3PagerFile(pPage
153d0 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
153e0 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  fd!=0 );.    if(
153f0 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43 4e 54   op==SQLITE_FCNT
15400 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52 20 29  L_FILE_POINTER )
15410 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69 74 65  {.      *(sqlite
15420 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20 3d 20  3_file**)pArg = 
15430 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  fd;.      rc = S
15440 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65  QLITE_OK;.    }e
15450 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d 65 74  lse if( fd->pMet
15460 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 72 63  hods ){.      rc
15470 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
15480 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70 2c 20  Control(fd, op, 
15490 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  pArg);.    }else
154a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
154b0 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a 20 20  ITE_NOTFOUND;.  
154c0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42    }.    sqlite3B
154d0 74 72 65 65 4c 65 61 76 65 28 70 42 74 72 65 65  treeLeave(pBtree
154e0 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
154f0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
15500 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
15510 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a 0a 2a  n rc;   .}../*.*
15520 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f 20 74  * Interface to t
15530 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67 69 63  he testing logic
15540 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15550 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e  _test_control(in
15560 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20 69 6e  t op, ...){.  in
15570 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e 64 65  t rc = 0;.#ifnde
15580 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55  f SQLITE_OMIT_BU
15590 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76 61 5f  ILTIN_TEST.  va_
155a0 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f 73 74  list ap;.  va_st
155b0 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
155c0 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20  witch( op ){..  
155d0 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61 76 65    /*.    ** Save
155e0 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61   the current sta
155f0 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 2e 0a  te of the PRNG..
15600 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
15610 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
15620 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20 20 20  PRNG_SAVE: {.   
15630 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 53 61     sqlite3PrngSa
15640 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20  veState();.     
15650 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
15660 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73     /*.    ** Res
15670 74 6f 72 65 20 74 68 65 20 73 74 61 74 65 20 6f  tore the state o
15680 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20 74 68  f the PRNG to th
15690 65 20 6c 61 73 74 20 73 74 61 74 65 20 73 61 76  e last state sav
156a0 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a 2a 20  ed using.    ** 
156b0 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66 20 50  PRNG_SAVE.  If P
156c0 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e 65 76  RNG_SAVE has nev
156d0 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e 20 63  er before been c
156e0 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20 20 20  alled, then.    
156f0 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61 63 74  ** this verb act
15700 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45 53 45  s like PRNG_RESE
15710 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  T..    */.    ca
15720 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
15730 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a  RL_PRNG_RESTORE:
15740 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
15750 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61 74 65  PrngRestoreState
15760 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
15770 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
15780 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68 65 20     ** Reset the 
15790 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69 74 73  PRNG back to its
157a0 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64 20 73   uninitialized s
157b0 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78 74 20  tate.  The next 
157c0 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 73  call.    ** to s
157d0 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
157e0 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65 64 20  s() will reseed 
157f0 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67 20 61  the PRNG using a
15800 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20 20 20   single call.   
15810 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61 6e 64   ** to the xRand
15820 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20 6f 66  omness method of
15830 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46 53   the default VFS
15840 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
15850 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
15860 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20 7b 0a  L_PRNG_RESET: {.
15870 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
15880 67 52 65 73 65 74 53 74 61 74 65 28 29 3b 0a 20  gResetState();. 
15890 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
158a0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
158b0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
158c0 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f 54 45  ontrol(BITVEC_TE
158d0 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67 72 61  ST, size, progra
158e0 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  m).    **.    **
158f0 20 52 75 6e 20 61 20 74 65 73 74 20 61 67 61 69   Run a test agai
15900 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f 62 6a  nst a Bitvec obj
15910 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20 54 68  ect of size.  Th
15920 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75 6d 65  e program argume
15930 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61 6e 20  nt.    ** is an 
15940 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67 65 72  array of integer
15950 73 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  s that defines t
15960 68 65 20 74 65 73 74 2e 20 20 52 65 74 75 72 6e  he test.  Return
15970 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a 2a 20   -1 on a.    ** 
15980 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
15990 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20 73 75  n error, 0 on su
159a0 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d 7a 65  ccess, or non-ze
159b0 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f 72 2e  ro for an error.
159c0 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68 65 20  .    ** See the 
159d0 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
159e0 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72 20 61  ltinTest() for a
159f0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
15a00 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  ation..    */.  
15a10 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
15a20 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f 54 45  STCTRL_BITVEC_TE
15a30 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ST: {.      int 
15a40 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  sz = va_arg(ap, 
15a50 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  int);.      int 
15a60 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72 67 28  *aProg = va_arg(
15a70 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20 20 20  ap, int*);.     
15a80 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
15a90 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 73  vecBuiltinTest(s
15aa0 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20 20 20  z, aProg);.     
15ab0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
15ac0 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
15ad0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
15ae0 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  ol(BENIGN_MALLOC
15af0 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20  _HOOKS, xBegin, 
15b00 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20  xEnd).    **.   
15b10 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f   ** Register hoo
15b20 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e  ks to call to in
15b30 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c  dicate which mal
15b40 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a  loc() failures .
15b50 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67      ** are benig
15b60 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
15b70 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
15b80 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  RL_BENIGN_MALLOC
15b90 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20  _HOOKS: {.      
15ba0 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76  typedef void (*v
15bb0 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f  oid_function)(vo
15bc0 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f  id);.      void_
15bd0 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e  function xBenign
15be0 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69  Begin;.      voi
15bf0 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69  d_function xBeni
15c00 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65  gnEnd;.      xBe
15c10 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61  nignBegin = va_a
15c20 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63  rg(ap, void_func
15c30 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65  tion);.      xBe
15c40 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67  nignEnd = va_arg
15c50 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69  (ap, void_functi
15c60 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  on);.      sqlit
15c70 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f  e3BenignMallocHo
15c80 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e  oks(xBenignBegin
15c90 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20  , xBenignEnd);. 
15ca0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15cb0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
15cc0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
15cd0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
15ce0 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
15cf0 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  YTE, unsigned in
15d00 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
15d10 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44 49  ** Set the PENDI
15d20 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20 76  NG byte to the v
15d30 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67 75  alue in the argu
15d40 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20  ment, if X>0..  
15d50 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61    ** Make no cha
15d60 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52  nges if X==0.  R
15d70 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
15d80 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62  of the pending b
15d90 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74  yte.    ** as it
15da0 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65   existing before
15db0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
15dc0 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
15dd0 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e  .    ** IMPORTAN
15de0 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65  T:  Changing the
15df0 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72   PENDING byte fr
15e00 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72 65  om 0x40000000 re
15e10 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20  sults in.    ** 
15e20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
15e30 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
15e40 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20  rmat.  Changing 
15e50 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
15e60 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e  .    ** while an
15e70 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  y database conne
15e80 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65  ction is open re
15e90 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e  sults in undefin
15ea0 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 69  ed and.    ** di
15eb0 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76 69  leterious behavi
15ec0 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  or..    */.    c
15ed0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
15ee0 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45  TRL_PENDING_BYTE
15ef0 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50  : {.      rc = P
15f00 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66  ENDING_BYTE;.#if
15f10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15f20 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20  _WSD.      {.   
15f30 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e       unsigned in
15f40 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72  t newVal = va_ar
15f50 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69  g(ap, unsigned i
15f60 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nt);.        if(
15f70 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65   newVal ) sqlite
15f80 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e  3PendingByte = n
15f90 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23  ewVal;.      }.#
15fa0 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
15fb0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
15fc0 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
15fd0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
15fe0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
15ff0 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20  SERT, int X).   
16000 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
16010 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
16020 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
16030 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
16040 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73  r not.    ** ass
16050 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65  ert() was enable
16060 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
16070 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65  e.  If X is true
16080 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20   and assert().  
16090 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c    ** is enabled,
160a0 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
160b0 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20   value is true. 
160c0 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e   If X is true an
160d0 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28  d.    ** assert(
160e0 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
160f0 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
16100 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49  alue is zero.  I
16110 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61  f X is.    ** fa
16120 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  lse and assert()
16130 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
16140 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20  n the assertion 
16150 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20  fires and the.  
16160 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f    ** process abo
16170 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66 61  rts.  If X is fa
16180 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  lse and assert()
16190 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
161a0 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  en the.    ** re
161b0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
161c0 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ro..    */.    c
161d0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
161e0 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20  TRL_ASSERT: {.  
161f0 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74      volatile int
16200 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73   x = 0;.      as
16210 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61 72  sert( (x = va_ar
16220 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b  g(ap,int))!=0 );
16230 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20  .      rc = x;. 
16240 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
16250 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  }...    /*.    *
16260 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
16270 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
16280 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
16290 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
162a0 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
162b0 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
162c0 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
162d0 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20   how the ALWAYS 
162e0 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52  and.    ** NEVER
162f0 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65 66   macros were def
16300 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
16310 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  time..    **.   
16320 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76   ** The return v
16330 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28 58  alue is ALWAYS(X
16340 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ).  .    **.    
16350 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64  ** The recommend
16360 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e  ed test is X==2.
16370 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
16380 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74  value is 2, that
16390 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c   means.    ** AL
163a0 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52  WAYS() and NEVER
163b0 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f  () are both no-o
163c0 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d  p pass-through m
163d0 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  acros, which is 
163e0 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
163f0 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20  lt setting.  If 
16400 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
16410 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41   is 1, then ALWA
16420 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a 20  YS() is either. 
16430 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64     ** hard-coded
16440 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65   to true or else
16450 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20 69   it asserts if i
16460 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ts argument is f
16470 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  alse..    ** The
16480 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72 20   first behavior 
16490 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74  (hard-coded to t
164a0 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73 65  rue) is the case
164b0 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
164c0 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
164d0 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
164e0 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
164f0 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  d and the second
16500 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72  .    ** behavior
16510 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65 20   (assert if the 
16520 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41  argument to ALWA
16530 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20 69  YS() is false) i
16540 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20  s the case if.  
16550 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54    ** SQLITE_TEST
16560 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77  CTRL_ASSERT show
16570 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20  s that assert() 
16580 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20  is enabled..    
16590 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75  **.    ** The ru
165a0 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63  n-time test proc
165b0 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b  edure might look
165c0 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20   something like 
165d0 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
165e0 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74   **    if( sqlit
165f0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
16600 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
16610 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b  ALWAYS, 2)==2 ){
16620 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
16630 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
16640 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70  ER() are no-op p
16650 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72  ass-through macr
16660 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  os.    **    }el
16670 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  se if( sqlite3_t
16680 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
16690 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
166a0 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a  RT, 1) ){.    **
166b0 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
166c0 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74 20  x) asserts that 
166d0 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52  x is true. NEVER
166e0 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69 73  (x) asserts x is
166f0 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20   false..    **  
16700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20    }else{.    ** 
16710 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78       // ALWAYS(x
16720 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
16730 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73 20  1.  NEVER(x) is 
16740 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20  a constant 0..  
16750 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f    **    }.    */
16760 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
16770 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
16780 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  : {.      int x 
16790 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
167a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57  ;.      rc = ALW
167b0 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72  AYS(x);.      br
167c0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
167d0 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
167e0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
167f0 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
16800 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  E, sqlite3 *db, 
16810 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
16820 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65    ** Set the nRe
16830 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20  serve size to N 
16840 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
16850 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74  abase on the dat
16860 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  abase.    ** con
16870 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20  nection db..    
16880 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
16890 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
168a0 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RVE: {.      sql
168b0 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
168c0 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
168d0 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76  .      int x = v
168e0 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
168f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
16900 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
16910 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
16920 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
16930 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ze(db->aDb[0].pB
16940 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20  t, 0, x, 0);.   
16950 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
16960 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
16970 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16980 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73      }..    /*  s
16990 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
169a0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
169b0 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
169c0 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  S, sqlite3 *db, 
169d0 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
169e0 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64    ** Enable or d
169f0 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f  isable various o
16a00 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72  ptimizations for
16a10 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
16a20 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20  s.  The .    ** 
16a30 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20  argument N is a 
16a40 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d  bitmask of optim
16a50 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64  izations to be d
16a60 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f  isabled.  For no
16a70 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72  rmal.    ** oper
16a80 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62  ation N should b
16a90 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20 69  e 0.  The idea i
16aa0 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70 72  s that a test pr
16ab0 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a  ogram (like the.
16ac0 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63      ** SQL Logic
16ad0 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73   Test or SLT tes
16ae0 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75  t module) can ru
16af0 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d  n the same SQL m
16b00 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20  ultiple times.  
16b10 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75    ** with variou
16b20 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  s optimizations 
16b30 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69  disabled to veri
16b40 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  fy that the same
16b50 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69   answer.    ** i
16b60 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76  s obtained in ev
16b70 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  ery case..    */
16b80 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
16b90 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
16ba0 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20  ZATIONS: {.     
16bb0 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
16bc0 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
16bd0 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78  3*);.      int x
16be0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74   = va_arg(ap,int
16bf0 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 66 6c 61  );.      db->fla
16c00 67 73 20 3d 20 28 78 20 26 20 53 51 4c 49 54 45  gs = (x & SQLITE
16c10 5f 4f 70 74 4d 61 73 6b 29 20 7c 20 28 64 62 2d  _OptMask) | (db-
16c20 3e 66 6c 61 67 73 20 26 20 7e 53 51 4c 49 54 45  >flags & ~SQLITE
16c30 5f 4f 70 74 4d 61 73 6b 29 3b 0a 20 20 20 20 20  _OptMask);.     
16c40 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23   break;.    }..#
16c50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b  ifdef SQLITE_N_K
16c60 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20 73 71  EYWORD.    /* sq
16c70 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
16c80 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
16c90 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20 63 6f  RL_ISKEYWORD, co
16ca0 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 29  nst char *zWord)
16cb0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
16cc0 66 20 7a 57 6f 72 64 20 69 73 20 61 20 6b 65 79  f zWord is a key
16cd0 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65 64 20  word recognized 
16ce0 62 79 20 74 68 65 20 70 61 72 73 65 72 2c 20 74  by the parser, t
16cf0 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65 0a 20  hen return the. 
16d00 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20     ** number of 
16d10 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20 69 66  keywords.  Or if
16d20 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20 61 20   zWord is not a 
16d30 6b 65 79 77 6f 72 64 2c 20 72 65 74 75 72 6e 20  keyword, return 
16d40 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20 20 2a  0..    ** .    *
16d50 2a 20 54 68 69 73 20 74 65 73 74 20 66 65 61 74  * This test feat
16d60 75 72 65 20 69 73 20 6f 6e 6c 79 20 61 76 61 69  ure is only avai
16d70 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 61 6d 61  lable in the ama
16d80 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63 65 0a  lgamation since.
16d90 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c 49 54      ** the SQLIT
16da0 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61 63 72  E_N_KEYWORD macr
16db0 6f 20 69 73 20 6e 6f 74 20 64 65 66 69 6e 65 64  o is not defined
16dc0 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20 69 66   in this file if
16dd0 20 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a 20 69   SQLite.    ** i
16de0 73 20 62 75 69 6c 74 20 75 73 69 6e 67 20 73 65  s built using se
16df0 70 61 72 61 74 65 20 73 6f 75 72 63 65 20 66 69  parate source fi
16e00 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  les..    */.    
16e10 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
16e20 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 20  CTRL_ISKEYWORD: 
16e30 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
16e40 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61 5f 61  ar *zWord = va_a
16e50 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61  rg(ap, const cha
16e60 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  r*);.      int n
16e70 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
16e80 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20 20 20  30(zWord);.     
16e90 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33 4b 65   rc = (sqlite3Ke
16ea0 79 77 6f 72 64 43 6f 64 65 28 28 75 38 2a 29 7a  ywordCode((u8*)z
16eb0 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49 44 29  Word, n)!=TK_ID)
16ec0 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57   ? SQLITE_N_KEYW
16ed0 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20 20 20 62  ORD : 0;.      b
16ee0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
16ef0 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71 6c 69  if ..    /* sqli
16f00 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
16f10 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
16f20 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43 2c 20  _SCRATCHMALLOC, 
16f30 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72 65 65  sz, &pNew, pFree
16f40 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
16f50 20 50 61 73 73 20 70 46 72 65 65 20 69 6e 74 6f   Pass pFree into
16f60 20 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46   sqlite3ScratchF
16f70 72 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a 20 49  ree(). .    ** I
16f80 66 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c 6c 6f  f sz>0 then allo
16f90 63 61 74 65 20 61 20 73 63 72 61 74 63 68 20 62  cate a scratch b
16fa0 75 66 66 65 72 20 69 6e 74 6f 20 70 4e 65 77 2e  uffer into pNew.
16fb0 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61    .    */.    ca
16fc0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
16fd0 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43  RL_SCRATCHMALLOC
16fe0 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a  : {.      void *
16ff0 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77 3b 0a  pFree, **ppNew;.
17000 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20        int sz;.  
17010 20 20 20 20 73 7a 20 3d 20 76 61 5f 61 72 67 28      sz = va_arg(
17020 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
17030 70 70 4e 65 77 20 3d 20 76 61 5f 61 72 67 28 61  ppNew = va_arg(a
17040 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20 20 20  p, void**);.    
17050 20 20 70 46 72 65 65 20 3d 20 76 61 5f 61 72 67    pFree = va_arg
17060 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20  (ap, void*);.   
17070 20 20 20 69 66 28 20 73 7a 20 29 20 2a 70 70 4e     if( sz ) *ppN
17080 65 77 20 3d 20 73 71 6c 69 74 65 33 53 63 72 61  ew = sqlite3Scra
17090 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b 0a 20  tchMalloc(sz);. 
170a0 20 20 20 20 20 73 71 6c 69 74 65 33 53 63 72 61       sqlite3Scra
170b0 74 63 68 46 72 65 65 28 70 46 72 65 65 29 3b 0a  tchFree(pFree);.
170c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
170d0 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c   }..    /*   sql
170e0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
170f0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
17100 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
17110 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b 0a 20  T, int onoff);. 
17120 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
17130 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66 66 20  parameter onoff 
17140 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63 6f 6e  is non-zero, con
17150 66 69 67 75 72 65 20 74 68 65 20 77 72 61 70 70  figure the wrapp
17160 65 72 73 20 73 6f 20 74 68 61 74 20 61 6c 6c 0a  ers so that all.
17170 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75 65 6e      ** subsequen
17180 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63 61 6c  t calls to local
17190 74 69 6d 65 28 29 20 61 6e 64 20 76 61 72 69 61  time() and varia
171a0 6e 74 73 20 66 61 69 6c 2e 20 49 66 20 6f 6e 6f  nts fail. If ono
171b0 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20 20 20  ff is zero,.    
171c0 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20 73 65 74  ** undo this set
171d0 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ting..    */.   
171e0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
171f0 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
17200 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20 20 73  FAULT: {.      s
17210 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
17220 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46 61 75  ig.bLocaltimeFau
17230 6c 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  lt = va_arg(ap, 
17240 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  int);.      brea
17250 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65  k;.    }..#if de
17260 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
17270 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e  BLE_TREE_EXPLAIN
17280 29 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ).    /*   sqlit
17290 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
172a0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
172b0 45 58 50 4c 41 49 4e 5f 53 54 4d 54 2c 0a 20 20  EXPLAIN_STMT,.  
172c0 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20    **            
172d0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
172e0 74 65 33 5f 73 74 6d 74 2a 2c 63 6f 6e 73 74 20  te3_stmt*,const 
172f0 63 68 61 72 2a 2a 29 3b 0a 20 20 20 20 2a 2a 0a  char**);.    **.
17300 20 20 20 20 2a 2a 20 49 66 20 63 6f 6d 70 69 6c      ** If compil
17310 65 64 20 77 69 74 68 20 53 51 4c 49 54 45 5f 45  ed with SQLITE_E
17320 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41  NABLE_TREE_EXPLA
17330 49 4e 2c 20 65 61 63 68 20 73 71 6c 69 74 65 33  IN, each sqlite3
17340 5f 73 74 6d 74 20 68 6f 6c 64 73 0a 20 20 20 20  _stmt holds.    
17350 2a 2a 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  ** a string that
17360 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6f   describes the o
17370 70 74 69 6d 69 7a 65 64 20 70 61 72 73 65 20 74  ptimized parse t
17380 72 65 65 2e 20 20 54 68 69 73 20 74 65 73 74 2d  ree.  This test-
17390 63 6f 6e 74 72 6f 6c 0a 20 20 20 20 2a 2a 20 72  control.    ** r
173a0 65 74 75 72 6e 73 20 61 20 70 6f 69 6e 74 65 72  eturns a pointer
173b0 20 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e   to that string.
173c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
173d0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
173e0 5f 45 58 50 4c 41 49 4e 5f 53 54 4d 54 3a 20 7b  _EXPLAIN_STMT: {
173f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
17400 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 76 61 5f  tmt *pStmt = va_
17410 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
17420 73 74 6d 74 2a 29 3b 0a 20 20 20 20 20 20 63 6f  stmt*);.      co
17430 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 52 65 74  nst char **pzRet
17440 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f   = va_arg(ap, co
17450 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20  nst char**);.   
17460 20 20 20 2a 70 7a 52 65 74 20 3d 20 73 71 6c 69     *pzRet = sqli
17470 74 65 33 56 64 62 65 45 78 70 6c 61 6e 61 74 69  te3VdbeExplanati
17480 6f 6e 28 28 56 64 62 65 2a 29 70 53 74 6d 74 29  on((Vdbe*)pStmt)
17490 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
174a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 7d     }.#endif..  }
174b0 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 23  .  va_end(ap);.#
174c0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
174d0 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53  OMIT_BUILTIN_TES
174e0 54 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 72 63  T */.  return rc
174f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
17500 69 73 20 61 20 75 74 69 6c 69 74 79 20 72 6f 75  is a utility rou
17510 74 69 6e 65 2c 20 75 73 65 66 75 6c 20 74 6f 20  tine, useful to 
17520 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  VFS implementati
17530 6f 6e 73 2c 20 74 68 61 74 20 63 68 65 63 6b 73  ons, that checks
17540 0a 2a 2a 20 74 6f 20 73 65 65 20 69 66 20 61 20  .** to see if a 
17550 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 61  database file wa
17560 73 20 61 20 55 52 49 20 74 68 61 74 20 63 6f 6e  s a URI that con
17570 74 61 69 6e 65 64 20 61 20 73 70 65 63 69 66 69  tained a specifi
17580 63 20 71 75 65 72 79 20 0a 2a 2a 20 70 61 72 61  c query .** para
17590 6d 65 74 65 72 2c 20 61 6e 64 20 69 66 20 73 6f  meter, and if so
175a0 20 6f 62 74 61 69 6e 73 20 74 68 65 20 76 61 6c   obtains the val
175b0 75 65 20 6f 66 20 74 68 65 20 71 75 65 72 79 20  ue of the query 
175c0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 0a 2a 2a  parameter..**.**
175d0 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61   The zFilename a
175e0 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66  rgument is the f
175f0 69 6c 65 6e 61 6d 65 20 70 6f 69 6e 74 65 72 20  ilename pointer 
17600 70 61 73 73 65 64 20 69 6e 74 6f 20 74 68 65 20  passed into the 
17610 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d 65 74 68 6f  xOpen().** metho
17620 64 20 6f 66 20 61 20 56 46 53 20 69 6d 70 6c 65  d of a VFS imple
17630 6d 65 6e 74 61 74 69 6f 6e 2e 20 20 54 68 65 20  mentation.  The 
17640 7a 50 61 72 61 6d 20 61 72 67 75 6d 65 6e 74 20  zParam argument 
17650 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
17660 68 65 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61  he.** query para
17670 6d 65 74 65 72 20 77 65 20 73 65 65 6b 2e 20 20  meter we seek.  
17680 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
17690 75 72 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f  urns the value o
176a0 66 20 74 68 65 20 7a 50 61 72 61 6d 0a 2a 2a 20  f the zParam.** 
176b0 70 61 72 61 6d 65 74 65 72 20 69 66 20 69 74 20  parameter if it 
176c0 65 78 69 73 74 73 2e 20 20 49 66 20 74 68 65 20  exists.  If the 
176d0 70 61 72 61 6d 65 74 65 72 20 64 6f 65 73 20 6e  parameter does n
176e0 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 72  ot exist, this r
176f0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
17700 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  s a NULL pointer
17710 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
17720 2a 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72  *sqlite3_uri_par
17730 61 6d 65 74 65 72 28 63 6f 6e 73 74 20 63 68 61  ameter(const cha
17740 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f  r *zFilename, co
17750 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d  nst char *zParam
17760 29 7b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  ){.  if( zFilena
17770 6d 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  me==0 ) return 0
17780 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d  ;.  zFilename +=
17790 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
177a0 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b  (zFilename) + 1;
177b0 0a 20 20 77 68 69 6c 65 28 20 7a 46 69 6c 65 6e  .  while( zFilen
177c0 61 6d 65 5b 30 5d 20 29 7b 0a 20 20 20 20 69 6e  ame[0] ){.    in
177d0 74 20 78 20 3d 20 73 74 72 63 6d 70 28 7a 46 69  t x = strcmp(zFi
177e0 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
177f0 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b  .    zFilename +
17800 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33  = sqlite3Strlen3
17810 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31  0(zFilename) + 1
17820 3b 0a 20 20 20 20 69 66 28 20 78 3d 3d 30 20 29  ;.    if( x==0 )
17830 20 72 65 74 75 72 6e 20 7a 46 69 6c 65 6e 61 6d   return zFilenam
17840 65 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  e;.    zFilename
17850 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65   += sqlite3Strle
17860 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20 2b  n30(zFilename) +
17870 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
17880 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
17890 75 72 6e 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61  urn a boolean va
178a0 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72 79 20  lue for a query 
178b0 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a 69 6e  parameter..*/.in
178c0 74 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 62 6f  t sqlite3_uri_bo
178d0 6f 6c 65 61 6e 28 63 6f 6e 73 74 20 63 68 61 72  olean(const char
178e0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e   *zFilename, con
178f0 73 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c  st char *zParam,
17900 20 69 6e 74 20 62 44 66 6c 74 29 7b 0a 20 20 63   int bDflt){.  c
17910 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 73  onst char *z = s
17920 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61 6d  qlite3_uri_param
17930 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  eter(zFilename, 
17940 7a 50 61 72 61 6d 29 3b 0a 20 20 62 44 66 6c 74  zParam);.  bDflt
17950 20 3d 20 62 44 66 6c 74 21 3d 30 3b 0a 20 20 72   = bDflt!=0;.  r
17960 65 74 75 72 6e 20 7a 20 3f 20 73 71 6c 69 74 65  eturn z ? sqlite
17970 33 47 65 74 42 6f 6f 6c 65 61 6e 28 7a 2c 20 62  3GetBoolean(z, b
17980 44 66 6c 74 29 20 3a 20 62 44 66 6c 74 3b 0a 7d  Dflt) : bDflt;.}
17990 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
179a0 20 36 34 2d 62 69 74 20 69 6e 74 65 67 65 72 20   64-bit integer 
179b0 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75 65 72  value for a quer
179c0 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a 2f 0a  y parameter..*/.
179d0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 71  sqlite3_int64 sq
179e0 6c 69 74 65 33 5f 75 72 69 5f 69 6e 74 36 34 28  lite3_uri_int64(
179f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17a00 46 69 6c 65 6e 61 6d 65 2c 20 20 20 20 2f 2a 20  Filename,    /* 
17a10 46 69 6c 65 6e 61 6d 65 20 61 73 20 70 61 73 73  Filename as pass
17a20 65 64 20 74 6f 20 78 4f 70 65 6e 20 2a 2f 0a 20  ed to xOpen */. 
17a30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
17a40 72 61 6d 2c 20 20 20 20 20 20 20 2f 2a 20 55 52  ram,       /* UR
17a50 49 20 70 61 72 61 6d 65 74 65 72 20 73 6f 75 67  I parameter soug
17a60 68 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ht */.  sqlite3_
17a70 69 6e 74 36 34 20 62 44 66 6c 74 20 20 20 20 20  int64 bDflt     
17a80 20 20 2f 2a 20 72 65 74 75 72 6e 20 69 66 20 70    /* return if p
17a90 61 72 61 6d 65 74 65 72 20 69 73 20 6d 69 73 73  arameter is miss
17aa0 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73  ing */.){.  cons
17ab0 74 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69  t char *z = sqli
17ac0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
17ad0 72 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61  r(zFilename, zPa
17ae0 72 61 6d 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ram);.  sqlite3_
17af0 69 6e 74 36 34 20 76 3b 0a 20 20 69 66 28 20 7a  int64 v;.  if( z
17b00 20 26 26 20 73 71 6c 69 74 65 33 41 74 6f 69 36   && sqlite3Atoi6
17b10 34 28 7a 2c 20 26 76 2c 20 73 71 6c 69 74 65 33  4(z, &v, sqlite3
17b20 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c  Strlen30(z), SQL
17b30 49 54 45 5f 55 54 46 38 29 3d 3d 53 51 4c 49 54  ITE_UTF8)==SQLIT
17b40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c  E_OK ){.    bDfl
17b50 74 20 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74  t = v;.  }.  ret
17b60 75 72 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a  urn bDflt;.}../*
17b70 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42  .** Return the B
17b80 74 72 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65  tree pointer ide
17b90 6e 74 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61  ntified by zDbNa
17ba0 6d 65 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c  me.  Return NULL
17bb0 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a   if not found..*
17bc0 2f 0a 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33  /.Btree *sqlite3
17bd0 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71  DbNameToBtree(sq
17be0 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
17bf0 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
17c00 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
17c10 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
17c20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62  i++){.    if( db
17c30 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20  ->aDb[i].pBt.   
17c40 20 20 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30    && (zDbName==0
17c50 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
17c60 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e  mp(zDbName, db->
17c70 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30  aDb[i].zName)==0
17c80 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
17c90 65 74 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d  eturn db->aDb[i]
17ca0 2e 70 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  .pBt;.    }.  }.
17cb0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
17cc0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
17cd0 66 69 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20  filename of the 
17ce0 64 61 74 61 62 61 73 65 20 61 73 73 6f 63 69 61  database associa
17cf0 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61 62  ted with a datab
17d00 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f  ase.** connectio
17d10 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  n..*/.const char
17d20 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c   *sqlite3_db_fil
17d30 65 6e 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64  ename(sqlite3 *d
17d40 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  b, const char *z
17d50 44 62 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65  DbName){.  Btree
17d60 20 2a 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44   *pBt = sqlite3D
17d70 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
17d80 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74   zDbName);.  ret
17d90 75 72 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65  urn pBt ? sqlite
17da0 33 42 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d  3BtreeGetFilenam
17db0 65 28 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f  e(pBt) : 0;.}../
17dc0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
17dd0 20 64 61 74 61 62 61 73 65 20 69 73 20 72 65 61   database is rea
17de0 64 2d 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72  d-only or 0 if r
17df0 65 61 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75  ead/write.  Retu
17e00 72 6e 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73  rn -1 if.** no s
17e10 75 63 68 20 64 61 74 61 62 61 73 65 20 65 78 69  uch database exi
17e20 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  sts..*/.int sqli
17e30 74 65 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28  te3_db_readonly(
17e40 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
17e50 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
17e60 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20  ){.  Btree *pBt 
17e70 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54  = sqlite3DbNameT
17e80 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61  oBtree(db, zDbNa
17e90 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  me);.  return pB
17ea0 74 20 3f 20 73 71 6c 69 74 65 33 50 61 67 65 72  t ? sqlite3Pager
17eb0 49 73 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74  Isreadonly(sqlit
17ec0 65 33 42 74 72 65 65 50 61 67 65 72 28 70 42 74  e3BtreePager(pBt
17ed0 29 29 20 3a 20 2d 31 3b 0a 7d 0a                 )) : -1;.}.