/ Hex Artifact Content
Login

Artifact fafd3cd2a6c1211c29b9ef36b4af978ef01279ef:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66  u.h".#endif..#if
0320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0330: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0340: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0350: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0360: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0370: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0380: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
0390: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
03a0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
03b0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03d0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03e0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
03f0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0400: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0410: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0420: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0430: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0450: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0460: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0470: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0480: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0490: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
04a0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
04b0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
04c0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
04d0: 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30 30  F: R-63124-39300
04e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
04f0: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0500: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0510: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0520: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0530: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0540: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0550: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0560: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0570: 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ro. .*/.const ch
0580: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72  ar *sqlite3_sour
0590: 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74 75  ceid(void){ retu
05a0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  rn SQLITE_SOURCE
05b0: 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45  _ID; }../* IMPLE
05c0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
05d0: 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65 20  35210-63508 The 
05e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
05f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e 63  on_number() func
0600: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
0610: 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61 6c  an integer equal
0620: 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53 49   to SQLITE_VERSI
0630: 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e  ON_NUMBER..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  t sqlite3_libver
0650: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64  sion_number(void
0660: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0670: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b  _VERSION_NUMBER;
0680: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0690: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30 37 39  ATION-OF: R-2079
06a0: 30 2d 31 34 30 32 35 20 54 68 65 20 73 71 6c 69  0-14025 The sqli
06b0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
06c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
06d0: 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64  s.** zero if and
06e0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65 20   only if SQLite 
06f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
0700: 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64 65 20  h mutexing code 
0710: 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f 0a 2a  omitted due to.*
0720: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  * the SQLITE_THR
0730: 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c 65 2d  EADSAFE compile-
0740: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65 69 6e  time option bein
0750: 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69  g set to 0..*/.i
0760: 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  nt sqlite3_threa
0770: 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65 74  dsafe(void){ ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45 41  urn SQLITE_THREA
0790: 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21 64  DSAFE; }..#if !d
07a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
07b0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
07c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
07d0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
07e0: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
07f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  ng function poin
0800: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
0810: 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45  and if.** SQLITE
0820: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
0830: 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
0840: 20 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69   messages descri
0850: 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69  bing.** I/O acti
0860: 76 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75  ve are written u
0870: 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  sing this functi
0880: 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61  on.  These messa
0890: 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  ges.** are inten
08a0: 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ded for debuggin
08b0: 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e  g activity only.
08c0: 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c 69 74  .*/.void (*sqlit
08d0: 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74  e3IoTrace)(const
08e0: 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30   char*, ...) = 0
08f0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
0900: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0910: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0920: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0930: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0940: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0950: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0960: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0970: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0980: 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  re.** temporary 
0990: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  files..**.** See
09a0: 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d   also the "PRAGM
09b0: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
09c0: 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d  ectory" SQL comm
09d0: 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  and..*/.char *sq
09e0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
09f0: 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  tory = 0;../*.**
0a00: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
0a10: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
0a20: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
0a30: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
0a40: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
0a50: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
0a60: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
0a70: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
0a80: 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62  ore.** all datab
0a90: 61 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66  ase files specif
0aa0: 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74  ied with a relat
0ab0: 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a  ive pathname..**
0ac0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
0ad0: 20 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74   "PRAGMA data_st
0ae0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
0af0: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
0b00: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74  har *sqlite3_dat
0b10: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
0b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0b30: 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a  ze SQLite.  .**.
0b40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0b50: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74  must be called t
0b60: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
0b70: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0b80: 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20  on,.** VFS, and 
0b90: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73  mutex subsystems
0ba0: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
0bb0: 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b  any serious work
0bc0: 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e   with.** SQLite.
0bd0: 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73    But as long as
0be0: 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70   you do not comp
0bf0: 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ile with SQLITE_
0c00: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a  OMIT_AUTOINIT.**
0c10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
0c20: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74  ll be called aut
0c30: 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65  omatically by ke
0c40: 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20  y routines such 
0c50: 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70  as.** sqlite3_op
0c60: 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  en().  .**.** Th
0c70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
0c80: 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20  no-op except on 
0c90: 69 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63  its very first c
0ca0: 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63  all for the proc
0cb0: 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74  ess,.** or for t
0cc0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66  he first call af
0cd0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
0ce0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a  lite3_shutdown..
0cf0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
0d00: 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74  thread to call t
0d10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
0d20: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0d30: 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65  ion to.** comple
0d40: 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71  tion.  If subseq
0d50: 75 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c  uent threads cal
0d60: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  l this routine b
0d70: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
0d80: 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69  ** thread has fi
0d90: 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69  nished the initi
0da0: 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73  alization proces
0db0: 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73  s, then the subs
0dc0: 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64  equent.** thread
0dd0: 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74  s must block unt
0de0: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72  il the first thr
0df0: 65 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74  ead finishes wit
0e00: 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  h the initializa
0e10: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
0e20: 66 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67  first thread mig
0e30: 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ht call this rou
0e40: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
0e50: 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20  .  Recursive.** 
0e60: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f  calls to this ro
0e70: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
0e80: 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73   block, of cours
0e90: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
0ea0: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  e.** initializat
0eb0: 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c  ion process woul
0ec0: 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65  d never complete
0ed0: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65  ..**.** Let X be
0ee0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61   the first threa
0ef0: 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20  d to enter this 
0f00: 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20  routine.  Let Y 
0f10: 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  be some other.**
0f20: 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77   thread.  Then w
0f30: 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c  hile the initial
0f40: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
0f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58  his routine by X
0f60: 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74   is.** incomplet
0f70: 65 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65  e, it is require
0f80: 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  d that:.**.**   
0f90: 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69   *  Calls to thi
0fa0: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59  s routine from Y
0fb0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fc0: 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74  l the outer-most
0fd0: 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62  .**       call b
0fe0: 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a  y X completes..*
0ff0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72  *.**    *  Recur
1000: 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68  sive calls to th
1010: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  is routine from 
1020: 74 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20  thread X return 
1030: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
1040: 20 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f       without blo
1050: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
1060: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1070: 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f  (void){.  MUTEX_
1080: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
1090: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
10a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
10b0: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
10c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1100: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1110: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69  E_EXTRA_INIT.  i
1120: 6e 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74  nt bRunExtraInit
1130: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1150: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
1160: 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65  ion needed */.#e
1170: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1180: 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72  ITE_OMIT_WSD.  r
1190: 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f  c = sqlite3_wsd_
11a0: 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a  init(4096, 24);.
11b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
11d0: 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
11e0: 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65  ..  /* If SQLite
11f0: 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70   is already comp
1200: 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a  letely initializ
1210: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  ed, then this ca
1220: 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  ll.  ** to sqlit
1230: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
1240: 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f  should be a no-o
1250: 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74  p.  But the init
1260: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
1270: 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  must be complete
1280: 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73  .  So isInit mus
1290: 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74  t not be set unt
12a0: 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a  il the very end.
12b0: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75    ** of this rou
12c0: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tine..  */.  if(
12d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
12e0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
12f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1300: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
1310: 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 7b  NABLE_SQLLOG.  {
1320: 0a 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64  .    extern void
1330: 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71   sqlite3_init_sq
1340: 6c 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20  llog(void);.    
1350: 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c  sqlite3_init_sql
1360: 6c 6f 67 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  log();.  }.#endi
1370: 66 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72  f..  /* Make sur
1380: 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73  e the mutex subs
1390: 79 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c  ystem is initial
13a0: 69 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65  ized.  If unable
13b0: 20 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61   to .  ** initia
13c0: 6c 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73  lize the mutex s
13d0: 75 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e  ubsystem, return
13e0: 20 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20   early with the 
13f0: 65 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74  error..  ** If t
1400: 68 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20  he system is so 
1410: 73 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65  sick that we are
1420: 20 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63   unable to alloc
1430: 61 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a  ate a mutex,.  *
1440: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d  * there is not m
1450: 75 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f  uch SQLite is go
1460: 69 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74  ing to be able t
1470: 6f 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  o do..  **.  ** 
1480: 54 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  The mutex subsys
1490: 74 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61  tem must take ca
14a0: 72 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e  re of serializin
14b0: 67 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69  g its own.  ** i
14c0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20  nitialization.. 
14d0: 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   */.  rc = sqlit
14e0: 65 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20  e3MutexInit();. 
14f0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1500: 20 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69   rc;..  /* Initi
1510: 61 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63  alize the malloc
1520: 28 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68  () system and th
1530: 65 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69  e recursive pIni
1540: 74 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20  tMutex mutex..  
1550: 2a 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f  ** This operatio
1560: 6e 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62  n is protected b
1570: 79 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53  y the STATIC_MAS
1580: 54 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65  TER mutex.  Note
1590: 20 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78   that.  ** Mutex
15a0: 41 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65  Alloc() is calle
15b0: 64 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d  d for a static m
15c0: 75 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e  utex prior to in
15d0: 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20  itializing the. 
15e0: 20 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79   ** malloc subsy
15f0: 73 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c  stem - this impl
1600: 69 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c  ies that the all
1610: 6f 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61  ocation of a sta
1620: 74 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d  tic.  ** mutex m
1630: 75 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20  ust not require 
1640: 73 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65  support from the
1650: 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65   malloc subsyste
1660: 6d 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f  m..  */.  MUTEX_
1670: 4c 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d  LOGIC( pMaster =
1680: 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
1690: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
16a0: 53 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20  STATIC_MASTER); 
16b0: 29 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ).  sqlite3_mute
16c0: 78 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29  x_enter(pMaster)
16d0: 3b 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  ;.  sqlite3Globa
16e0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
16f0: 6e 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21  nit = 1;.  if( !
1700: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1710: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1720: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
1730: 69 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29  ite3MallocInit()
1740: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1750: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1760: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1770: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
1780: 74 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21  t = 1;.    if( !
1790: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
17a0: 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29  fig.pInitMutex )
17b0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
17c0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69  lobalConfig.pIni
17d0: 74 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20  tMutex =.       
17e0: 20 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78      sqlite3Mutex
17f0: 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  Alloc(SQLITE_MUT
1800: 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20  EX_RECURSIVE);. 
1810: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
1820: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f  GlobalConfig.bCo
1830: 72 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69  reMutex && !sqli
1840: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1850: 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20  pInitMutex ){.  
1860: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1870: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
1880: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1890: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
18a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  {.    sqlite3Glo
18b0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
18c0: 69 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20  itMutex++;.  }. 
18d0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
18e0: 65 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a  eave(pMaster);..
18f0: 20 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f    /* If rc is no
1900: 74 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74  t SQLITE_OK at t
1910: 68 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20  his point, then 
1920: 65 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f  either the mallo
1930: 63 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d  c.  ** subsystem
1940: 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e   could not be in
1950: 69 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65  itialized or the
1960: 20 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74   system failed t
1970: 6f 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20  o allocate.  ** 
1980: 74 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d  the pInitMutex m
1990: 75 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20  utex. Return an 
19a0: 65 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20  error in either 
19b0: 63 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20  case.  */.  if( 
19c0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
19d0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
19e0: 20 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65    }..  /* Do the
19f0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69   rest of the ini
1a00: 74 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65  tialization unde
1a10: 72 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20  r the recursive 
1a20: 6d 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68  mutex so.  ** th
1a30: 61 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62  at we will be ab
1a40: 6c 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63  le to handle rec
1a50: 75 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74  ursive calls int
1a60: 6f 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69  o.  ** sqlite3_i
1a70: 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68  nitialize().  Th
1a80: 65 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c  e recursive call
1a90: 73 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20  s normally come 
1aa0: 74 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c  through.  ** sql
1ab0: 69 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77  ite3_os_init() w
1ac0: 68 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73  hen it invokes s
1ad0: 71 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73  qlite3_vfs_regis
1ae0: 74 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72  ter(), but other
1af0: 0a 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20  .  ** recursive 
1b00: 63 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f  calls might also
1b10: 20 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20   be possible..  
1b20: 2a 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e  **.  ** IMPLEMEN
1b30: 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31  TATION-OF: R-001
1b40: 34 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20  40-37445 SQLite 
1b50: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65  automatically se
1b60: 72 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20  rializes calls. 
1b70: 20 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74   ** to the xInit
1b80: 20 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20   method, so the 
1b90: 78 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65  xInit method nee
1ba0: 64 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73  d not be threads
1bb0: 61 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  afe..  **.  ** T
1bc0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74  he following mut
1bd0: 65 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61  ex is what seria
1be0: 6c 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20  lizes access to 
1bf0: 74 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68  the appdef pcach
1c00: 65 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74  e xInit.  ** met
1c10: 68 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74  hods.  The sqlit
1c20: 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64  e3_pcache_method
1c30: 73 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73  s.xInit() all is
1c40: 20 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65   embedded in the
1c50: 0a 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71  .  ** call to sq
1c60: 6c 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69  lite3PcacheIniti
1c70: 61 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20  alize()..  */.  
1c80: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
1c90: 74 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61  ter(sqlite3Globa
1ca0: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
1cb0: 65 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ex);.  if( sqlit
1cc0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1cd0: 73 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69  sInit==0 && sqli
1ce0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1cf0: 69 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b  inProgress==0 ){
1d00: 0a 20 20 20 20 46 75 6e 63 44 65 66 48 61 73 68  .    FuncDefHash
1d10: 20 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41   *pHash = &GLOBA
1d20: 4c 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73  L(FuncDefHash, s
1d30: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63  qlite3GlobalFunc
1d40: 74 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69  tions);.    sqli
1d50: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1d60: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a  inProgress = 1;.
1d70: 20 20 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68      memset(pHash
1d80: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
1d90: 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f  te3GlobalFunctio
1da0: 6e 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ns));.    sqlite
1db0: 33 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46  3RegisterGlobalF
1dc0: 75 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20  unctions();.    
1dd0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
1de0: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
1df0: 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Init==0 ){.     
1e00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61   rc = sqlite3Pca
1e10: 63 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b  cheInitialize();
1e20: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1e30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1e40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1e50: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
1e60: 68 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  heInit = 1;.    
1e70: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1e80: 49 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20  Init();.    }.  
1e90: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1ea0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  _OK ){.      sql
1eb0: 69 74 65 33 50 43 61 63 68 65 42 75 66 66 65 72  ite3PCacheBuffer
1ec0: 53 65 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c  Setup( sqlite3Gl
1ed0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65  obalConfig.pPage
1ee0: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
1ef0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
1f00: 2e 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33  .szPage, sqlite3
1f10: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61  GlobalConfig.nPa
1f20: 67 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ge);.      sqlit
1f30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1f40: 73 49 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65  sInit = 1;.#ifde
1f50: 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49  f SQLITE_EXTRA_I
1f60: 4e 49 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78  NIT.      bRunEx
1f70: 74 72 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e  traInit = 1;.#en
1f80: 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  dif.    }.    sq
1f90: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1fa0: 67 2e 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30  g.inProgress = 0
1fb0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
1fc0: 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69  mutex_leave(sqli
1fd0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1fe0: 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20  pInitMutex);..  
1ff0: 2f 2a 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72  /* Go back under
2000: 20 74 68 65 20 73 74 61 74 69 63 20 6d 75 74 65   the static mute
2010: 78 20 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74  x and clean up t
2020: 68 65 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a  he recursive.  *
2030: 2a 20 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65  * mutex to preve
2040: 6e 74 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65  nt a resource le
2050: 61 6b 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ak..  */.  sqlit
2060: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70  e3_mutex_enter(p
2070: 4d 61 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74  Master);.  sqlit
2080: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
2090: 52 65 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a  RefInitMutex--;.
20a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
20b0: 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e  balConfig.nRefIn
20c0: 69 74 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20  itMutex<=0 ){.  
20d0: 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65    assert( sqlite
20e0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52  3GlobalConfig.nR
20f0: 65 66 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29  efInitMutex==0 )
2100: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  ;.    sqlite3_mu
2110: 74 65 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33  tex_free(sqlite3
2120: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e  GlobalConfig.pIn
2130: 69 74 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71  itMutex);.    sq
2140: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2150: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30  g.pInitMutex = 0
2160: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
2170: 6d 75 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73  mutex_leave(pMas
2180: 74 65 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ter);..  /* The 
2190: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73  following is jus
21a0: 74 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  t a sanity check
21b0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51   to make sure SQ
21c0: 4c 69 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65  Lite has.  ** be
21d0: 65 6e 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72  en compiled corr
21e0: 65 63 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d  ectly.  It is im
21f0: 70 6f 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74  portant to run t
2200: 68 69 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20  his code, but.  
2210: 2a 2a 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74  ** we don't want
2220: 20 74 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f   to run it too o
2230: 66 74 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70  ften and soak up
2240: 20 43 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20   CPU cycles for 
2250: 6e 6f 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20  no.  ** reason. 
2260: 20 53 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e   So we run it on
2270: 63 65 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61  ce during initia
2280: 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23  lization..  */.#
2290: 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69  ifndef NDEBUG.#i
22a0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
22b0: 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
22c0: 0a 20 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69  .  /* This secti
22d0: 6f 6e 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c  on of code's onl
22e0: 79 20 22 6f 75 74 70 75 74 22 20 69 73 20 76 69  y "output" is vi
22f0: 61 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  a assert() state
2300: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28  ments. */.  if (
2310: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2320: 7b 0a 20 20 20 20 75 36 34 20 78 20 3d 20 28 28  {.    u64 x = ((
2330: 28 75 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a  (u64)1)<<63)-1;.
2340: 20 20 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20      double y;.  
2350: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
2360: 78 29 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65  x)==8);.    asse
2370: 72 74 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69  rt(sizeof(x)==si
2380: 7a 65 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65  zeof(y));.    me
2390: 6d 63 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b  mcpy(&y, &x, 8);
23a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c  .    assert( sql
23b0: 69 74 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a  ite3IsNaN(y) );.
23c0: 20 20 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69    }.#endif.#endi
23d0: 66 0a 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61  f..  /* Do extra
23e0: 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20   initialization 
23f0: 73 74 65 70 73 20 72 65 71 75 65 73 74 65 64 20  steps requested 
2400: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58  by the SQLITE_EX
2410: 54 52 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f  TRA_INIT.  ** co
2420: 6d 70 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f  mpile-time optio
2430: 6e 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  n..  */.#ifdef S
2440: 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54  QLITE_EXTRA_INIT
2450: 0a 20 20 69 66 28 20 62 52 75 6e 45 78 74 72 61  .  if( bRunExtra
2460: 49 6e 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Init ){.    int 
2470: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
2480: 54 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  T(const char*);.
2490: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
24a0: 45 58 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20  EXTRA_INIT(0);. 
24b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74   }.#endif..  ret
24c0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
24d0: 20 55 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74   Undo the effect
24e0: 73 20 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69  s of sqlite3_ini
24f0: 74 69 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74  tialize().  Must
2500: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77   not be called w
2510: 68 69 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72  hile.** there ar
2520: 65 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61  e outstanding da
2530: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
2540: 6e 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c  ns or memory all
2550: 6f 63 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77  ocations or.** w
2560: 68 69 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66  hile any part of
2570: 20 53 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72   SQLite is other
2580: 77 69 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61  wise in use in a
2590: 6e 79 20 74 68 72 65 61 64 2e 20 20 54 68 69 73  ny thread.  This
25a0: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e  .** routine is n
25b0: 6f 74 20 74 68 72 65 61 64 73 61 66 65 2e 20 20  ot threadsafe.  
25c0: 42 75 74 20 69 74 20 69 73 20 73 61 66 65 20 74  But it is safe t
25d0: 6f 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f  o invoke this ro
25e0: 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e  utine.** on when
25f0: 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61   SQLite is alrea
2600: 64 79 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49  dy shut down.  I
2610: 66 20 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65  f SQLite is alre
2620: 61 64 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a  ady shut down.**
2630: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2640: 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74  ne is invoked, t
2650: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
2660: 20 69 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e   is a harmless n
2670: 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  o-op..*/.int sql
2680: 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f  ite3_shutdown(vo
2690: 69 64 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  id){.  if( sqlit
26a0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
26b0: 73 49 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20  sInit ){.#ifdef 
26c0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
26d0: 54 44 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53  TDOWN.    void S
26e0: 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54  QLITE_EXTRA_SHUT
26f0: 44 4f 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20  DOWN(void);.    
2700: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55  SQLITE_EXTRA_SHU
2710: 54 44 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a  TDOWN();.#endif.
2720: 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65      sqlite3_os_e
2730: 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nd();.    sqlite
2740: 33 5f 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74  3_reset_auto_ext
2750: 65 6e 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71  ension();.    sq
2760: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
2770: 67 2e 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20  g.isInit = 0;.  
2780: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2790: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43  lobalConfig.isPC
27a0: 61 63 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20  acheInit ){.    
27b0: 73 71 6c 69 74 65 33 50 63 61 63 68 65 53 68 75  sqlite3PcacheShu
27c0: 74 64 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c  tdown();.    sql
27d0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
27e0: 2e 69 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20  .isPCacheInit = 
27f0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
2800: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2810: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b  .isMallocInit ){
2820: 0a 20 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c  .    sqlite3Mall
2830: 6f 63 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c  ocEnd();.    sql
2840: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2850: 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20  .isMallocInit = 
2860: 30 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  0;..#ifndef SQLI
2870: 54 45 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e  TE_OMIT_SHUTDOWN
2880: 5f 44 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20  _DIRECTORIES.   
2890: 20 2f 2a 20 54 68 65 20 68 65 61 70 20 73 75 62   /* The heap sub
28a0: 73 79 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62  system has now b
28b0: 65 65 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64  een shutdown and
28c0: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 61 72   these values ar
28d0: 65 20 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a  e supposed.    *
28e0: 2a 20 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20  * to be NULL or 
28f0: 70 6f 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20  point to memory 
2900: 74 68 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65  that was obtaine
2910: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
2920: 61 6c 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20  alloc(),.    ** 
2930: 77 68 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79  which would rely
2940: 20 6f 6e 20 74 68 61 74 20 68 65 61 70 20 73 75   on that heap su
2950: 62 73 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f  bsystem; therefo
2960: 72 65 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68  re, make sure th
2970: 65 73 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65  ese.    ** value
2980: 73 20 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74  s cannot refer t
2990: 6f 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68  o heap memory th
29a0: 61 74 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61  at was just inva
29b0: 6c 69 64 61 74 65 64 20 77 68 65 6e 20 74 68 65  lidated when the
29c0: 0a 20 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62  .    ** heap sub
29d0: 73 79 73 74 65 6d 20 77 61 73 20 73 68 75 74 64  system was shutd
29e0: 6f 77 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e  own.  This is on
29f0: 6c 79 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63  ly done if the c
2a00: 75 72 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  urrent call to. 
2a10: 20 20 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74     ** this funct
2a20: 69 6f 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20  ion resulted in 
2a30: 74 68 65 20 68 65 61 70 20 73 75 62 73 79 73 74  the heap subsyst
2a40: 65 6d 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e  em actually bein
2a50: 67 20 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20  g shutdown..    
2a60: 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  */.    sqlite3_d
2a70: 61 74 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  ata_directory = 
2a80: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74  0;.    sqlite3_t
2a90: 65 6d 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20  emp_directory = 
2aa0: 30 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  0;.#endif.  }.  
2ab0: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2ac0: 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49  lConfig.isMutexI
2ad0: 6e 69 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nit ){.    sqlit
2ae0: 65 33 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20  e3MutexEnd();.  
2af0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
2b00: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2b10: 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65  t = 0;.  }..  re
2b20: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
2b30: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50  }../*.** This AP
2b40: 49 20 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61  I allows applica
2b50: 74 69 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20  tions to modify 
2b60: 74 68 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69  the global confi
2b70: 67 75 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  guration of.** t
2b80: 68 65 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72  he SQLite librar
2b90: 79 20 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a  y at run-time..*
2ba0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2bb0: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
2bc0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
2bd0: 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61  re are no outsta
2be0: 6e 64 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73  nding.** databas
2bf0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72  e connections or
2c00: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2c10: 6f 6e 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69  ons.  This routi
2c20: 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72  ne is not.** thr
2c30: 65 61 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72  eadsafe.  Failur
2c40: 65 20 74 6f 20 68 65 65 64 20 74 68 65 73 65 20  e to heed these 
2c50: 77 61 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61  warnings can lea
2c60: 64 20 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62  d to unpredictab
2c70: 6c 65 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a  le.** behavior..
2c80: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
2c90: 6f 6e 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e  onfig(int op, ..
2ca0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2cb0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2cc0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71  ITE_OK;..  /* sq
2cd0: 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73  lite3_config() s
2ce0: 68 61 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49  hall return SQLI
2cf0: 54 45 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20  TE_MISUSE if it 
2d00: 69 73 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65  is invoked while
2d10: 0a 20 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65  .  ** the SQLite
2d20: 20 6c 69 62 72 61 72 79 20 69 73 20 69 6e 20 75   library is in u
2d30: 73 65 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c  se. */.  if( sql
2d40: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2d50: 2e 69 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e  .isInit ) return
2d60: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
2d70: 4b 50 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74  KPT;..  va_start
2d80: 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74  (ap, op);.  swit
2d90: 63 68 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f  ch( op ){..    /
2da0: 2a 20 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72  * Mutex configur
2db0: 61 74 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72  ation options ar
2dc0: 65 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  e only available
2dd0: 20 69 6e 20 61 20 74 68 72 65 61 64 73 61 66 65   in a threadsafe
2de0: 0a 20 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e  .    ** compile.
2df0: 20 0a 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66   .    */.#if def
2e00: 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45  ined(SQLITE_THRE
2e10: 41 44 53 41 46 45 29 20 26 26 20 53 51 4c 49 54  ADSAFE) && SQLIT
2e20: 45 5f 54 48 52 45 41 44 53 41 46 45 3e 30 0a 20  E_THREADSAFE>0. 
2e30: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
2e40: 4f 4e 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45  ONFIG_SINGLETHRE
2e50: 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44  AD: {.      /* D
2e60: 69 73 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78  isable all mutex
2e70: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ing */.      sql
2e80: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2e90: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b  .bCoreMutex = 0;
2ea0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2eb0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
2ec0: 4d 75 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20  Mutex = 0;.     
2ed0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2ee0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
2ef0: 4e 46 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44  NFIG_MULTITHREAD
2f00: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73  : {.      /* Dis
2f10: 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66  able mutexing of
2f20: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
2f30: 74 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f  tions */.      /
2f40: 2a 20 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e  * Enable mutexin
2f50: 67 20 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73  g of core data s
2f60: 74 72 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20  tructures */.   
2f70: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2f80: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
2f90: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  x = 1;.      sql
2fa0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2fb0: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b  .bFullMutex = 0;
2fc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2fd0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
2fe0: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41  ITE_CONFIG_SERIA
2ff0: 4c 49 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f  LIZED: {.      /
3000: 2a 20 45 6e 61 62 6c 65 20 61 6c 6c 20 6d 75 74  * Enable all mut
3010: 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73  exing */.      s
3020: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3030: 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20  ig.bCoreMutex = 
3040: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
3050: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
3060: 6c 6c 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20  llMutex = 1;.   
3070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3080: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3090: 43 4f 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a  CONFIG_MUTEX: {.
30a0: 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79        /* Specify
30b0: 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20   an alternative 
30c0: 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61  mutex implementa
30d0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
30e0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
30f0: 67 2e 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72  g.mutex = *va_ar
3100: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75  g(ap, sqlite3_mu
3110: 74 65 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20  tex_methods*);. 
3120: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3130: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
3140: 45 5f 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45  E_CONFIG_GETMUTE
3150: 58 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65  X: {.      /* Re
3160: 74 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65  trieve the curre
3170: 6e 74 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65  nt mutex impleme
3180: 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ntation */.     
3190: 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c   *va_arg(ap, sql
31a0: 69 74 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f  ite3_mutex_metho
31b0: 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c  ds*) = sqlite3Gl
31c0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78  obalConfig.mutex
31d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
31e0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20     }.#endif...  
31f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3200: 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  NFIG_MALLOC: {. 
3210: 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20       /* Specify 
3220: 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  an alternative m
3230: 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61  alloc implementa
3240: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
3250: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3260: 67 2e 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70  g.m = *va_arg(ap
3270: 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65  , sqlite3_mem_me
3280: 74 68 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62  thods*);.      b
3290: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
32a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
32b0: 49 47 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a  IG_GETMALLOC: {.
32c0: 20 20 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76        /* Retriev
32d0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  e the current ma
32e0: 6c 6c 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74  lloc() implement
32f0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
3300: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
3310: 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63  Config.m.xMalloc
3320: 3d 3d 30 20 29 20 73 71 6c 69 74 65 33 4d 65 6d  ==0 ) sqlite3Mem
3330: 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20  SetDefault();.  
3340: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
3350: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3360: 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ods*) = sqlite3G
3370: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20  lobalConfig.m;. 
3380: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3390: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
33a0: 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54  E_CONFIG_MEMSTAT
33b0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45  US: {.      /* E
33c0: 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
33d0: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 73 74 61 74   the malloc stat
33e0: 75 73 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 2a 2f  us collection */
33f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
3400: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73  obalConfig.bMems
3410: 74 61 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tat = va_arg(ap,
3420: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
3430: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3440: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3450: 5f 53 43 52 41 54 43 48 3a 20 7b 0a 20 20 20 20  _SCRATCH: {.    
3460: 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61    /* Designate a
3470: 20 62 75 66 66 65 72 20 66 6f 72 20 73 63 72 61   buffer for scra
3480: 74 63 68 20 6d 65 6d 6f 72 79 20 73 70 61 63 65  tch memory space
3490: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
34a0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53  3GlobalConfig.pS
34b0: 63 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28  cratch = va_arg(
34c0: 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20  ap, void*);.    
34d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
34e0: 6f 6e 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20  onfig.szScratch 
34f0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3500: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3510: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63  GlobalConfig.nSc
3520: 72 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61  ratch = va_arg(a
3530: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62  p, int);.      b
3540: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3550: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3560: 49 47 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a  IG_PAGECACHE: {.
3570: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61        /* Designa
3580: 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20  te a buffer for 
3590: 70 61 67 65 20 63 61 63 68 65 20 6d 65 6d 6f 72  page cache memor
35a0: 79 20 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20  y space */.     
35b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
35c0: 6e 66 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f  nfig.pPage = va_
35d0: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
35e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
35f0: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65  balConfig.szPage
3600: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
3610: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
3620: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50  3GlobalConfig.nP
3630: 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  age = va_arg(ap,
3640: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
3650: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
3660: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3670: 47 5f 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20  G_PCACHE: {.    
3680: 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
3690: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
36a0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
36b0: 5f 43 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48  _CONFIG_GETPCACH
36c0: 45 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f  E: {.      /* no
36d0: 77 20 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20  w an error */.  
36e0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
36f0: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
3700: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
3710: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3720: 47 5f 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20  G_PCACHE2: {.   
3730: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
3740: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67   alternative pag
3750: 65 20 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e  e cache implemen
3760: 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  tation */.      
3770: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3780: 66 69 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76  fig.pcache2 = *v
3790: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
37a0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
37b0: 32 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  2*);.      break
37c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
37d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47   SQLITE_CONFIG_G
37e0: 45 54 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20  ETPCACHE2: {.   
37f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
3800: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68  obalConfig.pcach
3810: 65 32 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20  e2.xInit==0 ){. 
3820: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 43         sqlite3PC
3830: 61 63 68 65 53 65 74 44 65 66 61 75 6c 74 28 29  acheSetDefault()
3840: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3850: 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69  *va_arg(ap, sqli
3860: 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f  te3_pcache_metho
3870: 64 73 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47  ds2*) = sqlite3G
3880: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63  lobalConfig.pcac
3890: 68 65 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  he2;.      break
38a0: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66  ;.    }..#if def
38b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
38c0: 4c 45 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64  LE_MEMSYS3) || d
38d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
38e0: 41 42 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20  ABLE_MEMSYS5).  
38f0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3900: 4e 46 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20  NFIG_HEAP: {.   
3910: 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20     /* Designate 
3920: 61 20 62 75 66 66 65 72 20 66 6f 72 20 68 65 61  a buffer for hea
3930: 70 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a  p memory space *
3940: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3950: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61  lobalConfig.pHea
3960: 70 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  p = va_arg(ap, v
3970: 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  oid*);.      sql
3980: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3990: 2e 6e 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28  .nHeap = va_arg(
39a0: 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
39b0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
39c0: 66 69 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61  fig.mnReq = va_a
39d0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20  rg(ap, int);..  
39e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
39f0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65  lobalConfig.mnRe
3a00: 71 3c 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73  q<1 ){.        s
3a10: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3a20: 69 67 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20  ig.mnReq = 1;.  
3a30: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71      }else if( sq
3a40: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3a50: 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20  g.mnReq>(1<<12) 
3a60: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61  ){.        /* ca
3a70: 70 20 6d 69 6e 20 72 65 71 75 65 73 74 20 73 69  p min request si
3a80: 7a 65 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20  ze at 2^12 */.  
3a90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3aa0: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20  balConfig.mnReq 
3ab0: 3d 20 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20  = (1<<12);.     
3ac0: 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71   }..      if( sq
3ad0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3ae0: 67 2e 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20  g.pHeap==0 ){.  
3af0: 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
3b00: 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20  heap pointer is 
3b10: 4e 55 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f  NULL, then resto
3b20: 72 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d  re the malloc im
3b30: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20  plementation.   
3b40: 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20       ** back to 
3b50: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f  NULL pointers to
3b60: 6f 2e 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61  o.  This will ca
3b70: 75 73 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74  use the malloc t
3b80: 6f 20 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20  o go.        ** 
3b90: 62 61 63 6b 20 74 6f 20 69 74 73 20 64 65 66 61  back to its defa
3ba0: 75 6c 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ult implementati
3bb0: 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f  on when sqlite3_
3bc0: 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 69 73 0a  initialize() is.
3bd0: 20 20 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a          ** run..
3be0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
3bf0: 20 20 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74     memset(&sqlit
3c00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3c10: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69  , 0, sizeof(sqli
3c20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3c30: 6d 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  m));.      }else
3c40: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  {.        /* The
3c50: 20 68 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73   heap pointer is
3c60: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
3c70: 69 6e 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74  install one of t
3c80: 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65  he.        ** me
3c90: 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68  m5.c/mem3.c meth
3ca0: 6f 64 73 2e 20 20 54 68 65 20 65 6e 63 6c 6f 73  ods.  The enclos
3cb0: 69 6e 67 20 23 69 66 20 67 75 61 72 61 6e 74 65  ing #if guarante
3cc0: 65 73 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a  es at.        **
3cd0: 20 6c 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68   least one of th
3ce0: 65 73 65 20 6d 65 74 68 6f 64 73 20 69 73 20 63  ese methods is c
3cf0: 75 72 72 65 6e 74 6c 79 20 65 6e 61 62 6c 65 64  urrently enabled
3d00: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66  ..        */.#if
3d10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
3d20: 45 5f 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20  E_MEMSYS3.      
3d30: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3d40: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74  onfig.m = *sqlit
3d50: 65 33 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28  e3MemGetMemsys3(
3d60: 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
3d70: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
3d80: 45 4d 53 59 53 35 0a 20 20 20 20 20 20 20 20 73  EMSYS5.        s
3d90: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3da0: 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d  ig.m = *sqlite3M
3db0: 65 6d 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a  emGetMemsys5();.
3dc0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20  #endif.      }. 
3dd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3de0: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61  }.#endif..    ca
3df0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3e00: 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20  _LOOKASIDE: {.  
3e10: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3e20: 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73  lConfig.szLookas
3e30: 69 64 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  ide = va_arg(ap,
3e40: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
3e50: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3e60: 2e 6e 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61  .nLookaside = va
3e70: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
3e80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3e90: 7d 0a 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65  }.    .    /* Re
3ea0: 63 6f 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74  cord a pointer t
3eb0: 6f 20 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e  o the logger fun
3ec0: 63 74 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69  ction and its fi
3ed0: 72 73 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20  rst argument..  
3ee0: 20 20 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74    ** The default
3ef0: 20 69 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69   is NULL.  Loggi
3f00: 6e 67 20 69 73 20 64 69 73 61 62 6c 65 64 20 69  ng is disabled i
3f10: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70  f the function p
3f20: 6f 69 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a  ointer is.    **
3f30: 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20   NULL..    */.  
3f40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3f50: 4e 46 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20  NFIG_LOG: {.    
3f60: 20 20 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63    /* MSVC is pic
3f70: 6b 79 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67  ky about pulling
3f80: 20 66 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20   func ptrs from 
3f90: 76 61 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20  va lists..      
3fa0: 2a 2a 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72  ** http://suppor
3fb0: 74 2e 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f  t.microsoft.com/
3fc0: 6b 62 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a  kb/47961.      *
3fd0: 2a 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  * sqlite3GlobalC
3fe0: 6f 6e 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f  onfig.xLog = va_
3ff0: 61 72 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28  arg(ap, void(*)(
4000: 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20  void*,int,const 
4010: 63 68 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a  char*));.      *
4020: 2f 0a 20 20 20 20 20 20 74 79 70 65 64 65 66 20  /.      typedef 
4030: 76 6f 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29  void(*LOGFUNC_t)
4040: 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
4050: 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73   char*);.      s
4060: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4070: 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67  ig.xLog = va_arg
4080: 28 61 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b  (ap, LOGFUNC_t);
4090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
40a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41  obalConfig.pLogA
40b0: 72 67 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  rg = va_arg(ap, 
40c0: 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72  void*);.      br
40d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
40e0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
40f0: 49 47 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20  IG_URI: {.      
4100: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4110: 66 69 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76  fig.bOpenUri = v
4120: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
4130: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4140: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c   }..    case SQL
4150: 49 54 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52  ITE_CONFIG_COVER
4160: 49 4e 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20  ING_INDEX_SCAN: 
4170: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  {.      sqlite3G
4180: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65  lobalConfig.bUse
4190: 43 69 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Cis = va_arg(ap,
41a0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
41b0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65  ak;.    }..#ifde
41c0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
41d0: 53 51 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20  SQLLOG.    case 
41e0: 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51  SQLITE_CONFIG_SQ
41f0: 4c 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79  LLOG: {.      ty
4200: 70 65 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c  pedef void(*SQLL
4210: 4f 47 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c  OGFUNC_t)(void*,
4220: 20 73 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74   sqlite3*, const
4230: 20 63 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20   char*, int);.  
4240: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4250: 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20  lConfig.xSqllog 
4260: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c  = va_arg(ap, SQL
4270: 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20  LOGFUNC_t);.    
4280: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
4290: 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
42a0: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
42b0: 69 64 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  id *);.      bre
42c0: 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  ak;.    }.#endif
42d0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
42e0: 45 5f 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49  E_CONFIG_MMAP_SI
42f0: 5a 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ZE: {.      sqli
4300: 74 65 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70  te3_int64 szMmap
4310: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71   = va_arg(ap, sq
4320: 6c 69 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20  lite3_int64);.  
4330: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
4340: 34 20 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72  4 mxMmap = va_ar
4350: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e  g(ap, sqlite3_in
4360: 74 36 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20  t64);.      if( 
4370: 6d 78 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d  mxMmap<0 || mxMm
4380: 61 70 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d  ap>SQLITE_MAX_MM
4390: 41 50 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20  AP_SIZE ){.     
43a0: 20 20 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49     mxMmap = SQLI
43b0: 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45  TE_MAX_MMAP_SIZE
43c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
43d0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
43e0: 66 69 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d  fig.mxMmap = mxM
43f0: 6d 61 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73  map;.      if( s
4400: 7a 4d 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70  zMmap<0 ) szMmap
4410: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
4420: 54 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20  T_MMAP_SIZE;.   
4430: 20 20 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78     if( szMmap>mx
4440: 4d 6d 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d  Mmap) szMmap = m
4450: 78 4d 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c  xMmap;.      sql
4460: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4470: 2e 73 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70  .szMmap = szMmap
4480: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4490: 20 20 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45     }..#if SQLITE
44a0: 5f 4f 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e  _OS_WIN && defin
44b0: 65 64 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f  ed(SQLITE_WIN32_
44c0: 4d 41 4c 4c 4f 43 29 0a 20 20 20 20 63 61 73 65  MALLOC).    case
44d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57   SQLITE_CONFIG_W
44e0: 49 4e 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b  IN32_HEAPSIZE: {
44f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
4500: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70  obalConfig.nHeap
4510: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4520: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
4530: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
4540: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
4550: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4560: 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65  ERROR;.      bre
4570: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
4580: 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65  va_end(ap);.  re
4590: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
45a0: 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f  * Set up the loo
45b0: 6b 61 73 69 64 65 20 62 75 66 66 65 72 73 20 66  kaside buffers f
45c0: 6f 72 20 61 20 64 61 74 61 62 61 73 65 20 63 6f  or a database co
45d0: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74  nnection..** Ret
45e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
45f0: 20 73 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49   success.  .** I
4600: 66 20 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61  f lookaside is a
4610: 6c 72 65 61 64 79 20 61 63 74 69 76 65 2c 20 72  lready active, r
4620: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
4630: 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20  Y..**.** The sz 
4640: 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 68 65  parameter is the
4650: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
4660: 20 69 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69   in each lookasi
4670: 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20  de slot..** The 
4680: 63 6e 74 20 70 61 72 61 6d 65 74 65 72 20 69 73  cnt parameter is
4690: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
46a0: 6c 6f 74 73 2e 20 20 49 66 20 70 53 74 61 72 74  lots.  If pStart
46b0: 20 69 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20   is NULL the.** 
46c0: 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f  space for the lo
46d0: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69  okaside memory i
46e0: 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  s obtained from 
46f0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29  sqlite3_malloc()
4700: 2e 0a 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69  ..** If pStart i
4710: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
4720: 69 74 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74  it is sz*cnt byt
4730: 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20  es of memory to 
4740: 75 73 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c  use for.** the l
4750: 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e  ookaside memory.
4760: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
4770: 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71  etupLookaside(sq
4780: 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20  lite3 *db, void 
4790: 2a 70 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69  *pBuf, int sz, i
47a0: 6e 74 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20  nt cnt){.  void 
47b0: 2a 70 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64  *pStart;.  if( d
47c0: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75  b->lookaside.nOu
47d0: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
47e0: 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
47f0: 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65  .  /* Free any e
4800: 78 69 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64  xisting lookasid
4810: 65 20 62 75 66 66 65 72 20 66 6f 72 20 74 68 69  e buffer for thi
4820: 73 20 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a  s handle before.
4830: 20 20 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20    ** allocating 
4840: 61 20 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20  a new one so we 
4850: 64 6f 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61  don't have to ha
4860: 76 65 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20  ve space for .  
4870: 2a 2a 20 62 6f 74 68 20 61 74 20 74 68 65 20 73  ** both at the s
4880: 61 6d 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20  ame time..  */. 
4890: 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69   if( db->lookasi
48a0: 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a  de.bMalloced ){.
48b0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
48c0: 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70  (db->lookaside.p
48d0: 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a  Start);.  }.  /*
48e0: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c   The size of a l
48f0: 6f 6f 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66  ookaside slot af
4900: 74 65 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e  ter ROUNDDOWN8 n
4910: 65 65 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65  eeds to be large
4920: 72 0a 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f  r.  ** than a po
4930: 69 6e 74 65 72 20 74 6f 20 62 65 20 75 73 65 66  inter to be usef
4940: 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20  ul..  */.  sz = 
4950: 52 4f 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20  ROUNDDOWN8(sz); 
4960: 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38   /* IMP: R-33038
4970: 2d 30 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20  -09382 */.  if( 
4980: 73 7a 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28  sz<=(int)sizeof(
4990: 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20  LookasideSlot*) 
49a0: 29 20 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20  ) sz = 0;.  if( 
49b0: 63 6e 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b  cnt<0 ) cnt = 0;
49c0: 0a 20 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20  .  if( sz==0 || 
49d0: 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a  cnt==0 ){.    sz
49e0: 20 3d 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74   = 0;.    pStart
49f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66   = 0;.  }else if
4a00: 28 20 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pBuf==0 ){.   
4a10: 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e   sqlite3BeginBen
4a20: 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20  ignMalloc();.   
4a30: 20 70 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65   pStart = sqlite
4a40: 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20  3Malloc( sz*cnt 
4a50: 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31  );  /* IMP: R-61
4a60: 39 34 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20  949-35727 */.   
4a70: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
4a80: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69  nMalloc();.    i
4a90: 66 28 20 70 53 74 61 72 74 20 29 20 63 6e 74 20  f( pStart ) cnt 
4aa0: 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53  = sqlite3MallocS
4ab0: 69 7a 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a  ize(pStart)/sz;.
4ac0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74    }else{.    pSt
4ad0: 61 72 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a  art = pBuf;.  }.
4ae0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4af0: 70 53 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b  pStart = pStart;
4b00: 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  .  db->lookaside
4b10: 2e 70 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62  .pFree = 0;.  db
4b20: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d  ->lookaside.sz =
4b30: 20 28 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20   (u16)sz;.  if( 
4b40: 70 53 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e  pStart ){.    in
4b50: 74 20 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69  t i;.    Lookasi
4b60: 64 65 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61  deSlot *p;.    a
4b70: 73 73 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74  ssert( sz > (int
4b80: 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64  )sizeof(Lookasid
4b90: 65 53 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70  eSlot*) );.    p
4ba0: 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f   = (LookasideSlo
4bb0: 74 2a 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66  t*)pStart;.    f
4bc0: 6f 72 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30  or(i=cnt-1; i>=0
4bd0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d  ; i--){.      p-
4be0: 3e 70 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f  >pNext = db->loo
4bf0: 6b 61 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20  kaside.pFree;.  
4c00: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4c10: 65 2e 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20  e.pFree = p;.   
4c20: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
4c30: 65 53 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29  eSlot*)&((u8*)p)
4c40: 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [sz];.    }.    
4c50: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
4c60: 6e 64 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e  nd = p;.    db->
4c70: 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c  lookaside.bEnabl
4c80: 65 64 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e  ed = 1;.    db->
4c90: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
4ca0: 63 65 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31  ced = pBuf==0 ?1
4cb0: 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  :0;.  }else{.   
4cc0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4cd0: 53 74 61 72 74 20 3d 20 64 62 3b 0a 20 20 20 20  Start = db;.    
4ce0: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45  db->lookaside.pE
4cf0: 6e 64 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d  nd = db;.    db-
4d00: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62  >lookaside.bEnab
4d10: 6c 65 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  led = 0;.    db-
4d20: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
4d30: 6f 63 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  oced = 0;.  }.  
4d40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
4d50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
4d60: 6e 20 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f  n the mutex asso
4d70: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 61  ciated with a da
4d80: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
4d90: 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75  n..*/.sqlite3_mu
4da0: 74 65 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f  tex *sqlite3_db_
4db0: 6d 75 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64  mutex(sqlite3 *d
4dc0: 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d  b){.  return db-
4dd0: 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >mutex;.}../*.**
4de0: 20 46 72 65 65 20 75 70 20 61 73 20 6d 75 63 68   Free up as much
4df0: 20 6d 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61   memory as we ca
4e00: 6e 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  n from the given
4e10: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e   database.** con
4e20: 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20  nection..*/.int 
4e30: 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61  sqlite3_db_relea
4e40: 73 65 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65  se_memory(sqlite
4e50: 33 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b  3 *db){.  int i;
4e60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4e70: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
4e80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65  );.  sqlite3Btre
4e90: 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20  eEnterAll(db);. 
4ea0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e   for(i=0; i<db->
4eb0: 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42  nDb; i++){.    B
4ec0: 74 72 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e  tree *pBt = db->
4ed0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
4ee0: 69 66 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20  if( pBt ){.     
4ef0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
4f00: 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67   sqlite3BtreePag
4f10: 65 72 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73  er(pBt);.      s
4f20: 71 6c 69 74 65 33 50 61 67 65 72 53 68 72 69 6e  qlite3PagerShrin
4f30: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
4f40: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
4f50: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
4f60: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
4f70: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
4f80: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
4f90: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
4fa0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65  Configuration se
4fb0: 74 74 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e  ttings for an in
4fc0: 64 69 76 69 64 75 61 6c 20 64 61 74 61 62 61 73  dividual databas
4fd0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a  e connection.*/.
4fe0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63  int sqlite3_db_c
4ff0: 6f 6e 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64  onfig(sqlite3 *d
5000: 62 2c 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  b, int op, ...){
5010: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
5020: 20 69 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74   int rc;.  va_st
5030: 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73  art(ap, op);.  s
5040: 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20  witch( op ){.   
5050: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43   case SQLITE_DBC
5060: 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a  ONFIG_LOOKASIDE:
5070: 20 7b 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70   {.      void *p
5080: 42 75 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  Buf = va_arg(ap,
5090: 20 76 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a   void*); /* IMP:
50a0: 20 52 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a   R-26835-10964 *
50b0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d  /.      int sz =
50c0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
50d0: 3b 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20  ;       /* IMP: 
50e0: 52 2d 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f  R-47871-25994 */
50f0: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
5100: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
5110: 3b 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52  ;      /* IMP: R
5120: 2d 30 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a  -04460-53386 */.
5130: 20 20 20 20 20 20 72 63 20 3d 20 73 65 74 75 70        rc = setup
5140: 4c 6f 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42  Lookaside(db, pB
5150: 75 66 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20  uf, sz, cnt);.  
5160: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5170: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
5180: 20 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e        static con
5190: 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20  st struct {.    
51a0: 20 20 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20      int op;     
51b0: 20 2f 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a   /* The opcode *
51c0: 2f 0a 20 20 20 20 20 20 20 20 75 33 32 20 6d 61  /.        u32 ma
51d0: 73 6b 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f  sk;    /* Mask o
51e0: 66 20 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c  f the bit in sql
51f0: 69 74 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65  ite3.flags to se
5200: 74 2f 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20  t/clear */.     
5210: 20 7d 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b   } aFlagOp[] = {
5220: 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54  .        { SQLIT
5230: 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c  E_DBCONFIG_ENABL
5240: 45 5f 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54  E_FKEY,    SQLIT
5250: 45 5f 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20  E_ForeignKeys   
5260: 20 7d 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51   },.        { SQ
5270: 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e  LITE_DBCONFIG_EN
5280: 41 42 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51  ABLE_TRIGGER, SQ
5290: 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67  LITE_EnableTrigg
52a0: 65 72 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a  er  },.      };.
52b0: 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
52c0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d  nt i;.      rc =
52d0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f   SQLITE_ERROR; /
52e0: 2a 20 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32  * IMP: R-42790-2
52f0: 33 33 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f  3372 */.      fo
5300: 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
5310: 7a 65 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b  ze(aFlagOp); i++
5320: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
5330: 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70  FlagOp[i].op==op
5340: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
5350: 74 20 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67  t onoff = va_arg
5360: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
5370: 20 20 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d       int *pRes =
5380: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a   va_arg(ap, int*
5390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
53a0: 20 6f 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e   oldFlags = db->
53b0: 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20  flags;.         
53c0: 20 69 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a   if( onoff>0 ){.
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e              db->
53e0: 66 6c 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70  flags |= aFlagOp
53f0: 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20  [i].mask;.      
5400: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e      }else if( on
5410: 6f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  off==0 ){.      
5420: 20 20 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20        db->flags 
5430: 26 3d 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d  &= ~aFlagOp[i].m
5440: 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ask;.          }
5450: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6f  .          if( o
5460: 6c 64 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61  ldFlags!=db->fla
5470: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  gs ){.          
5480: 20 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50    sqlite3ExpireP
5490: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
54a0: 73 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20  s(db);.         
54b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
54c0: 20 70 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20   pRes ){.       
54d0: 20 20 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62       *pRes = (db
54e0: 2d 3e 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f  ->flags & aFlagO
54f0: 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20  p[i].mask)!=0;. 
5500: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5510: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
5520: 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62  _OK;.          b
5530: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
5540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5550: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
5560: 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72   va_end(ap);.  r
5570: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
5580: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
5590: 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b  if the buffer z[
55a0: 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73  0..n-1] contains
55b0: 20 61 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a   all spaces..*/.
55c0: 73 74 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70  static int allSp
55d0: 61 63 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20  aces(const char 
55e0: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68  *z, int n){.  wh
55f0: 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
5600: 31 5d 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20  1]==' ' ){ n--; 
5610: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b  }.  return n==0;
5620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69  .}../*.** This i
5630: 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  s the default co
5640: 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e  llating function
5650: 20 6e 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20   named "BINARY" 
5660: 77 68 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a  which is always.
5670: 2a 2a 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a  ** available..**
5680: 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c  .** If the padFl
5690: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e  ag argument is n
56a0: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61  ot NULL then spa
56b0: 63 65 20 70 61 64 64 69 6e 67 20 61 74 20 74 68  ce padding at th
56c0: 65 20 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69  e end.** of stri
56d0: 6e 67 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20  ngs is ignored. 
56e0: 20 54 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73   This implements
56f0: 20 74 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61   the RTRIM colla
5700: 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tion..*/.static 
5710: 69 6e 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28  int binCollFunc(
5720: 0a 20 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67  .  void *padFlag
5730: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
5740: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
5750: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
5760: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
5770: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b  .){.  int rc, n;
5780: 0a 20 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65  .  n = nKey1<nKe
5790: 79 32 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65  y2 ? nKey1 : nKe
57a0: 79 32 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d  y2;.  rc = memcm
57b0: 70 28 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20  p(pKey1, pKey2, 
57c0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  n);.  if( rc==0 
57d0: 29 7b 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c  ){.    if( padFl
57e0: 61 67 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70  ag.     && allSp
57f0: 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65  aces(((char*)pKe
5800: 79 31 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a  y1)+n, nKey1-n).
5810: 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65       && allSpace
5820: 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29  s(((char*)pKey2)
5830: 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20  +n, nKey2-n).   
5840: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61   ){.      /* Lea
5850: 76 65 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20  ve rc unchanged 
5860: 61 74 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73  at 0 */.    }els
5870: 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b  e{.      rc = nK
5880: 65 79 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20  ey1 - nKey2;.   
5890: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
58a0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f  rc;.}../*.** Ano
58b0: 74 68 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f  ther built-in co
58c0: 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65  llating sequence
58d0: 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a  : NOCASE. .**.**
58e0: 20 54 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20   This collating 
58f0: 73 65 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65  sequence is inte
5900: 6e 64 65 64 20 74 6f 20 62 65 20 75 73 65 64 20  nded to be used 
5910: 66 6f 72 20 22 63 61 73 65 20 69 6e 64 65 70 65  for "case indepe
5920: 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69  ndent.** compari
5930: 73 6f 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b  son". SQLite's k
5940: 6e 6f 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65  nowledge of uppe
5950: 72 20 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65  r and lower case
5960: 20 65 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20   equivalents.** 
5970: 65 78 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20  extends only to 
5980: 74 68 65 20 32 36 20 63 68 61 72 61 63 74 65 72  the 26 character
5990: 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e  s used in the En
59a0: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a  glish language..
59b0: 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d  **.** At the mom
59c0: 65 6e 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c  ent there is onl
59d0: 79 20 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d  y a UTF-8 implem
59e0: 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  entation..*/.sta
59f0: 74 69 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f  tic int nocaseCo
5a00: 6c 6c 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76  llatingFunc(.  v
5a10: 6f 69 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20  oid *NotUsed,.  
5a20: 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74  int nKey1, const
5a30: 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20   void *pKey1,.  
5a40: 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74  int nKey2, const
5a50: 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a   void *pKey2.){.
5a60: 20 20 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65    int r = sqlite
5a70: 33 53 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20  3StrNICmp(.     
5a80: 20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70   (const char *)p
5a90: 4b 65 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61  Key1, (const cha
5aa0: 72 20 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79  r *)pKey2, (nKey
5ab0: 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e  1<nKey2)?nKey1:n
5ac0: 4b 65 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Key2);.  UNUSED_
5ad0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
5ae0: 64 29 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29  d);.  if( 0==r )
5af0: 7b 0a 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d  {.    r = nKey1-
5b00: 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74  nKey2;.  }.  ret
5b10: 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn r;.}../*.** 
5b20: 52 65 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44  Return the ROWID
5b30: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
5b40: 65 6e 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71  ent insert.*/.sq
5b50: 6c 69 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74  lite_int64 sqlit
5b60: 65 33 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72  e3_last_insert_r
5b70: 6f 77 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62  owid(sqlite3 *db
5b80: 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e  ){.  return db->
5b90: 6c 61 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a  lastRowid;.}../*
5ba0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5bb0: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
5bc0: 20 69 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63   in the most rec
5bd0: 65 6e 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ent call to sqli
5be0: 74 65 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69  te3_exec()..*/.i
5bf0: 6e 74 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67  nt sqlite3_chang
5c00: 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  es(sqlite3 *db){
5c10: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43  .  return db->nC
5c20: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5c30: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
5c40: 72 20 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e  r of changes sin
5c50: 63 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ce the database 
5c60: 68 61 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65  handle was opene
5c70: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
5c80: 33 5f 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28  3_total_changes(
5c90: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
5ca0: 72 65 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61  return db->nTota
5cb0: 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  lChange;.}../*.*
5cc0: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e  * Close all open
5cd0: 20 73 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69   savepoints. Thi
5ce0: 73 20 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20  s function only 
5cf0: 6d 61 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c  manipulates fiel
5d00: 64 73 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ds of the.** dat
5d10: 61 62 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a  abase handle obj
5d20: 65 63 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74  ect, it does not
5d30: 20 63 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70   close any savep
5d40: 6f 69 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62  oints that may b
5d50: 65 20 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65  e open.** at the
5d60: 20 62 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65   b-tree/pager le
5d70: 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  vel..*/.void sql
5d80: 69 74 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69  ite3CloseSavepoi
5d90: 6e 74 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  nts(sqlite3 *db)
5da0: 7b 0a 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70  {.  while( db->p
5db0: 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20  Savepoint ){.   
5dc0: 20 53 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70   Savepoint *pTmp
5dd0: 20 3d 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e   = db->pSavepoin
5de0: 74 3b 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65  t;.    db->pSave
5df0: 70 6f 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e  point = pTmp->pN
5e00: 65 78 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ext;.    sqlite3
5e10: 44 62 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29  DbFree(db, pTmp)
5e20: 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76  ;.  }.  db->nSav
5e30: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62  epoint = 0;.  db
5e40: 2d 3e 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30  ->nStatement = 0
5e50: 3b 0a 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61  ;.  db->isTransa
5e60: 63 74 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ctionSavepoint =
5e70: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76   0;.}../*.** Inv
5e80: 6f 6b 65 20 74 68 65 20 64 65 73 74 72 75 63 74  oke the destruct
5e90: 6f 72 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f  or function asso
5ea0: 63 69 61 74 65 64 20 77 69 74 68 20 46 75 6e 63  ciated with Func
5eb0: 44 65 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45  Def p, if any. E
5ec0: 78 63 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69  xcept,.** if thi
5ed0: 73 20 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73  s is not the las
5ee0: 74 20 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75  t copy of the fu
5ef0: 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69  nction, do not i
5f00: 6e 76 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70  nvoke it. Multip
5f10: 6c 65 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20  le.** copies of 
5f20: 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f  a single functio
5f30: 6e 20 61 72 65 20 63 72 65 61 74 65 64 20 77 68  n are created wh
5f40: 65 6e 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69  en create_functi
5f50: 6f 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a  on() is called.*
5f60: 2a 20 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e  * with SQLITE_AN
5f70: 59 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  Y as the encodin
5f80: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
5f90: 64 20 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f  d functionDestro
5fa0: 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46  y(sqlite3 *db, F
5fb0: 75 6e 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75  uncDef *p){.  Fu
5fc0: 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44  ncDestructor *pD
5fd0: 65 73 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70  estructor = p->p
5fe0: 44 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66  Destructor;.  if
5ff0: 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ( pDestructor ){
6000: 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72  .    pDestructor
6010: 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66  ->nRef--;.    if
6020: 28 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e  ( pDestructor->n
6030: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Ref==0 ){.      
6040: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65  pDestructor->xDe
6050: 73 74 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f  stroy(pDestructo
6060: 72 2d 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20  r->pUserData);. 
6070: 20 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72       sqlite3DbFr
6080: 65 65 28 64 62 2c 20 70 44 65 73 74 72 75 63 74  ee(db, pDestruct
6090: 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  or);.    }.  }.}
60a0: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65  ../*.** Disconne
60b0: 63 74 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76  ct all sqlite3_v
60c0: 74 61 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74  tab objects that
60d0: 20 62 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62   belong to datab
60e0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a  ase connection.*
60f0: 2a 20 64 62 2e 20 54 68 69 73 20 69 73 20 63 61  * db. This is ca
6100: 6c 6c 65 64 20 77 68 65 6e 20 64 62 20 69 73 20  lled when db is 
6110: 62 65 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f  being closed..*/
6120: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
6130: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73  connectAllVtab(s
6140: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66  qlite3 *db){.#if
6150: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
6160: 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
6170: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
6180: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
6190: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
61a0: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
61b0: 20 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65     Schema *pSche
61c0: 6d 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  ma = db->aDb[i].
61d0: 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28  pSchema;.    if(
61e0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68   db->aDb[i].pSch
61f0: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73  ema ){.      Has
6200: 68 45 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20  hElem *p;.      
6210: 66 6f 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68  for(p=sqliteHash
6220: 46 69 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e  First(&pSchema->
6230: 74 62 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73  tblHash); p; p=s
6240: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 70 29  qliteHashNext(p)
6250: 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  ){.        Table
6260: 20 2a 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20   *pTab = (Table 
6270: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
6280: 28 70 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (p);.        if(
6290: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
62a0: 20 29 20 73 71 6c 69 74 65 33 56 74 61 62 44 69   ) sqlite3VtabDi
62b0: 73 63 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61  sconnect(db, pTa
62c0: 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  b);.      }.    
62d0: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  }.  }.  sqlite3B
62e0: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
62f0: 3b 0a 23 65 6c 73 65 0a 20 20 55 4e 55 53 45 44  ;.#else.  UNUSED
6300: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
6310: 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
6320: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 64  Return TRUE if d
6330: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6340: 6f 6e 20 64 62 20 68 61 73 20 75 6e 66 69 6e 61  on db has unfina
6350: 6c 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a  lized prepared.*
6360: 2a 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20  * statements or 
6370: 75 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74  unfinished sqlit
6380: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
6390: 73 2e 20 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  s.  .*/.static i
63a0: 6e 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  nt connectionIsB
63b0: 75 73 79 28 73 71 6c 69 74 65 33 20 2a 64 62 29  usy(sqlite3 *db)
63c0: 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20 20 61 73 73  {.  int j;.  ass
63d0: 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74  ert( sqlite3_mut
63e0: 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65  ex_held(db->mute
63f0: 78 29 20 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e  x) );.  if( db->
6400: 70 56 64 62 65 20 29 20 72 65 74 75 72 6e 20 31  pVdbe ) return 1
6410: 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 64  ;.  for(j=0; j<d
6420: 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a 20 20  b->nDb; j++){.  
6430: 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20 64    Btree *pBt = d
6440: 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42 74 3b 0a 20  b->aDb[j].pBt;. 
6450: 20 20 20 69 66 28 20 70 42 74 20 26 26 20 73 71     if( pBt && sq
6460: 6c 69 74 65 33 42 74 72 65 65 49 73 49 6e 42 61  lite3BtreeIsInBa
6470: 63 6b 75 70 28 70 42 74 29 20 29 20 72 65 74 75  ckup(pBt) ) retu
6480: 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
6490: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
64a0: 6c 6f 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  lose an existing
64b0: 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65   SQLite database
64c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
64d0: 71 6c 69 74 65 33 43 6c 6f 73 65 28 73 71 6c 69  qlite3Close(sqli
64e0: 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 66 6f 72  te3 *db, int for
64f0: 63 65 5a 6f 6d 62 69 65 29 7b 0a 20 20 69 66 28  ceZombie){.  if(
6500: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
6510: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
6520: 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  }.  if( !sqlite3
6530: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
6540: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
6550: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
6560: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
6570: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
6580: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
6590: 0a 20 20 2f 2a 20 46 6f 72 63 65 20 78 44 69 73  .  /* Force xDis
65a0: 63 6f 6e 6e 65 63 74 20 63 61 6c 6c 73 20 6f 6e  connect calls on
65b0: 20 61 6c 6c 20 76 69 72 74 75 61 6c 20 74 61 62   all virtual tab
65c0: 6c 65 73 20 2a 2f 0a 20 20 64 69 73 63 6f 6e 6e  les */.  disconn
65d0: 65 63 74 41 6c 6c 56 74 61 62 28 64 62 29 3b 0a  ectAllVtab(db);.
65e0: 0a 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73  .  /* If a trans
65f0: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20  action is open, 
6600: 74 68 65 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c  the disconnectAl
6610: 6c 56 74 61 62 28 29 20 63 61 6c 6c 20 61 62 6f  lVtab() call abo
6620: 76 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ve.  ** will not
6630: 20 68 61 76 65 20 63 61 6c 6c 65 64 20 74 68 65   have called the
6640: 20 78 44 69 73 63 6f 6e 6e 65 63 74 28 29 20 6d   xDisconnect() m
6650: 65 74 68 6f 64 20 6f 6e 20 61 6e 79 20 76 69 72  ethod on any vir
6660: 74 75 61 6c 0a 20 20 2a 2a 20 74 61 62 6c 65 73  tual.  ** tables
6670: 20 69 6e 20 74 68 65 20 64 62 2d 3e 61 56 54 72   in the db->aVTr
6680: 61 6e 73 5b 5d 20 61 72 72 61 79 2e 20 54 68 65  ans[] array. The
6690: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c 69 74   following sqlit
66a0: 65 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 29  e3VtabRollback()
66b0: 0a 20 20 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20  .  ** call will 
66c0: 64 6f 20 73 6f 2e 20 57 65 20 6e 65 65 64 20 74  do so. We need t
66d0: 6f 20 64 6f 20 74 68 69 73 20 62 65 66 6f 72 65  o do this before
66e0: 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 61   the check for a
66f0: 63 74 69 76 65 0a 20 20 2a 2a 20 53 51 4c 20 73  ctive.  ** SQL s
6700: 74 61 74 65 6d 65 6e 74 73 20 62 65 6c 6f 77 2c  tatements below,
6710: 20 61 73 20 74 68 65 20 76 2d 74 61 62 6c 65 20   as the v-table 
6720: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6d  implementation m
6730: 61 79 20 62 65 20 73 74 6f 72 69 6e 67 0a 20 20  ay be storing.  
6740: 2a 2a 20 73 6f 6d 65 20 70 72 65 70 61 72 65 64  ** some prepared
6750: 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 74 65   statements inte
6760: 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 73  rnally..  */.  s
6770: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
6780: 63 6b 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 65  ck(db);..  /* Le
6790: 67 61 63 79 20 62 65 68 61 76 69 6f 72 20 28 73  gacy behavior (s
67a0: 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 62  qlite3_close() b
67b0: 65 68 61 76 69 6f 72 29 20 69 73 20 74 6f 20 72  ehavior) is to r
67c0: 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54  eturn.  ** SQLIT
67d0: 45 5f 42 55 53 59 20 69 66 20 74 68 65 20 63 6f  E_BUSY if the co
67e0: 6e 6e 65 63 74 69 6f 6e 20 63 61 6e 20 6e 6f 74  nnection can not
67f0: 20 62 65 20 63 6c 6f 73 65 64 20 69 6d 6d 65 64   be closed immed
6800: 69 61 74 65 6c 79 2e 0a 20 20 2a 2f 0a 20 20 69  iately..  */.  i
6810: 66 28 20 21 66 6f 72 63 65 5a 6f 6d 62 69 65 20  f( !forceZombie 
6820: 26 26 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  && connectionIsB
6830: 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73  usy(db) ){.    s
6840: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
6850: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e  SQLITE_BUSY, "un
6860: 61 62 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75  able to close du
6870: 65 20 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64  e to unfinalized
6880: 20 22 0a 20 20 20 20 20 20 20 22 73 74 61 74 65   ".       "state
6890: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
68a0: 68 65 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20  hed backups");. 
68b0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
68c0: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
68d0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
68e0: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a  LITE_BUSY;.  }..
68f0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6900: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66  ABLE_SQLLOG.  if
6910: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
6920: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b  onfig.xSqllog ){
6930: 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20  .    /* Closing 
6940: 74 68 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72  the handle. Four
6950: 74 68 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  th parameter is 
6960: 70 61 73 73 65 64 20 74 68 65 20 76 61 6c 75 65  passed the value
6970: 20 32 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74   2. */.    sqlit
6980: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78  e3GlobalConfig.x
6990: 53 71 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c  Sqllog(sqlite3Gl
69a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c  obalConfig.pSqll
69b0: 6f 67 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29  ogArg, db, 0, 2)
69c0: 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
69d0: 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63  /* Convert the c
69e0: 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61  onnection into a
69f0: 20 7a 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e   zombie and then
6a00: 20 63 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a   close it..  */.
6a10: 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
6a20: 4c 49 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49  LITE_MAGIC_ZOMBI
6a30: 45 3b 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76  E;.  sqlite3Leav
6a40: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
6a50: 6d 62 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75  mbie(db);.  retu
6a60: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
6a70: 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61  ./*.** Two varia
6a80: 74 69 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62  tions on the pub
6a90: 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f  lic interface fo
6aa0: 72 20 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61  r closing a data
6ab0: 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69  base.** connecti
6ac0: 6f 6e 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f  on. The sqlite3_
6ad0: 63 6c 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20  close() version 
6ae0: 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42  returns SQLITE_B
6af0: 55 53 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65  USY and.** leave
6b00: 73 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  s the connection
6b10: 20 6f 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65   option if there
6b20: 20 61 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64   are unfinalized
6b30: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
6b40: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
6b50: 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61  ished sqlite3_ba
6b60: 63 6b 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69  ckups.  The sqli
6b70: 74 65 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a  te3_close_v2().*
6b80: 2a 20 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73  * version forces
6b90: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
6ba0: 74 6f 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62  to become a zomb
6bb0: 69 65 20 69 66 20 74 68 65 72 65 20 61 72 65 0a  ie if there are.
6bc0: 2a 2a 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f  ** unclosed reso
6bd0: 75 72 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e  urces, and arran
6be0: 67 65 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61  ges for dealloca
6bf0: 74 69 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61  tion when the la
6c00: 73 74 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74  st.** prepare st
6c10: 61 74 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74  atement or sqlit
6c20: 65 33 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73  e3_backup closes
6c30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6c40: 5f 63 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  _close(sqlite3 *
6c50: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
6c60: 74 65 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20  te3Close(db,0); 
6c70: 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c  }.int sqlite3_cl
6c80: 6f 73 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a  ose_v2(sqlite3 *
6c90: 64 62 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69  db){ return sqli
6ca0: 74 65 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20  te3Close(db,1); 
6cb0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  }.../*.** Close 
6cc0: 74 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74  the mutex on dat
6cd0: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6ce0: 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68   db..**.** Furth
6cf0: 65 72 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62  ermore, if datab
6d00: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
6d10: 62 20 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d  b is a zombie (m
6d20: 65 61 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72  eaning that ther
6d30: 65 0a 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20  e.** has been a 
6d40: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71  prior call to sq
6d50: 6c 69 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20  lite3_close(db) 
6d60: 6f 72 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  or sqlite3_close
6d70: 5f 76 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20  _v2(db)) and.** 
6d80: 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74  every sqlite3_st
6d90: 6d 74 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20  mt has now been 
6da0: 66 69 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76  finalized and ev
6db0: 65 72 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  ery sqlite3_back
6dc0: 75 70 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68  up has.** finish
6dd0: 65 64 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c  ed, then free al
6de0: 6c 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a  l resources..*/.
6df0: 76 6f 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76  void sqlite3Leav
6e00: 65 4d 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f  eMutexAndCloseZo
6e10: 6d 62 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62  mbie(sqlite3 *db
6e20: 29 7b 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69  ){.  HashElem *i
6e30: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
6e40: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
6e50: 6c 65 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20  le iterator */. 
6e60: 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66   int j;..  /* If
6e70: 20 74 68 65 72 65 20 61 72 65 20 6f 75 74 73 74   there are outst
6e80: 61 6e 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73  anding sqlite3_s
6e90: 74 6d 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62  tmt or sqlite3_b
6ea0: 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20  ackup objects.  
6eb0: 2a 2a 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e  ** or if the con
6ec0: 6e 65 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20  nection has not 
6ed0: 79 65 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20  yet been closed 
6ee0: 62 79 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  by sqlite3_close
6ef0: 5f 76 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e  _v2(),.  ** then
6f00: 20 6a 75 73 74 20 6c 65 61 76 65 20 74 68 65 20   just leave the 
6f10: 6d 75 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e  mutex and return
6f20: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ..  */.  if( db-
6f30: 3e 6d 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d  >magic!=SQLITE_M
6f40: 41 47 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63  AGIC_ZOMBIE || c
6f50: 6f 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28  onnectionIsBusy(
6f60: 64 62 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  db) ){.    sqlit
6f70: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
6f80: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72  b->mutex);.    r
6f90: 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  eturn;.  }..  /*
6fa0: 20 49 66 20 77 65 20 72 65 61 63 68 20 74 68 69   If we reach thi
6fb0: 73 20 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e  s point, it mean
6fc0: 73 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62  s that the datab
6fd0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68  ase connection h
6fe0: 61 73 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61  as.  ** closed a
6ff0: 6c 6c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  ll sqlite3_stmt 
7000: 61 6e 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  and sqlite3_back
7010: 75 70 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68  up objects and h
7020: 61 73 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73  as been.  ** pas
7030: 73 65 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63  sed to sqlite3_c
7040: 6c 6f 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68  lose (meaning th
7050: 61 74 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69  at it is a zombi
7060: 65 29 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a  e).  Therefore,.
7070: 20 20 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e    ** go ahead an
7080: 64 20 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75  d free all resou
7090: 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a  rces..  */..  /*
70a0: 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   If a transactio
70b0: 6e 20 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20  n is open, roll 
70c0: 69 74 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c  it back. This al
70d0: 73 6f 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  so ensures that 
70e0: 69 66 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61  if.  ** any data
70f0: 62 61 73 65 20 73 63 68 65 6d 61 73 20 68 61 76  base schemas hav
7100: 65 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  e been modified 
7110: 62 79 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65  by an uncommitte
7120: 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  d transaction.  
7130: 2a 2a 20 74 68 65 79 20 61 72 65 20 72 65 73 65  ** they are rese
7140: 74 2e 20 41 6e 64 20 74 68 61 74 20 74 68 65 20  t. And that the 
7150: 72 65 71 75 69 72 65 64 20 62 2d 74 72 65 65 20  required b-tree 
7160: 6d 75 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f  mutex is held to
7170: 20 6d 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70   make.  ** the p
7180: 61 67 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ager rollback an
7190: 64 20 73 63 68 65 6d 61 20 72 65 73 65 74 20 61  d schema reset a
71a0: 6e 20 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69  n atomic operati
71b0: 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  on. */.  sqlite3
71c0: 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20  RollbackAll(db, 
71d0: 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f  SQLITE_OK);..  /
71e0: 2a 20 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74  * Free any outst
71f0: 61 6e 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74  anding Savepoint
7200: 20 73 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a   structures. */.
7210: 20 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61    sqlite3CloseSa
7220: 76 65 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20  vepoints(db);.. 
7230: 20 2f 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61   /* Close all da
7240: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
7250: 6e 73 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b  ns */.  for(j=0;
7260: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
7270: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 44 62 20  {.    struct Db 
7280: 2a 70 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b  *pDb = &db->aDb[
7290: 6a 5d 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d  j];.    if( pDb-
72a0: 3e 70 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71  >pBt ){.      sq
72b0: 6c 69 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28  lite3BtreeClose(
72c0: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20  pDb->pBt);.     
72d0: 20 70 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20   pDb->pBt = 0;. 
72e0: 20 20 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b       if( j!=1 ){
72f0: 0a 20 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53  .        pDb->pS
7300: 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
7310: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f   }.    }.  }.  /
7320: 2a 20 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50  * Clear the TEMP
7330: 20 73 63 68 65 6d 61 20 73 65 70 61 72 61 74 65   schema separate
7340: 6c 79 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20  ly and last */. 
7350: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e   if( db->aDb[1].
7360: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73  pSchema ){.    s
7370: 71 6c 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61  qlite3SchemaClea
7380: 72 28 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63  r(db->aDb[1].pSc
7390: 68 65 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  hema);.  }.  sql
73a0: 69 74 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69  ite3VtabUnlockLi
73b0: 73 74 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72  st(db);..  /* Fr
73c0: 65 65 20 75 70 20 74 68 65 20 61 72 72 61 79 20  ee up the array 
73d0: 6f 66 20 61 75 78 69 6c 69 61 72 79 20 64 61 74  of auxiliary dat
73e0: 61 62 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69  abases */.  sqli
73f0: 74 65 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62  te3CollapseDatab
7400: 61 73 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20  aseArray(db);.  
7410: 61 73 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c  assert( db->nDb<
7420: 3d 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =2 );.  assert( 
7430: 64 62 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62  db->aDb==db->aDb
7440: 53 74 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20  Static );..  /* 
7450: 54 65 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e  Tell the code in
7460: 20 6e 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74   notify.c that t
7470: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f  he connection no
7480: 20 6c 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e   longer holds an
7490: 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64  y.  ** locks and
74a0: 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
74b0: 65 20 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e  e any further un
74c0: 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c  lock-notify call
74d0: 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71  backs..  */.  sq
74e0: 6c 69 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43  lite3ConnectionC
74f0: 6c 6f 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f  losed(db);..  fo
7500: 72 28 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69  r(j=0; j<ArraySi
7510: 7a 65 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b  ze(db->aFunc.a);
7520: 20 6a 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44   j++){.    FuncD
7530: 65 66 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73  ef *pNext, *pHas
7540: 68 2c 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  h, *p;.    for(p
7550: 3d 64 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b  =db->aFunc.a[j];
7560: 20 70 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20   p; p=pHash){.  
7570: 20 20 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70      pHash = p->p
7580: 48 61 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c  Hash;.      whil
7590: 65 28 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20  e( p ){.        
75a0: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
75b0: 64 62 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20  db, p);.        
75c0: 70 4e 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74  pNext = p->pNext
75d0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
75e0: 33 44 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a  3DbFree(db, p);.
75f0: 20 20 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78          p = pNex
7600: 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
7610: 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c  .  }.  for(i=sql
7620: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
7630: 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20  ->aCollSeq); i; 
7640: 69 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74  i=sqliteHashNext
7650: 28 69 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65  (i)){.    CollSe
7660: 71 20 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c  q *pColl = (Coll
7670: 53 65 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68  Seq *)sqliteHash
7680: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20  Data(i);.    /* 
7690: 49 6e 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72  Invoke any destr
76a0: 75 63 74 6f 72 73 20 72 65 67 69 73 74 65 72 65  uctors registere
76b0: 64 20 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20  d for collation 
76c0: 73 65 71 75 65 6e 63 65 20 75 73 65 72 20 64 61  sequence user da
76d0: 74 61 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a  ta. */.    for(j
76e0: 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
76f0: 20 20 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a       if( pColl[j
7700: 5d 2e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ].xDel ){.      
7710: 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28    pColl[j].xDel(
7720: 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b  pColl[j].pUser);
7730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7740: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
7750: 28 64 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d  (db, pColl);.  }
7760: 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c  .  sqlite3HashCl
7770: 65 61 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65  ear(&db->aCollSe
7780: 71 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  q);.#ifndef SQLI
7790: 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
77a0: 41 42 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c  ABLE.  for(i=sql
77b0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 64 62  iteHashFirst(&db
77c0: 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69  ->aModule); i; i
77d0: 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28  =sqliteHashNext(
77e0: 69 29 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20  i)){.    Module 
77f0: 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20  *pMod = (Module 
7800: 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61 74 61  *)sqliteHashData
7810: 28 69 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f  (i);.    if( pMo
7820: 64 2d 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20  d->xDestroy ){. 
7830: 20 20 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74       pMod->xDest
7840: 72 6f 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b  roy(pMod->pAux);
7850: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
7860: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f  e3DbFree(db, pMo
7870: 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
7880: 33 48 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e  3HashClear(&db->
7890: 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
78a0: 0a 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72  ..  sqlite3Error
78b0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20  (db, SQLITE_OK, 
78c0: 30 29 3b 20 2f 2a 20 44 65 61 6c 6c 6f 63 61 74  0); /* Deallocat
78d0: 65 73 20 61 6e 79 20 63 61 63 68 65 64 20 65 72  es any cached er
78e0: 72 6f 72 20 73 74 72 69 6e 67 73 2e 20 2a 2f 0a  ror strings. */.
78f0: 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72    sqlite3ValueFr
7900: 65 65 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  ee(db->pErr);.  
7910: 73 71 6c 69 74 65 33 43 6c 6f 73 65 45 78 74 65  sqlite3CloseExte
7920: 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 64  nsions(db);..  d
7930: 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54  b->magic = SQLIT
7940: 45 5f 4d 41 47 49 43 5f 45 52 52 4f 52 3b 0a 0a  E_MAGIC_ERROR;..
7950: 20 20 2f 2a 20 54 68 65 20 74 65 6d 70 2d 64 61    /* The temp-da
7960: 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 69 73  tabase schema is
7970: 20 61 6c 6c 6f 63 61 74 65 64 20 64 69 66 66 65   allocated diffe
7980: 72 65 6e 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rently from the 
7990: 6f 74 68 65 72 20 73 63 68 65 6d 61 0a 20 20 2a  other schema.  *
79a0: 2a 20 6f 62 6a 65 63 74 73 20 28 75 73 69 6e 67  * objects (using
79b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
79c0: 64 69 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61  directly, instea
79d0: 64 20 6f 66 20 73 71 6c 69 74 65 33 42 74 72 65  d of sqlite3Btre
79e0: 65 53 63 68 65 6d 61 28 29 29 2e 0a 20 20 2a 2a  eSchema())..  **
79f0: 20 53 6f 20 69 74 20 6e 65 65 64 73 20 74 6f 20   So it needs to 
7a00: 62 65 20 66 72 65 65 64 20 68 65 72 65 2e 20 54  be freed here. T
7a10: 6f 64 6f 3a 20 57 68 79 20 6e 6f 74 20 72 6f 6c  odo: Why not rol
7a20: 6c 20 74 68 65 20 74 65 6d 70 20 73 63 68 65 6d  l the temp schem
7a30: 61 20 69 6e 74 6f 0a 20 20 2a 2a 20 74 68 65 20  a into.  ** the 
7a40: 73 61 6d 65 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  same sqliteMallo
7a50: 63 28 29 20 61 73 20 74 68 65 20 6f 6e 65 20 74  c() as the one t
7a60: 68 61 74 20 61 6c 6c 6f 63 61 74 65 73 20 74 68  hat allocates th
7a70: 65 20 64 61 74 61 62 61 73 65 20 0a 20 20 2a 2a  e database .  **
7a80: 20 73 74 72 75 63 74 75 72 65 3f 0a 20 20 2a 2f   structure?.  */
7a90: 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
7aa0: 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 31 5d 2e  (db, db->aDb[1].
7ab0: 70 53 63 68 65 6d 61 29 3b 0a 20 20 73 71 6c 69  pSchema);.  sqli
7ac0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7ad0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
7ae0: 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45  ->magic = SQLITE
7af0: 5f 4d 41 47 49 43 5f 43 4c 4f 53 45 44 3b 0a 20  _MAGIC_CLOSED;. 
7b00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 66   sqlite3_mutex_f
7b10: 72 65 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ree(db->mutex);.
7b20: 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6c 6f    assert( db->lo
7b30: 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 3d 3d 30 20  okaside.nOut==0 
7b40: 29 3b 20 20 2f 2a 20 46 61 69 6c 73 20 6f 6e 20  );  /* Fails on 
7b50: 61 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  a lookaside memo
7b60: 72 79 20 6c 65 61 6b 20 2a 2f 0a 20 20 69 66 28  ry leak */.  if(
7b70: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
7b80: 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20 20 20  Malloced ){.    
7b90: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 2d  sqlite3_free(db-
7ba0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74 61 72  >lookaside.pStar
7bb0: 74 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  t);.  }.  sqlite
7bc0: 33 5f 66 72 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f  3_free(db);.}../
7bd0: 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
7be0: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73  l database files
7bf0: 2e 20 20 49 66 20 74 72 69 70 43 6f 64 65 20 69  .  If tripCode i
7c00: 73 20 6e 6f 74 20 53 51 4c 49 54 45 5f 4f 4b 2c  s not SQLITE_OK,
7c10: 20 74 68 65 6e 0a 2a 2a 20 61 6e 79 20 6f 70 65   then.** any ope
7c20: 6e 20 63 75 72 73 6f 72 73 20 61 72 65 20 69 6e  n cursors are in
7c30: 76 61 6c 69 64 61 74 65 64 20 28 22 74 72 69 70  validated ("trip
7c40: 70 65 64 22 20 2d 20 61 73 20 69 6e 20 22 74 72  ped" - as in "tr
7c50: 69 70 70 69 6e 67 20 61 20 63 69 72 63 75 69 74  ipping a circuit
7c60: 0a 2a 2a 20 62 72 65 61 6b 65 72 22 29 20 61 6e  .** breaker") an
7c70: 64 20 6d 61 64 65 20 74 6f 20 72 65 74 75 72 6e  d made to return
7c80: 20 74 72 69 70 43 6f 64 65 20 69 66 20 74 68 65   tripCode if the
7c90: 72 65 20 61 72 65 20 61 6e 79 20 66 75 72 74 68  re are any furth
7ca0: 65 72 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  er.** attempts t
7cb0: 6f 20 75 73 65 20 74 68 61 74 20 63 75 72 73 6f  o use that curso
7cc0: 72 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  r..*/.void sqlit
7cd0: 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28 73 71  e3RollbackAll(sq
7ce0: 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 74  lite3 *db, int t
7cf0: 72 69 70 43 6f 64 65 29 7b 0a 20 20 69 6e 74 20  ripCode){.  int 
7d00: 69 3b 0a 20 20 69 6e 74 20 69 6e 54 72 61 6e 73  i;.  int inTrans
7d10: 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
7d20: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
7d30: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
7d40: 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42  .  sqlite3BeginB
7d50: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
7d60: 20 20 2f 2a 20 4f 62 74 61 69 6e 20 61 6c 6c 20    /* Obtain all 
7d70: 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73 20 62  b-tree mutexes b
7d80: 65 66 6f 72 65 20 6d 61 6b 69 6e 67 20 61 6e 79  efore making any
7d90: 20 63 61 6c 6c 73 20 74 6f 20 42 74 72 65 65 52   calls to BtreeR
7da0: 6f 6c 6c 62 61 63 6b 28 29 2e 20 0a 20 20 2a 2a  ollback(). .  **
7db0: 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61   This is importa
7dc0: 6e 74 20 69 6e 20 63 61 73 65 20 74 68 65 20 74  nt in case the t
7dd0: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 69 6e 67  ransaction being
7de0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 68 61 73   rolled back has
7df0: 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 65 64 20 74  .  ** modified t
7e00: 68 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65  he database sche
7e10: 6d 61 2e 20 49 66 20 74 68 65 20 62 2d 74 72 65  ma. If the b-tre
7e20: 65 20 6d 75 74 65 78 65 73 20 61 72 65 20 6e 6f  e mutexes are no
7e30: 74 20 74 61 6b 65 6e 0a 20 20 2a 2a 20 68 65 72  t taken.  ** her
7e40: 65 2c 20 74 68 65 6e 20 61 6e 6f 74 68 65 72 20  e, then another 
7e50: 73 68 61 72 65 64 2d 63 61 63 68 65 20 63 6f 6e  shared-cache con
7e60: 6e 65 63 74 69 6f 6e 20 6d 69 67 68 74 20 73 6e  nection might sn
7e70: 65 61 6b 20 69 6e 20 62 65 74 77 65 65 6e 0a 20  eak in between. 
7e80: 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
7e90: 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 73 63   rollback and sc
7ea0: 68 65 6d 61 20 72 65 73 65 74 2c 20 77 68 69 63  hema reset, whic
7eb0: 68 20 63 61 6e 20 63 61 75 73 65 20 66 61 6c 73  h can cause fals
7ec0: 65 0a 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f  e.  ** corruptio
7ed0: 6e 20 72 65 70 6f 72 74 73 20 69 6e 20 73 6f 6d  n reports in som
7ee0: 65 20 63 61 73 65 73 2e 20 20 2a 2f 0a 20 20 73  e cases.  */.  s
7ef0: 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
7f00: 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28  All(db);..  for(
7f10: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
7f20: 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72 65 65 20  i++){.    Btree 
7f30: 2a 70 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e  *p = db->aDb[i].
7f40: 70 42 74 3b 0a 20 20 20 20 69 66 28 20 70 20 29  pBt;.    if( p )
7f50: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
7f60: 74 65 33 42 74 72 65 65 49 73 49 6e 54 72 61 6e  te3BtreeIsInTran
7f70: 73 28 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  s(p) ){.        
7f80: 69 6e 54 72 61 6e 73 20 3d 20 31 3b 0a 20 20 20  inTrans = 1;.   
7f90: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
7fa0: 65 33 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28  e3BtreeRollback(
7fb0: 70 2c 20 74 72 69 70 43 6f 64 65 29 3b 0a 20 20  p, tripCode);.  
7fc0: 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
7fd0: 33 56 74 61 62 52 6f 6c 6c 62 61 63 6b 28 64 62  3VtabRollback(db
7fe0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 6e 64 42  );.  sqlite3EndB
7ff0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a  enignMalloc();..
8000: 20 20 69 66 28 20 28 64 62 2d 3e 66 6c 61 67 73    if( (db->flags
8010: 26 53 51 4c 49 54 45 5f 49 6e 74 65 72 6e 43 68  &SQLITE_InternCh
8020: 61 6e 67 65 73 29 21 3d 30 20 26 26 20 64 62 2d  anges)!=0 && db-
8030: 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30 20 29 7b  >init.busy==0 ){
8040: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 69  .    sqlite3Expi
8050: 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65 6d  rePreparedStatem
8060: 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 73 71  ents(db);.    sq
8070: 6c 69 74 65 33 52 65 73 65 74 41 6c 6c 53 63 68  lite3ResetAllSch
8080: 65 6d 61 73 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e  emasOfConnection
8090: 28 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  (db);.  }.  sqli
80a0: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
80b0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20  (db);..  /* Any 
80c0: 64 65 66 65 72 72 65 64 20 63 6f 6e 73 74 72 61  deferred constra
80d0: 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 73 20 68  int violations h
80e0: 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 72 65 73  ave now been res
80f0: 6f 6c 76 65 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e  olved. */.  db->
8100: 6e 44 65 66 65 72 72 65 64 43 6f 6e 73 20 3d 20  nDeferredCons = 
8110: 30 3b 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72  0;.  db->nDeferr
8120: 65 64 49 6d 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20  edImmCons = 0;. 
8130: 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 53   db->flags &= ~S
8140: 51 4c 49 54 45 5f 44 65 66 65 72 46 4b 73 3b 0a  QLITE_DeferFKs;.
8150: 0a 20 20 2f 2a 20 49 66 20 6f 6e 65 20 68 61 73  .  /* If one has
8160: 20 62 65 65 6e 20 63 6f 6e 66 69 67 75 72 65 64   been configured
8170: 2c 20 69 6e 76 6f 6b 65 20 74 68 65 20 72 6f 6c  , invoke the rol
8180: 6c 62 61 63 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62  lback-hook callb
8190: 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  ack */.  if( db-
81a0: 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61  >xRollbackCallba
81b0: 63 6b 20 26 26 20 28 69 6e 54 72 61 6e 73 20 7c  ck && (inTrans |
81c0: 7c 20 21 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  | !db->autoCommi
81d0: 74 29 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 52  t) ){.    db->xR
81e0: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 28  ollbackCallback(
81f0: 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67  db->pRollbackArg
8200: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8210: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
8220: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
8230: 67 20 74 68 65 20 6e 61 6d 65 20 63 6f 72 72 65  g the name corre
8240: 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20  sponding to the 
8250: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 73 70  error code.** sp
8260: 65 63 69 66 69 65 64 20 69 6e 20 74 68 65 20 61  ecified in the a
8270: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20  rgument..*/.#if 
8280: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
8290: 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
82a0: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 7c 7c  (SQLITE_TEST) ||
82b0: 20 5c 0a 20 20 20 20 64 65 66 69 6e 65 64 28 53   \.    defined(S
82c0: 51 4c 49 54 45 5f 44 45 42 55 47 5f 4f 53 5f 54  QLITE_DEBUG_OS_T
82d0: 52 41 43 45 29 0a 63 6f 6e 73 74 20 63 68 61 72  RACE).const char
82e0: 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61 6d 65   *sqlite3ErrName
82f0: 28 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f 6e 73  (int rc){.  cons
8300: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
8310: 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72 69 67  0;.  int i, orig
8320: 52 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72 28 69  Rc = rc;.  for(i
8330: 3d 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61 6d 65  =0; i<2 && zName
8340: 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26 3d 20  ==0; i++, rc &= 
8350: 30 78 66 66 29 7b 0a 20 20 20 20 73 77 69 74 63  0xff){.    switc
8360: 68 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 63  h( rc ){.      c
8370: 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a 20 20  ase SQLITE_OK:  
8380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
8390: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4f  Name = "SQLITE_O
83a0: 4b 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  K";             
83b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
83c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52 52 4f  case SQLITE_ERRO
83d0: 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  R:              
83e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
83f0: 45 52 52 4f 52 22 3b 20 20 20 20 20 20 20 20 20  ERROR";         
8400: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8410: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54   case SQLITE_INT
8420: 45 52 4e 41 4c 3a 20 20 20 20 20 20 20 20 20 20  ERNAL:          
8430: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8440: 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20 20 20  _INTERNAL";     
8450: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8460: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 45    case SQLITE_PE
8470: 52 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RM:             
8480: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8490: 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20 20 20  E_PERM";        
84a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
84b0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41     case SQLITE_A
84c0: 42 4f 52 54 3a 20 20 20 20 20 20 20 20 20 20 20  BORT:           
84d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
84e0: 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20 20 20  TE_ABORT";      
84f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8500: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8510: 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20  ABORT_ROLLBACK: 
8520: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8530: 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
8540: 43 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20  CK";    break;. 
8550: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8560: 5f 42 55 53 59 3a 20 20 20 20 20 20 20 20 20 20  _BUSY:          
8570: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8580: 4c 49 54 45 5f 42 55 53 59 22 3b 20 20 20 20 20  LITE_BUSY";     
8590: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
85a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
85b0: 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 3a  E_BUSY_RECOVERY:
85c0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
85d0: 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56  QLITE_BUSY_RECOV
85e0: 45 52 59 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  ERY";     break;
85f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8600: 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
8610: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
8620: 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50  SQLITE_BUSY_SNAP
8630: 53 48 4f 54 22 3b 20 20 20 20 20 62 72 65 61 6b  SHOT";     break
8640: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8650: 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20 20 20  ITE_LOCKED:     
8660: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8670: 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 22 3b  "SQLITE_LOCKED";
8680: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
8690: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
86a0: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
86b0: 45 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65 20 3d  EDCACHE: zName =
86c0: 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f   "SQLITE_LOCKED_
86d0: 53 48 41 52 45 44 43 41 43 48 45 22 3b 62 72 65  SHAREDCACHE";bre
86e0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
86f0: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20  QLITE_NOMEM:    
8700: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
8710: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 22  = "SQLITE_NOMEM"
8720: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;             br
8730: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8740: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 3a  SQLITE_READONLY:
8750: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
8760: 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f   = "SQLITE_READO
8770: 4e 4c 59 22 3b 20 20 20 20 20 20 20 20 20 20 62  NLY";          b
8780: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8790: 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59   SQLITE_READONLY
87a0: 5f 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e 61 6d  _RECOVERY:  zNam
87b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44  e = "SQLITE_READ
87c0: 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22 3b 20  ONLY_RECOVERY"; 
87d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
87e0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
87f0: 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61  Y_CANTLOCK:  zNa
8800: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
8810: 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b  DONLY_CANTLOCK";
8820: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8830: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
8840: 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e  LY_ROLLBACK:  zN
8850: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
8860: 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22  ADONLY_ROLLBACK"
8870: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
8880: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
8890: 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20 20 7a  NLY_DBMOVED:   z
88a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
88b0: 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 22  EADONLY_DBMOVED"
88c0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  ;  break;.      
88d0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e 54 45  case SQLITE_INTE
88e0: 52 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20  RRUPT:          
88f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8900: 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20 20 20  INTERRUPT";     
8910: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8920: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8930: 52 52 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  RR:             
8940: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8950: 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20 20 20  _IOERR";        
8960: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8970: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8980: 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20 20 20  ERR_READ:       
8990: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
89a0: 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b 20 20  E_IOERR_READ";  
89b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
89c0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
89d0: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3a  OERR_SHORT_READ:
89e0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
89f0: 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
8a00: 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20  EAD";  break;.  
8a10: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8a20: 49 4f 45 52 52 5f 57 52 49 54 45 3a 20 20 20 20  IOERR_WRITE:    
8a30: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8a40: 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 22  ITE_IOERR_WRITE"
8a50: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
8a60: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8a70: 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20 20 20  _IOERR_FSYNC:   
8a80: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8a90: 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43  LITE_IOERR_FSYNC
8aa0: 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ";       break;.
8ab0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8ac0: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53 59 4e  E_IOERR_DIR_FSYN
8ad0: 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  C:    zName = "S
8ae0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f  QLITE_IOERR_DIR_
8af0: 46 53 59 4e 43 22 3b 20 20 20 62 72 65 61 6b 3b  FSYNC";   break;
8b00: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8b10: 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43 41 54  TE_IOERR_TRUNCAT
8b20: 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  E:     zName = "
8b30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55  SQLITE_IOERR_TRU
8b40: 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65 61 6b  NCATE";    break
8b50: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8b60: 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41 54 3a  ITE_IOERR_FSTAT:
8b70: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
8b80: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53  "SQLITE_IOERR_FS
8b90: 54 41 54 22 3b 20 20 20 20 20 20 20 62 72 65 61  TAT";       brea
8ba0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8bb0: 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c 4f 43  LITE_IOERR_UNLOC
8bc0: 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  K:       zName =
8bd0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55   "SQLITE_IOERR_U
8be0: 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72 65  NLOCK";      bre
8bf0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8c00: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44 4c 4f  QLITE_IOERR_RDLO
8c10: 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  CK:       zName 
8c20: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8c30: 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62 72  RDLOCK";      br
8c40: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8c50: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c  SQLITE_IOERR_DEL
8c60: 45 54 45 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  ETE:       zName
8c70: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8c80: 5f 44 45 4c 45 54 45 22 3b 20 20 20 20 20 20 62  _DELETE";      b
8c90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8ca0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c   SQLITE_IOERR_BL
8cb0: 4f 43 4b 45 44 3a 20 20 20 20 20 20 7a 4e 61 6d  OCKED:      zNam
8cc0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8cd0: 52 5f 42 4c 4f 43 4b 45 44 22 3b 20 20 20 20 20  R_BLOCKED";     
8ce0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8cf0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  e SQLITE_IOERR_N
8d00: 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e 61  OMEM:        zNa
8d10: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8d20: 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20  RR_NOMEM";      
8d30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8d40: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8d50: 41 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a 4e  ACCESS:       zN
8d60: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8d70: 45 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20 20  ERR_ACCESS";    
8d80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8d90: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8da0: 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f  _CHECKRESERVEDLO
8db0: 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  CK:.            
8dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8dd0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8de0: 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b 52  ITE_IOERR_CHECKR
8df0: 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62 72  ESERVEDLOCK"; br
8e00: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8e10: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43  SQLITE_IOERR_LOC
8e20: 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  K:         zName
8e30: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8e40: 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20 62  _LOCK";        b
8e50: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8e60: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c   SQLITE_IOERR_CL
8e70: 4f 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d  OSE:        zNam
8e80: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8e90: 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20 20  R_CLOSE";       
8ea0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8eb0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
8ec0: 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e 61  IR_CLOSE:    zNa
8ed0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8ee0: 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20 20  RR_DIR_CLOSE";  
8ef0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8f00: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8f10: 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a 4e  SHMOPEN:      zN
8f20: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8f30: 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20 20  ERR_SHMOPEN";   
8f40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8f50: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8f60: 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20 7a  _SHMSIZE:      z
8f70: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8f80: 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20 20  OERR_SHMSIZE";  
8f90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8fa0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8fb0: 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20 20  R_SHMLOCK:      
8fc0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8fd0: 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b 20  IOERR_SHMLOCK"; 
8fe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8ff0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
9000: 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20 20  RR_SHMMAP:      
9010: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9020: 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b 20  _IOERR_SHMMAP"; 
9030: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9040: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
9050: 45 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20 20  ERR_SEEK:       
9060: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9070: 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20 20  E_IOERR_SEEK";  
9080: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9090: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
90a0: 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45 4e  OERR_DELETE_NOEN
90b0: 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  T: zName = "SQLI
90c0: 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f  TE_IOERR_DELETE_
90d0: 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20 20  NOENT";break;.  
90e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
90f0: 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20 20  IOERR_MMAP:     
9100: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9110: 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22 3b  ITE_IOERR_MMAP";
9120: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9130: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9140: 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50 41  _IOERR_GETTEMPPA
9150: 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  TH:  zName = "SQ
9160: 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54 45  LITE_IOERR_GETTE
9170: 4d 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a  MPPATH"; break;.
9180: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9190: 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54 48  E_IOERR_CONVPATH
91a0: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
91b0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56  QLITE_IOERR_CONV
91c0: 50 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b 3b  PATH";    break;
91d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
91e0: 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20 20  TE_CORRUPT:     
91f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9200: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22 3b  SQLITE_CORRUPT";
9210: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9220: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9230: 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42  ITE_CORRUPT_VTAB
9240: 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  :       zName = 
9250: 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f  "SQLITE_CORRUPT_
9260: 56 54 41 42 22 3b 20 20 20 20 20 20 62 72 65 61  VTAB";      brea
9270: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9280: 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20 20  LITE_NOTFOUND:  
9290: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
92a0: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e   "SQLITE_NOTFOUN
92b0: 44 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  D";          bre
92c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
92d0: 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20 20  QLITE_FULL:     
92e0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
92f0: 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22 3b  = "SQLITE_FULL";
9300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
9310: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9320: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3a  SQLITE_CANTOPEN:
9330: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9340: 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f   = "SQLITE_CANTO
9350: 50 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20 62  PEN";          b
9360: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9370: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
9380: 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61 6d  _NOTEMPDIR: zNam
9390: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
93a0: 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22 3b  OPEN_NOTEMPDIR";
93b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
93c0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
93d0: 4e 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e 61  N_ISDIR:     zNa
93e0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
93f0: 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20 20  TOPEN_ISDIR";   
9400: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9410: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
9420: 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a 4e  EN_FULLPATH:  zN
9430: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
9440: 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48 22  NTOPEN_FULLPATH"
9450: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
9460: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
9470: 50 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20 7a  PEN_CONVPATH:  z
9480: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9490: 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48  ANTOPEN_CONVPATH
94a0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
94b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f 54  case SQLITE_PROT
94c0: 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20 20  OCOL:           
94d0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
94e0: 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20 20  PROTOCOL";      
94f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9500: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d 50   case SQLITE_EMP
9510: 54 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  TY:             
9520: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9530: 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20 20  _EMPTY";        
9540: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9550: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53 43    case SQLITE_SC
9560: 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20 20  HEMA:           
9570: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9580: 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20 20  E_SCHEMA";      
9590: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
95a0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
95b0: 4f 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20 20  OOBIG:          
95c0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
95d0: 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20 20  TE_TOOBIG";     
95e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
95f0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9600: 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20 20  CONSTRAINT:     
9610: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9620: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22 3b  ITE_CONSTRAINT";
9630: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9640: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9650: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51  _CONSTRAINT_UNIQ
9660: 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  UE:  zName = "SQ
9670: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9680: 55 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b 0a  UNIQUE"; break;.
9690: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
96a0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49  E_CONSTRAINT_TRI
96b0: 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  GGER: zName = "S
96c0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
96d0: 5f 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b 3b  _TRIGGER";break;
96e0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
96f0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
9700: 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20 20  REIGNKEY:.      
9710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9720: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9730: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
9740: 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 22  AINT_FOREIGNKEY"
9750: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
9760: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
9770: 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20 20  STRAINT_CHECK:  
9780: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9790: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45 43  _CONSTRAINT_CHEC
97a0: 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  K";  break;.    
97b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
97c0: 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
97d0: 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20  KEY:.           
97e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97f0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9800: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9810: 50 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20 62  PRIMARYKEY";   b
9820: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9830: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
9840: 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61 6d  NT_NOTNULL: zNam
9850: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
9860: 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22 3b  TRAINT_NOTNULL";
9870: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9880: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
9890: 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a 0a  INT_COMMITHOOK:.
98a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
98c0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
98d0: 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49  CONSTRAINT_COMMI
98e0: 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b 3b  THOOK";   break;
98f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9900: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54  TE_CONSTRAINT_VT
9910: 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  AB:    zName = "
9920: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9930: 54 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61 6b  T_VTAB";   break
9940: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9950: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
9960: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 20  UNCTION:.       
9970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9980: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9990: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
99a0: 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20 20  INT_FUNCTION";  
99b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
99c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
99d0: 54 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20 20  TRAINT_ROWID:   
99e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
99f0: 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49 44  CONSTRAINT_ROWID
9a00: 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ";  break;.     
9a10: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49 53   case SQLITE_MIS
9a20: 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20 20  MATCH:          
9a30: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9a40: 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20 20  _MISMATCH";     
9a50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9a60: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
9a70: 53 55 53 45 3a 20 20 20 20 20 20 20 20 20 20 20  SUSE:           
9a80: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9a90: 45 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20 20  E_MISUSE";      
9aa0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9ab0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
9ac0: 4f 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20 20  OLFS:           
9ad0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9ae0: 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20 20  TE_NOLFS";      
9af0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9b00: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9b10: 41 55 54 48 3a 20 20 20 20 20 20 20 20 20 20 20  AUTH:           
9b20: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9b30: 49 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20 20  ITE_AUTH";      
9b40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9b50: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9b60: 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20 20  _FORMAT:        
9b70: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9b80: 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20 20  LITE_FORMAT";   
9b90: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9ba0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9bb0: 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20 20  E_RANGE:        
9bc0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9bd0: 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20 20  QLITE_RANGE";   
9be0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9bf0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9c00: 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20 20  TE_NOTADB:      
9c10: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9c20: 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b 20  SQLITE_NOTADB"; 
9c30: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9c40: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9c50: 49 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20 20  ITE_ROW:        
9c60: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9c70: 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20 20  "SQLITE_ROW";   
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9c90: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9ca0: 4c 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20 20  LITE_NOTICE:    
9cb0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9cc0: 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 22   "SQLITE_NOTICE"
9cd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  ;            bre
9ce0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9cf0: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43  QLITE_NOTICE_REC
9d00: 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65 20  OVER_WAL: zName 
9d10: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
9d20: 5f 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62 72  _RECOVER_WAL";br
9d30: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9d40: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
9d50: 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a 0a  COVER_ROLLBACK:.
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d80: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9d90: 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52  NOTICE_RECOVER_R
9da0: 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b  OLLBACK"; break;
9db0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9dc0: 54 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20 20  TE_WARNING:     
9dd0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9de0: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22 3b  SQLITE_WARNING";
9df0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9e00: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9e10: 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54 4f  ITE_WARNING_AUTO
9e20: 49 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d 20  INDEX:  zName = 
9e30: 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f  "SQLITE_WARNING_
9e40: 41 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65 61  AUTOINDEX"; brea
9e50: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9e60: 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20 20  LITE_DONE:      
9e70: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9e80: 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b 20   "SQLITE_DONE"; 
9e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
9ea0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
9eb0: 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a  if( zName==0 ){.
9ec0: 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
9ed0: 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73 71  zBuf[50];.    sq
9ee0: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
9ef0: 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42 75  izeof(zBuf), zBu
9f00: 66 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e 4f  f, "SQLITE_UNKNO
9f10: 57 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63 29  WN(%d)", origRc)
9f20: 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a 42  ;.    zName = zB
9f30: 75 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  uf;.  }.  return
9f40: 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69 66   zName;.}.#endif
9f50: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
9f60: 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 74   static string t
9f70: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
9f80: 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20  e kind of error 
9f90: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
9fa0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
9fb0: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
9fc0: 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20 72  ite3ErrStr(int r
9fd0: 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  c){.  static con
9fe0: 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20 61  st char* const a
9ff0: 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f 2a  Msg[] = {.    /*
a000: 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20 20   SQLITE_OK      
a010: 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20 65      */ "not an e
a020: 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51  rror",.    /* SQ
a030: 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20 20  LITE_ERROR      
a040: 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20 65   */ "SQL logic e
a050: 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67 20  rror or missing 
a060: 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f  database",.    /
a070: 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  * SQLITE_INTERNA
a080: 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20 2f  L    */ 0,.    /
a090: 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20 20  * SQLITE_PERM   
a0a0: 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73 20       */ "access 
a0b0: 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69 65  permission denie
a0c0: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
a0d0: 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a 2f  E_ABORT       */
a0e0: 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75 65   "callback reque
a0f0: 73 74 65 64 20 71 75 65 72 79 20 61 62 6f 72 74  sted query abort
a100: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a110: 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f 20  _BUSY        */ 
a120: 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f 63  "database is loc
a130: 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ked",.    /* SQL
a140: 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20 20  ITE_LOCKED      
a150: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61 62  */ "database tab
a160: 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20  le is locked",. 
a170: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d     /* SQLITE_NOM
a180: 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75 74  EM       */ "out
a190: 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20 20   of memory",.   
a1a0: 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44 4f   /* SQLITE_READO
a1b0: 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65 6d  NLY    */ "attem
a1c0: 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72 65  pt to write a re
a1d0: 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 22  adonly database"
a1e0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a1f0: 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20 22  INTERRUPT   */ "
a200: 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20 20  interrupted",.  
a210: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45 52    /* SQLITE_IOER
a220: 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73 6b  R       */ "disk
a230: 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20 20   I/O error",.   
a240: 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52 55   /* SQLITE_CORRU
a250: 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62  PT     */ "datab
a260: 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20 69  ase disk image i
a270: 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20 20  s malformed",.  
a280: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54 46    /* SQLITE_NOTF
a290: 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b 6e  OUND    */ "unkn
a2a0: 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c 0a  own operation",.
a2b0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 55      /* SQLITE_FU
a2c0: 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64 61  LL        */ "da
a2d0: 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20 69  tabase or disk i
a2e0: 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a 20  s full",.    /* 
a2f0: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
a300: 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74 6f     */ "unable to
a310: 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 66   open database f
a320: 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ile",.    /* SQL
a330: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20 20  ITE_PROTOCOL    
a340: 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  */ "locking prot
a350: 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53 51  ocol",.    /* SQ
a360: 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20 20  LITE_EMPTY      
a370: 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74 61   */ "table conta
a380: 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20 20  ins no data",.  
a390: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48 45    /* SQLITE_SCHE
a3a0: 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61  MA      */ "data
a3b0: 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20  base schema has 
a3c0: 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f 2a  changed",.    /*
a3d0: 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20 20   SQLITE_TOOBIG  
a3e0: 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20 6f      */ "string o
a3f0: 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22 2c  r blob too big",
a400: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
a410: 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22 63  ONSTRAINT  */ "c
a420: 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65 64  onstraint failed
a430: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a440: 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f 20  _MISMATCH    */ 
a450: 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61 74  "datatype mismat
a460: 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ch",.    /* SQLI
a470: 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20 2a  TE_MISUSE      *
a480: 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74 69  / "library routi
a490: 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f 66  ne called out of
a4a0: 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20 20   sequence",.    
a4b0: 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 20  /* SQLITE_NOLFS 
a4c0: 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65 20        */ "large 
a4d0: 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73 20  file support is 
a4e0: 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20 2f  disabled",.    /
a4f0: 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20 20  * SQLITE_AUTH   
a500: 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72 69       */ "authori
a510: 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c 0a  zation denied",.
a520: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46 4f      /* SQLITE_FO
a530: 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61 75  RMAT      */ "au
a540: 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73 65  xiliary database
a550: 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c 0a   format error",.
a560: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 41      /* SQLITE_RA
a570: 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62 69  NGE       */ "bi
a580: 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e 64  nd or column ind
a590: 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22  ex out of range"
a5a0: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a5b0: 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20 22  NOTADB      */ "
a5c0: 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74 65  file is encrypte
a5d0: 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64 61  d or is not a da
a5e0: 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20 20  tabase",.  };.  
a5f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72  const char *zErr
a600: 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72 6f   = "unknown erro
a610: 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72 63  r";.  switch( rc
a620: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c   ){.    case SQL
a630: 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41  ITE_ABORT_ROLLBA
a640: 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72 72  CK: {.      zErr
a650: 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74 6f   = "abort due to
a660: 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20 20   ROLLBACK";.    
a670: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a680: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
a690: 20 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b 0a      rc &= 0xff;.
a6a0: 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53        if( ALWAYS
a6b0: 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41 72  (rc>=0) && rc<Ar
a6c0: 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26 26  raySize(aMsg) &&
a6d0: 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b 0a   aMsg[rc]!=0 ){.
a6e0: 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20 61          zErr = a
a6f0: 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20 7d  Msg[rc];.      }
a700: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a710: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
a720: 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   zErr;.}../*.** 
a730: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d 70  This routine imp
a740: 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20 63  lements a busy c
a750: 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c 65  allback that sle
a760: 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a 2a  eps and tries.**
a770: 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20 74   again until a t
a780: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 20  imeout value is 
a790: 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74 69  reached.  The ti
a7a0: 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a 2a  meout value is.*
a7b0: 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75 6d  * an integer num
a7c0: 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f  ber of milliseco
a7d0: 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61 73  nds passed in as
a7e0: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61 72   the first.** ar
a7f0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69  gument..*/.stati
a800: 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66 61  c int sqliteDefa
a810: 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 28  ultBusyCallback(
a820: 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20 20  . void *ptr,    
a830: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
a840: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
a850: 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74 20  n */. int count 
a860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a870: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  * Number of time
a880: 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65 6e  s table has been
a890: 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66 20   busy */.){.#if 
a8a0: 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c 7c  SQLITE_OS_WIN ||
a8b0: 20 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f 55   (defined(HAVE_U
a8c0: 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f 55  SLEEP) && HAVE_U
a8d0: 53 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63 20  SLEEP).  static 
a8e0: 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73 5b  const u8 delays[
a8f0: 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32 2c  ] =.     { 1, 2,
a900: 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c 20   5, 10, 15, 20, 
a910: 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35 30  25, 25,  25,  50
a920: 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20 20  ,  50, 100 };.  
a930: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
a940: 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20 20  totals[] =.     
a950: 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20 31  { 0, 1, 3,  8, 1
a960: 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20 31  8, 33, 53, 78, 1
a970: 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32 32  03, 128, 178, 22
a980: 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e 44  8 };.# define ND
a990: 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28 64  ELAY ArraySize(d
a9a0: 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65 33  elays).  sqlite3
a9b0: 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20   *db = (sqlite3 
a9c0: 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d  *)ptr;.  int tim
a9d0: 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79 54  eout = db->busyT
a9e0: 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64 65  imeout;.  int de
a9f0: 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20 61  lay, prior;..  a
aa00: 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30 20  ssert( count>=0 
aa10: 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20 3c  );.  if( count <
aa20: 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20 64   NDELAY ){.    d
aa30: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63 6f  elay = delays[co
aa40: 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72 20  unt];.    prior 
aa50: 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d 3b  = totals[count];
aa60: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 65  .  }else{.    de
aa70: 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44 45  lay = delays[NDE
aa80: 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69 6f  LAY-1];.    prio
aa90: 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c 41  r = totals[NDELA
aaa0: 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63 6f  Y-1] + delay*(co
aab0: 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29 3b  unt-(NDELAY-1));
aac0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f 72  .  }.  if( prior
aad0: 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65 6f   + delay > timeo
aae0: 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79 20  ut ){.    delay 
aaf0: 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69 6f  = timeout - prio
ab00: 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61 79  r;.    if( delay
ab10: 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  <=0 ) return 0;.
ab20: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
ab30: 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 64  leep(db->pVfs, d
ab40: 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72 65  elay*1000);.  re
ab50: 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20 20  turn 1;.#else.  
ab60: 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73  sqlite3 *db = (s
ab70: 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20  qlite3 *)ptr;.  
ab80: 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28 28  int timeout = ((
ab90: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d 3e  sqlite3 *)ptr)->
aba0: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
abb0: 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30 30  f( (count+1)*100
abc0: 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20  0 > timeout ){. 
abd0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
abe0: 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  .  sqlite3OsSlee
abf0: 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30 30  p(db->pVfs, 1000
ac00: 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31  000);.  return 1
ac10: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
ac20: 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69 76  * Invoke the giv
ac30: 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72 2e  en busy handler.
ac40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ac50: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ine is called wh
ac60: 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 20  en an operation 
ac70: 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c 6f  failed with a lo
ac80: 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20 72  ck..** If this r
ac90: 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 6e  outine returns n
aca0: 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63  on-zero, the loc
acb0: 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20 49  k is retried.  I
acc0: 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73 20  f it.** returns 
acd0: 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  0, the operation
ace0: 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e 20   aborts with an 
acf0: 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f  SQLITE_BUSY erro
ad00: 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
ad10: 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64 6c  3InvokeBusyHandl
ad20: 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  er(BusyHandler *
ad30: 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  p){.  int rc;.  
ad40: 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29 20  if( NEVER(p==0) 
ad50: 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 7c  || p->xFunc==0 |
ad60: 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20 72  | p->nBusy<0 ) r
ad70: 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20  eturn 0;.  rc = 
ad80: 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72 67  p->xFunc(p->pArg
ad90: 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20 69  , p->nBusy);.  i
ada0: 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20  f( rc==0 ){.    
adb0: 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a 20  p->nBusy = -1;. 
adc0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 6e   }else{.    p->n
add0: 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  Busy++;.  }.  re
ade0: 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a 0a  turn rc; .}../*.
adf0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ae00: 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63 61  sets the busy ca
ae10: 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53 71  llback for an Sq
ae20: 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74 6f  lite database to
ae30: 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61   the.** given ca
ae40: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
ae50: 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20 61  with the given a
ae60: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  rgument..*/.int 
ae70: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
ae80: 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20  dler(.  sqlite3 
ae90: 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42 75  *db,.  int (*xBu
aea0: 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c 0a  sy)(void*,int),.
aeb0: 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a    void *pArg.){.
aec0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
aed0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
aee0: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
aef0: 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75 73  ler.xFunc = xBus
af00: 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  y;.  db->busyHan
af10: 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72 67  dler.pArg = pArg
af20: 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e 64  ;.  db->busyHand
af30: 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a 20  ler.nBusy = 0;. 
af40: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
af50: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
af60: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
af70: 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
af80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
af90: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
afa0: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
afb0: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  BACK./*.** This 
afc0: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
afd0: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
afe0: 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74 65  ck for an Sqlite
aff0: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
b000: 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62 61  .** given callba
b010: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  ck function with
b020: 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75 6d   the given argum
b030: 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65 73  ent. The progres
b040: 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c 0a  s callback will.
b050: 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65 76  ** be invoked ev
b060: 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65 73  ery nOps opcodes
b070: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b080: 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64 6c  3_progress_handl
b090: 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  er(.  sqlite3 *d
b0a0: 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c 0a  b, .  int nOps,.
b0b0: 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65 73    int (*xProgres
b0c0: 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76 6f  s)(void*), .  vo
b0d0: 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73 71  id *pArg.){.  sq
b0e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
b0f0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
b100: 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20 20  if( nOps>0 ){.  
b110: 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73 20    db->xProgress 
b120: 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20 20  = xProgress;.   
b130: 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f 70   db->nProgressOp
b140: 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e 4f  s = (unsigned)nO
b150: 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f  ps;.    db->pPro
b160: 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67 3b  gressArg = pArg;
b170: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 62  .  }else{.    db
b180: 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30 3b  ->xProgress = 0;
b190: 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65  .    db->nProgre
b1a0: 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20 64  ssOps = 0;.    d
b1b0: 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20  b->pProgressArg 
b1c0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
b1d0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
b1e0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65 6e  b->mutex);.}.#en
b1f0: 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  dif.../*.** This
b200: 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c 6c   routine install
b210: 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73 79  s a default busy
b220: 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77 61   handler that wa
b230: 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20 73  its for the.** s
b240: 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72 20  pecified number 
b250: 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 20  of milliseconds 
b260: 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
b270: 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74   0..*/.int sqlit
b280: 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74 28  e3_busy_timeout(
b290: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
b2a0: 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e 30   ms){.  if( ms>0
b2b0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
b2c0: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c  busy_handler(db,
b2d0: 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42 75   sqliteDefaultBu
b2e0: 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f 69  syCallback, (voi
b2f0: 64 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d 3e  d*)db);.    db->
b300: 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d 73  busyTimeout = ms
b310: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
b320: 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64  qlite3_busy_hand
b330: 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a 20  ler(db, 0, 0);. 
b340: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
b350: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
b360: 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69 6e  Cause any pendin
b370: 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 73  g operation to s
b380: 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c 69  top at its earli
b390: 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79 2e  est opportunity.
b3a0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
b3b0: 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69 74  _interrupt(sqlit
b3c0: 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e 75  e3 *db){.  db->u
b3d0: 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64 20  1.isInterrupted 
b3e0: 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  = 1;.}.../*.** T
b3f0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
b400: 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d 65  exactly the same
b410: 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65 61   as sqlite3_crea
b420: 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 65  te_function(), e
b430: 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69 74  xcept.** that it
b440: 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f 20   is designed to 
b450: 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e 74  be called by int
b460: 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65 20  ernal code. The 
b470: 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a 2a  difference is.**
b480: 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c 6f   that if a mallo
b490: 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71 6c  c() fails in sql
b4a0: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
b4b0: 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f 72  tion(), an error
b4c0: 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74 75   code.** is retu
b4d0: 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61 6c  rned and the mal
b4e0: 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 63  locFailed flag c
b4f0: 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74 20  leared. .*/.int 
b500: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
b510: 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  c(.  sqlite3 *db
b520: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b530: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
b540: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
b550: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70 55   enc,.  void *pU
b560: 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64 20  serData,.  void 
b570: 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33  (*xFunc)(sqlite3
b580: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
b590: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
b5a0: 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29  .  void (*xStep)
b5b0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
b5c0: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
b5d0: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
b5e0: 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65  (*xFinal)(sqlite
b5f0: 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 46  3_context*),.  F
b600: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
b610: 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20 20  Destructor.){.  
b620: 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69 6e  FuncDef *p;.  in
b630: 74 20 6e 4e 61 6d 65 3b 0a 0a 20 20 61 73 73 65  t nName;..  asse
b640: 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  rt( sqlite3_mute
b650: 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78  x_held(db->mutex
b660: 29 20 29 3b 0a 20 20 69 66 28 20 7a 46 75 6e 63  ) );.  if( zFunc
b670: 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c 7c 0a 20  tionName==0 ||. 
b680: 20 20 20 20 20 28 78 46 75 6e 63 20 26 26 20 28       (xFunc && (
b690: 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74 65 70 29  xFinal || xStep)
b6a0: 29 20 7c 7c 20 0a 20 20 20 20 20 20 28 21 78 46  ) || .      (!xF
b6b0: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 26  unc && (xFinal &
b6c0: 26 20 21 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  & !xStep)) ||.  
b6d0: 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28      (!xFunc && (
b6e0: 21 78 46 69 6e 61 6c 20 26 26 20 78 53 74 65 70  !xFinal && xStep
b6f0: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 6e 41 72  )) ||.      (nAr
b700: 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e 53 51 4c  g<-1 || nArg>SQL
b710: 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
b720: 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20 20 20 28  _ARG) ||.      (
b730: 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20 73 71 6c  255<(nName = sql
b740: 69 74 65 33 53 74 72 6c 65 6e 33 30 28 20 7a 46  ite3Strlen30( zF
b750: 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29 29 20 29  unctionName))) )
b760: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
b770: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
b780: 0a 20 20 7d 0a 20 20 0a 23 69 66 6e 64 65 66 20  .  }.  .#ifndef 
b790: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
b7a0: 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45  6.  /* If SQLITE
b7b0: 5f 55 54 46 31 36 20 69 73 20 73 70 65 63 69 66  _UTF16 is specif
b7c0: 69 65 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64  ied as the encod
b7d0: 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66  ing type, transf
b7e0: 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f  orm this.  ** to
b7f0: 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55   one of SQLITE_U
b800: 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45  TF16LE or SQLITE
b810: 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67 20 74  _UTF16BE using t
b820: 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55  he.  ** SQLITE_U
b830: 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f  TF16NATIVE macro
b840: 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  . SQLITE_UTF16 i
b850: 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72  s not used inter
b860: 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  nally..  **.  **
b870: 20 49 66 20 53 51 4c 49 54 45 5f 41 4e 59 20 69   If SQLITE_ANY i
b880: 73 20 73 70 65 63 69 66 69 65 64 2c 20 61 64 64  s specified, add
b890: 20 74 68 72 65 65 20 76 65 72 73 69 6f 6e 73 20   three versions 
b8a0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a  of the function.
b8b0: 20 20 2a 2a 20 74 6f 20 74 68 65 20 68 61 73 68    ** to the hash
b8c0: 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69   table..  */.  i
b8d0: 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  f( enc==SQLITE_U
b8e0: 54 46 31 36 20 29 7b 0a 20 20 20 20 65 6e 63 20  TF16 ){.    enc 
b8f0: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41  = SQLITE_UTF16NA
b900: 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  TIVE;.  }else if
b910: 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 41 4e  ( enc==SQLITE_AN
b920: 59 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b  Y ){.    int rc;
b930: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b940: 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20  3CreateFunc(db, 
b950: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e  zFunctionName, n
b960: 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Arg, SQLITE_UTF8
b970: 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73 65 72  ,.         pUser
b980: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
b990: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73  ep, xFinal, pDes
b9a0: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66  tructor);.    if
b9b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b9c0: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
b9d0: 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28  lite3CreateFunc(
b9e0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
b9f0: 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f  e, nArg, SQLITE_
ba00: 55 54 46 31 36 4c 45 2c 0a 20 20 20 20 20 20 20  UTF16LE,.       
ba10: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46     pUserData, xF
ba20: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
ba30: 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  al, pDestructor)
ba40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
ba50: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ba60: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
ba70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6e 63 20  ;.    }.    enc 
ba80: 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  = SQLITE_UTF16BE
ba90: 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e  ;.  }.#else.  en
baa0: 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 38 3b  c = SQLITE_UTF8;
bab0: 0a 23 65 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20  .#endif.  .  /* 
bac0: 43 68 65 63 6b 20 69 66 20 61 6e 20 65 78 69 73  Check if an exis
bad0: 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 69 73  ting function is
bae0: 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65   being overridde
baf0: 6e 20 6f 72 20 64 65 6c 65 74 65 64 2e 20 49 66  n or deleted. If
bb00: 20 73 6f 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68   so,.  ** and th
bb10: 65 72 65 20 61 72 65 20 61 63 74 69 76 65 20 56  ere are active V
bb20: 4d 73 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20  Ms, then return 
bb30: 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 49 66 20  SQLITE_BUSY. If 
bb40: 61 20 66 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20  a function.  ** 
bb50: 69 73 20 62 65 69 6e 67 20 6f 76 65 72 72 69 64  is being overrid
bb60: 64 65 6e 2f 64 65 6c 65 74 65 64 20 62 75 74 20  den/deleted but 
bb70: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 63 74  there are no act
bb80: 69 76 65 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74  ive VMs, allow t
bb90: 68 65 0a 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f  he.  ** operatio
bba0: 6e 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75  n to continue bu
bbb0: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c  t invalidate all
bbc0: 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 74 61   precompiled sta
bbd0: 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20  tements..  */.  
bbe0: 70 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  p = sqlite3FindF
bbf0: 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e  unction(db, zFun
bc00: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65  ctionName, nName
bc10: 2c 20 6e 41 72 67 2c 20 28 75 38 29 65 6e 63 2c  , nArg, (u8)enc,
bc20: 20 30 29 3b 0a 20 20 69 66 28 20 70 20 26 26 20   0);.  if( p && 
bc30: 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  (p->funcFlags & 
bc40: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
bc50: 41 53 4b 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e  ASK)==enc && p->
bc60: 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20  nArg==nArg ){.  
bc70: 20 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41    if( db->nVdbeA
bc80: 63 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73  ctive ){.      s
bc90: 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
bca0: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
bcb0: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
bcc0: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75   delete/modify u
bcd0: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65  ser-function due
bce0: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
bcf0: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61  ments");.      a
bd00: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
bd10: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
bd20: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bd30: 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
bd40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
bd50: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
bd60: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
bd70: 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  }.  }..  p = sql
bd80: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
bd90: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
bda0: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
bdb0: 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20   (u8)enc, 1);.  
bdc0: 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e  assert(p || db->
bdd0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20  mallocFailed);. 
bde0: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
bdf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
be00: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
be10: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
be20: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
be30: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
be40: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
be50: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
be60: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
be70: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
be80: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
be90: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
bea0: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
beb0: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
bec0: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
bed0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
bee0: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44  pDestructor = pD
bef0: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e  estructor;.  p->
bf00: 66 75 6e 63 46 6c 61 67 73 20 26 3d 20 53 51 4c  funcFlags &= SQL
bf10: 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b  ITE_FUNC_ENCMASK
bf20: 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78  ;.  p->xFunc = x
bf30: 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70  Func;.  p->xStep
bf40: 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78   = xStep;.  p->x
bf50: 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61  Finalize = xFina
bf60: 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74  l;.  p->pUserDat
bf70: 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20  a = pUserData;. 
bf80: 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29   p->nArg = (u16)
bf90: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53  nArg;.  return S
bfa0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
bfb0: 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73  ** Create new us
bfc0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
bfd0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
bfe0: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
bff0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
c000: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
c010: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
c020: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
c030: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
c040: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
c050: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
c060: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
c070: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
c080: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
c090: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
c0a0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
c0b0: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
c0c0: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75  text*).){.  retu
c0d0: 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
c0e0: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
c0f0: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
c100: 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  nc, p, xFunc, xS
c110: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c130: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
c140: 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   0);.}..int sqli
c150: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
c160: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
c170: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
c180: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
c190: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
c1a0: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
c1b0: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
c1c0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
c1d0: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
c1e0: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
c1f0: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
c200: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
c210: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
c220: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
c230: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
c240: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
c250: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
c260: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c270: 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44  E_ERROR;.  FuncD
c280: 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20  estructor *pArg 
c290: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
c2a0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
c2b0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
c2c0: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
c2d0: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
c2e0: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  tor *)sqlite3DbM
c2f0: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
c300: 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63  zeof(FuncDestruc
c310: 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  tor));.    if( !
c320: 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44  pArg ){.      xD
c330: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20  estroy(p);.     
c340: 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d   goto out;.    }
c350: 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74  .    pArg->xDest
c360: 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a  roy = xDestroy;.
c370: 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44      pArg->pUserD
c380: 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  ata = p;.  }.  r
c390: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
c3a0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c  eFunc(db, zFunc,
c3b0: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
c3c0: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
c3d0: 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  nal, pArg);.  if
c3e0: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
c3f0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
c400: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
c410: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
c420: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
c430: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
c440: 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a  Arg);.  }.. out:
c450: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
c460: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
c470: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
c480: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
c490: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c4a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c4b0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
c4c0: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
c4d0: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
c4e0: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
c4f0: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
c500: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
c510: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
c520: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
c530: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
c540: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
c550: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
c560: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
c570: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
c580: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
c590: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
c5a0: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
c5b0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
c5c0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
c5d0: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71  ar *zFunc8;.  sq
c5e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
c5f0: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
c600: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
c610: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
c620: 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55  Func8 = sqlite3U
c630: 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e  tf16to8(db, zFun
c640: 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53  ctionName, -1, S
c650: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
c660: 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  E);.  rc = sqlit
c670: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
c680: 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65   zFunc8, nArg, e
c690: 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e  TextRep, p, xFun
c6a0: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
c6b0: 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ,0);.  sqlite3Db
c6c0: 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29  Free(db, zFunc8)
c6d0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
c6e0: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
c6f0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
c700: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
c710: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
c720: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
c730: 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
c740: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
c750: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
c760: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
c770: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
c780: 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
c790: 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
c7a0: 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
c7b0: 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
c7c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
c7d0: 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
c7e0: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
c7f0: 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
c800: 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
c810: 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
c820: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
c830: 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
c840: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
c850: 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
c860: 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
c870: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
c880: 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
c890: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
c8a0: 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
c8b0: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
c8c0: 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
c8d0: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
c8e0: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
c8f0: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
c900: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
c910: 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
c920: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
c930: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
c940: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
c950: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
c960: 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
c970: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
c980: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
c990: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c9a0: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_OK;.  sqlite3_
c9b0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
c9c0: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  mutex);.  if( sq
c9d0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
c9e0: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  n(db, zName, nNa
c9f0: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
ca00: 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a  _UTF8, 0)==0 ){.
ca10: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
ca20: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
ca30: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
ca40: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
ca50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ca60: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e      0, sqlite3In
ca70: 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  validFunction, 0
ca80: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
ca90: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
caa0: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
cab0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
cac0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
cad0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
cae0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
caf0: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
cb00: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
cb10: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
cb20: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
cb30: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
cb40: 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
cb50: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
cb60: 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
cb70: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
cb80: 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
cb90: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
cba0: 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
cbb0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
cbc0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
cbd0: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
cbe0: 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
cbf0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
cc00: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
cc10: 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
cc20: 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63  db, void (*xTrac
cc30: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
cc40: 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
cc50: 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
cc60: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
cc70: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
cc80: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
cc90: 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
cca0: 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->xTrace = xTrac
ccb0: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
ccc0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
ccd0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
cce0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
ccf0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a  eturn pOld;.}./*
cd00: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70  .** Register a p
cd10: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e  rofile function.
cd20: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
cd30: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
cd40: 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72  egistered .** pr
cd50: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69  ofile function i
cd60: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
cd70: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69  .** A NULL profi
cd80: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  le function mean
cd90: 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c  s that no profil
cda0: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
cdb0: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
cdc0: 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69  profile is a poi
cdd0: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
cde0: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
cdf0: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
ce00: 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20  sion of.** each 
ce10: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
ce20: 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f  at is run..*/.vo
ce30: 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66  id *sqlite3_prof
ce40: 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ile(.  sqlite3 *
ce50: 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72  db,.  void (*xPr
ce60: 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  ofile)(void*,con
ce70: 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f  st char*,sqlite_
ce80: 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  uint64),.  void 
ce90: 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20  *pArg.){.  void 
cea0: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
ceb0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
cec0: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
ced0: 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
cee0: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
cef0: 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
cf00: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
cf10: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
cf20: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
cf30: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
cf40: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
cf50: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
cf60: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
cf70: 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
cf80: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
cf90: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
cfa0: 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a  ction commits..*
cfb0: 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
cfc0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
cfd0: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
cfe0: 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
cff0: 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
d000: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
d010: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
d020: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
d030: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d040: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
d050: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
d060: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
d070: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
d080: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
d090: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
d0a0: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
d0b0: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
d0c0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
d0d0: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
d0e0: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
d0f0: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
d100: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
d110: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
d120: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
d130: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
d140: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
d150: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
d160: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
d170: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
d180: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
d190: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
d1a0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
d1b0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
d1c0: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
d1d0: 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
d1e0: 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
d1f0: 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
d200: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
d210: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
d220: 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
d230: 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
d240: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
d250: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
d260: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
d270: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
d280: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
d290: 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
d2a0: 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
d2b0: 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
d2c0: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d2e0: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
d2f0: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
d300: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
d310: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
d320: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
d330: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70    pRet = db->pUp
d340: 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
d350: 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
d360: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
d370: 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70  ->pUpdateArg = p
d380: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
d390: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
d3a0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
d3b0: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
d3c0: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
d3d0: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
d3e0: 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
d3f0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
d400: 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68  ed.** back by th
d410: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
d420: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
d430: 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63  *sqlite3_rollbac
d440: 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  k_hook(.  sqlite
d450: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
d460: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
d470: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
d480: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
d490: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
d4a0: 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61  oid*), /* Callba
d4b0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
d4c0: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
d4d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
d4e0: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
d4f0: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
d500: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
d510: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d520: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
d530: 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62  Ret = db->pRollb
d540: 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52  ackArg;.  db->xR
d550: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
d560: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
d570: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20  b->pRollbackArg 
d580: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
d590: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d5a0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
d5b0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
d5c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d5d0: 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  WAL./*.** The sq
d5e0: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
d5f0: 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
d600: 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ered by sqlite3_
d610: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
d620: 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20  nt()..** Invoke 
d630: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
d640: 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75  kpoint if the nu
d650: 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
d660: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a  n the log file.*
d670: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
d680: 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72  n sqlite3.pWalAr
d690: 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74  g cast to an int
d6a0: 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65 20  eger (the value 
d6b0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a  configured by.**
d6c0: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
d6d0: 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20  int())..*/ .int 
d6e0: 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
d6f0: 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70  tHook(.  void *p
d700: 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  ClientData,     
d710: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20  /* Argument */. 
d720: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
d730: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
d740: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
d750: 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
d760: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f    /* Database */
d770: 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20  .  int nFrame   
d780: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
d790: 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20  e of WAL */.){. 
d7a0: 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c   if( nFrame>=SQL
d7b0: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
d7c0: 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20  ClientData) ){. 
d7d0: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
d7e0: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
d7f0: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63     sqlite3_wal_c
d800: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44  heckpoint(db, zD
d810: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
d820: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
d830: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
d840: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
d850: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
d860: 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
d870: 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c  Configure an sql
d880: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
d890: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f  callback to auto
d8a0: 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70  matically checkp
d8b0: 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61  oint.** a databa
d8c0: 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74  se after committ
d8d0: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
d8e0: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
d8f0: 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65  Frame or.** more
d900: 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
d910: 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67  og file. Passing
d920: 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74   zero or a negat
d930: 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ive value as the
d940: 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d  .** nFrame param
d950: 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75  eter disables au
d960: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
d970: 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a  nts entirely..**
d980: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
d990: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 74   registered by t
d9a0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70  his function rep
d9b0: 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74 69  laces any existi
d9c0: 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72  ng callback.** r
d9d0: 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20  egistered using 
d9e0: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
d9f0: 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65  (). Likewise, re
da00: 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c  gistering a call
da10: 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71  back.** using sq
da20: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
da30: 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75   disables the au
da40: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
da50: 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20  nt mechanism.** 
da60: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
da70: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
da80: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
da90: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73  autocheckpoint(s
daa0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
dab0: 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20  nFrame){.#ifdef 
dac0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
dad0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
dae0: 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44  ER(db);.  UNUSED
daf0: 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d  _PARAMETER(nFram
db00: 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  e);.#else.  if( 
db10: 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20  nFrame>0 ){.    
db20: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
db30: 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44  (db, sqlite3WalD
db40: 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49  efaultHook, SQLI
db50: 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46  TE_INT_TO_PTR(nF
db60: 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  rame));.  }else{
db70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
db80: 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b  _hook(db, 0, 0);
db90: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
dba0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
dbb0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
dbc0: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
dbd0: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
dbe0: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
dbf0: 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  on is written.**
dc00: 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d   into the write-
dc10: 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69  ahead-log by thi
dc20: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
dc30: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
dc40: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
dc50: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
dc80: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
dc90: 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
dca0: 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f  t(*xCallback)(vo
dcb0: 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  id *, sqlite3*, 
dcc0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
dcd0: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
dce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dcf0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
dd00: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
dd10: 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a   xCallback() */.
dd20: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
dd30: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69  E_OMIT_WAL.  voi
dd40: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
dd50: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
dd60: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
dd70: 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b  t = db->pWalArg;
dd80: 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62  .  db->xWalCallb
dd90: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
dda0: 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d  .  db->pWalArg =
ddb0: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
ddc0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
ddd0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
dde0: 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20  n pRet;.#else.  
ddf0: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
de00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  .}../*.** Checkp
de10: 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
de20: 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
de30: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
de40: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
de50: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
de60: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
de70: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
de80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
de90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dea0: 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68  * Name of attach
deb0: 65 64 20 64 61 74 61 62 61 73 65 20 28 6f 72 20  ed database (or 
dec0: 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65  NULL) */.  int e
ded0: 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
dee0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
def0: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
df00: 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  * value */.  int
df10: 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20   *pnLog,        
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
df30: 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c  OUT: Size of WAL
df40: 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a   log in frames *
df50: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20  /.  int *pnCkpt 
df60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df70: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61      /* OUT: Tota
df80: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  l number of fram
df90: 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  es checkpointed 
dfa0: 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
dfb0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72  ITE_OMIT_WAL.  r
dfc0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
dfd0: 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dff0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
e000: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
e010: 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41   iDb = SQLITE_MA
e020: 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20  X_ATTACHED;  /* 
e030: 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e  sqlite3.aDb[] in
e040: 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65  dex of db to che
e050: 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  ckpoint */..  /*
e060: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
e070: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
e080: 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61   to -1 in case a
e090: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
e0a0: 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29  */.  if( pnLog )
e0b0: 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20   *pnLog = -1;.  
e0c0: 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e  if( pnCkpt ) *pn
e0d0: 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73  Ckpt = -1;..  as
e0e0: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
e0f0: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53 51 4c  CKPOINT_FULL>SQL
e100: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
e110: 41 53 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  ASSIVE );.  asse
e120: 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
e130: 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c 49 54  POINT_FULL<SQLIT
e140: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
e150: 54 41 52 54 20 29 3b 0a 20 20 61 73 73 65 72 74  TART );.  assert
e160: 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
e170: 49 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d 3d 53  INT_PASSIVE+2==S
e180: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e190: 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20 69 66  _RESTART );.  if
e1a0: 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43  ( eMode<SQLITE_C
e1b0: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
e1c0: 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54  E || eMode>SQLIT
e1d0: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
e1e0: 54 41 52 54 20 29 7b 0a 20 20 20 20 72 65 74 75  TART ){.    retu
e1f0: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
e200: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
e210: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
e220: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
e230: 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a  Db && zDb[0] ){.
e240: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
e250: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
e260: 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zDb);.  }.  if( 
e270: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  iDb<0 ){.    rc 
e280: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
e290: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e2a0: 28 64 62 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f  (db, SQLITE_ERRO
e2b0: 52 2c 20 22 75 6e 6b 6e 6f 77 6e 20 64 61 74 61  R, "unknown data
e2c0: 62 61 73 65 3a 20 25 73 22 2c 20 7a 44 62 29 3b  base: %s", zDb);
e2d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
e2e0: 20 3d 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70   = sqlite3Checkp
e2f0: 6f 69 6e 74 28 64 62 2c 20 69 44 62 2c 20 65 4d  oint(db, iDb, eM
e300: 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b  ode, pnLog, pnCk
e310: 70 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  pt);.    sqlite3
e320: 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
e330: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
e340: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
e350: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
e360: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
e370: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
e380: 72 63 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 0a 2f  rc;.#endif.}.../
e390: 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20  *.** Checkpoint 
e3a0: 64 61 74 61 62 61 73 65 20 7a 44 62 2e 20 49 66  database zDb. If
e3b0: 20 7a 44 62 20 69 73 20 4e 55 4c 4c 2c 20 6f 72   zDb is NULL, or
e3c0: 20 69 66 20 74 68 65 20 62 75 66 66 65 72 20 7a   if the buffer z
e3d0: 44 62 20 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  Db points.** to 
e3e0: 63 6f 6e 74 61 69 6e 73 20 61 20 7a 65 72 6f 2d  contains a zero-
e3f0: 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 2c 20 61  length string, a
e400: 6c 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ll attached data
e410: 62 61 73 65 73 20 61 72 65 20 0a 2a 2a 20 63 68  bases are .** ch
e420: 65 63 6b 70 6f 69 6e 74 65 64 2e 0a 2a 2f 0a 69  eckpointed..*/.i
e430: 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63  nt sqlite3_wal_c
e440: 68 65 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65  heckpoint(sqlite
e450: 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
e460: 72 20 2a 7a 44 62 29 7b 0a 20 20 72 65 74 75 72  r *zDb){.  retur
e470: 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  n sqlite3_wal_ch
e480: 65 63 6b 70 6f 69 6e 74 5f 76 32 28 64 62 2c 20  eckpoint_v2(db, 
e490: 7a 44 62 2c 20 53 51 4c 49 54 45 5f 43 48 45 43  zDb, SQLITE_CHEC
e4a0: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20  KPOINT_PASSIVE, 
e4b0: 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65  0, 0);.}..#ifnde
e4c0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
e4d0: 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 63 68  L./*.** Run a ch
e4e0: 65 63 6b 70 6f 69 6e 74 20 6f 6e 20 64 61 74 61  eckpoint on data
e4f0: 62 61 73 65 20 69 44 62 2e 20 54 68 69 73 20 69  base iDb. This i
e500: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 64 61 74  s a no-op if dat
e510: 61 62 61 73 65 20 69 44 62 20 69 73 0a 2a 2a 20  abase iDb is.** 
e520: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  not currently op
e530: 65 6e 20 69 6e 20 57 41 4c 20 6d 6f 64 65 2e 0a  en in WAL mode..
e540: 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
e550: 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 6f  action is open o
e560: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
e570: 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74 65  eing checkpointe
e580: 64 2c 20 74 68 69 73 20 0a 2a 2a 20 66 75 6e 63  d, this .** func
e590: 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c  tion returns SQL
e5a0: 49 54 45 5f 4c 4f 43 4b 45 44 20 61 6e 64 20 61  ITE_LOCKED and a
e5b0: 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20 6e   checkpoint is n
e5c0: 6f 74 20 61 74 74 65 6d 70 74 65 64 2e 20 49 66  ot attempted. If
e5d0: 20 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63   .** an error oc
e5e0: 63 75 72 73 20 77 68 69 6c 65 20 72 75 6e 6e 69  curs while runni
e5f0: 6e 67 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e  ng the checkpoin
e600: 74 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  t, an SQLite err
e610: 6f 72 20 63 6f 64 65 20 69 73 20 0a 2a 2a 20 72  or code is .** r
e620: 65 74 75 72 6e 65 64 20 28 69 2e 65 2e 20 53 51  eturned (i.e. SQ
e630: 4c 49 54 45 5f 49 4f 45 52 52 29 2e 20 4f 74 68  LITE_IOERR). Oth
e640: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
e650: 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 75 74  K..**.** The mut
e660: 65 78 20 6f 6e 20 64 61 74 61 62 61 73 65 20 68  ex on database h
e670: 61 6e 64 6c 65 20 64 62 20 73 68 6f 75 6c 64 20  andle db should 
e680: 62 65 20 68 65 6c 64 20 62 79 20 74 68 65 20 63  be held by the c
e690: 61 6c 6c 65 72 2e 20 54 68 65 20 6d 75 74 65 78  aller. The mutex
e6a0: 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 77  .** associated w
e6b0: 69 74 68 20 74 68 65 20 73 70 65 63 69 66 69 63  ith the specific
e6c0: 20 62 2d 74 72 65 65 20 62 65 69 6e 67 20 63 68   b-tree being ch
e6d0: 65 63 6b 70 6f 69 6e 74 65 64 20 69 73 20 74 61  eckpointed is ta
e6e0: 6b 65 6e 20 62 79 0a 2a 2a 20 74 68 69 73 20 66  ken by.** this f
e6f0: 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20 74 68  unction while th
e700: 65 20 63 68 65 63 6b 70 6f 69 6e 74 20 69 73 20  e checkpoint is 
e710: 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49  running..**.** I
e720: 66 20 69 44 62 20 69 73 20 70 61 73 73 65 64 20  f iDb is passed 
e730: 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
e740: 48 45 44 2c 20 74 68 65 6e 20 61 6c 6c 20 61 74  HED, then all at
e750: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73  tached databases
e760: 20 61 72 65 0a 2a 2a 20 63 68 65 63 6b 70 6f 69   are.** checkpoi
e770: 6e 74 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f  nted. If an erro
e780: 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  r is encountered
e790: 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 20   it is returned 
e7a0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 2d 0a 2a 2a  immediately -.**
e7b0: 20 6e 6f 20 61 74 74 65 6d 70 74 20 69 73 20 6d   no attempt is m
e7c0: 61 64 65 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e  ade to checkpoin
e7d0: 74 20 61 6e 79 20 72 65 6d 61 69 6e 69 6e 67 20  t any remaining 
e7e0: 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a  databases..**.**
e7f0: 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
e800: 20 69 73 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   is one of SQLIT
e810: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53  E_CHECKPOINT_PAS
e820: 53 49 56 45 2c 20 46 55 4c 4c 20 6f 72 20 52 45  SIVE, FULL or RE
e830: 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e 74 20 73 71  START..*/.int sq
e840: 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
e850: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
e860: 20 69 44 62 2c 20 69 6e 74 20 65 4d 6f 64 65 2c   iDb, int eMode,
e870: 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 69 6e 74   int *pnLog, int
e880: 20 2a 70 6e 43 6b 70 74 29 7b 0a 20 20 69 6e 74   *pnCkpt){.  int
e890: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
e8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e8b0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
e8c0: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
e8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e8e0: 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65 72   /* Used to iter
e8f0: 61 74 65 20 74 68 72 6f 75 67 68 20 61 74 74 61  ate through atta
e900: 63 68 65 64 20 64 62 73 20 2a 2f 0a 20 20 69 6e  ched dbs */.  in
e910: 74 20 62 42 75 73 79 20 3d 20 30 3b 20 20 20 20  t bBusy = 0;    
e920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
e930: 20 54 72 75 65 20 69 66 20 53 51 4c 49 54 45 5f   True if SQLITE_
e940: 42 55 53 59 20 68 61 73 20 62 65 65 6e 20 65 6e  BUSY has been en
e950: 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 0a 20 20  countered */..  
e960: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f  assert( sqlite3_
e970: 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d  mutex_held(db->m
e980: 75 74 65 78 29 20 29 3b 0a 20 20 61 73 73 65 72  utex) );.  asser
e990: 74 28 20 21 70 6e 4c 6f 67 20 7c 7c 20 2a 70 6e  t( !pnLog || *pn
e9a0: 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20 20 61 73 73  Log==-1 );.  ass
e9b0: 65 72 74 28 20 21 70 6e 43 6b 70 74 20 7c 7c 20  ert( !pnCkpt || 
e9c0: 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20 29 3b 0a 0a  *pnCkpt==-1 );..
e9d0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d    for(i=0; i<db-
e9e0: 3e 6e 44 62 20 26 26 20 72 63 3d 3d 53 51 4c 49  >nDb && rc==SQLI
e9f0: 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
ea00: 20 69 66 28 20 69 3d 3d 69 44 62 20 7c 7c 20 69   if( i==iDb || i
ea10: 44 62 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 41  Db==SQLITE_MAX_A
ea20: 54 54 41 43 48 45 44 20 29 7b 0a 20 20 20 20 20  TTACHED ){.     
ea30: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
ea40: 65 65 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2d  eeCheckpoint(db-
ea50: 3e 61 44 62 5b 69 5d 2e 70 42 74 2c 20 65 4d 6f  >aDb[i].pBt, eMo
ea60: 64 65 2c 20 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70  de, pnLog, pnCkp
ea70: 74 29 3b 0a 20 20 20 20 20 20 70 6e 4c 6f 67 20  t);.      pnLog 
ea80: 3d 20 30 3b 0a 20 20 20 20 20 20 70 6e 43 6b 70  = 0;.      pnCkp
ea90: 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28  t = 0;.      if(
eaa0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
eab0: 20 29 7b 0a 20 20 20 20 20 20 20 20 62 42 75 73   ){.        bBus
eac0: 79 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  y = 1;.        r
ead0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
eae0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
eaf0: 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d  ..  return (rc==
eb00: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 62 42 75  SQLITE_OK && bBu
eb10: 73 79 29 20 3f 20 53 51 4c 49 54 45 5f 42 55 53  sy) ? SQLITE_BUS
eb20: 59 20 3a 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  Y : rc;.}.#endif
eb30: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
eb40: 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  WAL */../*.** Th
eb50: 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
eb60: 72 6e 73 20 74 72 75 65 20 69 66 20 6d 61 69 6e  rns true if main
eb70: 2d 6d 65 6d 6f 72 79 20 73 68 6f 75 6c 64 20 62  -memory should b
eb80: 65 20 75 73 65 64 20 69 6e 73 74 65 61 64 20 6f  e used instead o
eb90: 66 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79  f.** a temporary
eba0: 20 66 69 6c 65 20 66 6f 72 20 74 72 61 6e 73 69   file for transi
ebb0: 65 6e 74 20 70 61 67 65 72 20 66 69 6c 65 73 20  ent pager files 
ebc0: 61 6e 64 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  and statement jo
ebd0: 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 68 65 20 76  urnals..** The v
ebe0: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 64 65  alue returned de
ebf0: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 76 61 6c  pends on the val
ec00: 75 65 20 6f 66 20 64 62 2d 3e 74 65 6d 70 5f 73  ue of db->temp_s
ec10: 74 6f 72 65 20 28 72 75 6e 74 69 6d 65 0a 2a 2a  tore (runtime.**
ec20: 20 70 61 72 61 6d 65 74 65 72 29 20 61 6e 64 20   parameter) and 
ec30: 74 68 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  the compile time
ec40: 20 76 61 6c 75 65 20 6f 66 20 53 51 4c 49 54 45   value of SQLITE
ec50: 5f 54 45 4d 50 5f 53 54 4f 52 45 2e 20 54 68 65  _TEMP_STORE. The
ec60: 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 61  .** following ta
ec70: 62 6c 65 20 64 65 73 63 72 69 62 65 73 20 74 68  ble describes th
ec80: 65 20 72 65 6c 61 74 69 6f 6e 73 68 69 70 20 62  e relationship b
ec90: 65 74 77 65 65 6e 20 74 68 65 73 65 20 74 77 6f  etween these two
eca0: 20 76 61 6c 75 65 73 0a 2a 2a 20 61 6e 64 20 74   values.** and t
ecb0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 73 20 72 65  his functions re
ecc0: 74 75 72 6e 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a  turn value..**.*
ecd0: 2a 20 20 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  *   SQLITE_TEMP_
ece0: 53 54 4f 52 45 20 20 20 20 20 64 62 2d 3e 74 65  STORE     db->te
ecf0: 6d 70 5f 73 74 6f 72 65 20 20 20 20 20 4c 6f 63  mp_store     Loc
ed00: 61 74 69 6f 6e 20 6f 66 20 74 65 6d 70 6f 72 61  ation of tempora
ed10: 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  ry database.**  
ed20: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
ed30: 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  --     ---------
ed40: 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d 2d  -----     ------
ed50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed60: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20 30 20  --------.**   0 
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ed80: 20 20 20 20 61 6e 79 20 20 20 20 20 20 20 20 20      any         
ed90: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
eda0: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
edb0: 20 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20   1              
edc0: 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20 20         1        
edd0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 20            file  
ede0: 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a      (return 0).*
edf0: 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20  *   1           
ee00: 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20 20            2     
ee10: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
ee20: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
ee30: 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20  ).**   1        
ee40: 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20 20               0  
ee50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee60: 66 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72  file      (retur
ee70: 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20 20 20 20  n 0).**   2     
ee80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ee90: 31 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1               
eea0: 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65     file      (re
eeb0: 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20 20  turn 0).**   2  
eec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eed0: 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20     2            
eee0: 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20        memory    
eef0: 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20  (return 1).**   
ef00: 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  2               
ef10: 20 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20        0         
ef20: 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20           memory 
ef30: 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a 2a     (return 1).**
ef40: 20 20 20 33 20 20 20 20 20 20 20 20 20 20 20 20     3            
ef50: 20 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20           any    
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f              memo
ef70: 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31 29  ry    (return 1)
ef80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 54  .*/.int sqlite3T
ef90: 65 6d 70 49 6e 4d 65 6d 6f 72 79 28 63 6f 6e 73  empInMemory(cons
efa0: 74 20 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  t sqlite3 *db){.
efb0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
efc0: 53 54 4f 52 45 3d 3d 31 0a 20 20 72 65 74 75 72  STORE==1.  retur
efd0: 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
efe0: 72 65 3d 3d 32 20 29 3b 0a 23 65 6e 64 69 66 0a  re==2 );.#endif.
eff0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
f000: 53 54 4f 52 45 3d 3d 32 0a 20 20 72 65 74 75 72  STORE==2.  retur
f010: 6e 20 28 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f  n ( db->temp_sto
f020: 72 65 21 3d 31 20 29 3b 0a 23 65 6e 64 69 66 0a  re!=1 );.#endif.
f030: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
f040: 53 54 4f 52 45 3d 3d 33 0a 20 20 72 65 74 75 72  STORE==3.  retur
f050: 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  n 1;.#endif.#if 
f060: 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52  SQLITE_TEMP_STOR
f070: 45 3c 31 20 7c 7c 20 53 51 4c 49 54 45 5f 54 45  E<1 || SQLITE_TE
f080: 4d 50 5f 53 54 4f 52 45 3e 33 0a 20 20 72 65 74  MP_STORE>3.  ret
f090: 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 0;.#endif.}.
f0a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54  ./*.** Return UT
f0b0: 46 2d 38 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c  F-8 encoded Engl
f0c0: 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70  ish language exp
f0d0: 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  lanation of the 
f0e0: 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65  most recent.** e
f0f0: 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  rror..*/.const c
f100: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72  har *sqlite3_err
f110: 6d 73 67 28 73 71 6c 69 74 65 33 20 2a 64 62 29  msg(sqlite3 *db)
f120: 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
f130: 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a  z;.  if( !db ){.
f140: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
f150: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
f160: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a 20 20 69 66  NOMEM);.  }.  if
f170: 28 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  ( !sqlite3Safety
f180: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
f190: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
f1a0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51  sqlite3ErrStr(SQ
f1b0: 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54  LITE_MISUSE_BKPT
f1c0: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
f1d0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
f1e0: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
f1f0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f200: 29 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  ){.    z = sqlit
f210: 65 33 45 72 72 53 74 72 28 53 51 4c 49 54 45 5f  e3ErrStr(SQLITE_
f220: 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65 6c 73 65 7b  NOMEM);.  }else{
f230: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 64  .    testcase( d
f240: 62 2d 3e 70 45 72 72 3d 3d 30 20 29 3b 0a 20 20  b->pErr==0 );.  
f250: 20 20 7a 20 3d 20 28 63 68 61 72 2a 29 73 71 6c    z = (char*)sql
f260: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
f270: 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 61  db->pErr);.    a
f280: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
f290: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
f2a0: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
f2b0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 45 72 72    z = sqlite3Err
f2c0: 53 74 72 28 64 62 2d 3e 65 72 72 43 6f 64 65 29  Str(db->errCode)
f2d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  ;.    }.  }.  sq
f2e0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
f2f0: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
f300: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 0a 23 69 66  return z;.}..#if
f310: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
f320: 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 74  _UTF16./*.** Ret
f330: 75 72 6e 20 55 54 46 2d 31 36 20 65 6e 63 6f 64  urn UTF-16 encod
f340: 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75  ed English langu
f350: 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20  age explanation 
f360: 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  of the most rece
f370: 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a  nt.** error..*/.
f380: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 73 71 6c 69  const void *sqli
f390: 74 65 33 5f 65 72 72 6d 73 67 31 36 28 73 71 6c  te3_errmsg16(sql
f3a0: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 73 74 61  ite3 *db){.  sta
f3b0: 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20 6f 75  tic const u16 ou
f3c0: 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b 0a 20 20 20  tOfMem[] = {.   
f3d0: 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20   'o', 'u', 't', 
f3e0: 27 20 27 2c 20 27 6f 27 2c 20 27 66 27 2c 20 27  ' ', 'o', 'f', '
f3f0: 20 27 2c 20 27 6d 27 2c 20 27 65 27 2c 20 27 6d   ', 'm', 'e', 'm
f400: 27 2c 20 27 6f 27 2c 20 27 72 27 2c 20 27 79 27  ', 'o', 'r', 'y'
f410: 2c 20 30 0a 20 20 7d 3b 0a 20 20 73 74 61 74 69  , 0.  };.  stati
f420: 63 20 63 6f 6e 73 74 20 75 31 36 20 6d 69 73 75  c const u16 misu
f430: 73 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6c 27  se[] = {.    'l'
f440: 2c 20 27 69 27 2c 20 27 62 27 2c 20 27 72 27 2c  , 'i', 'b', 'r',
f450: 20 27 61 27 2c 20 27 72 27 2c 20 27 79 27 2c 20   'a', 'r', 'y', 
f460: 27 20 27 2c 20 0a 20 20 20 20 27 72 27 2c 20 27  ' ', .    'r', '
f470: 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 69  o', 'u', 't', 'i
f480: 27 2c 20 27 6e 27 2c 20 27 65 27 2c 20 27 20 27  ', 'n', 'e', ' '
f490: 2c 20 0a 20 20 20 20 27 63 27 2c 20 27 61 27 2c  , .    'c', 'a',
f4a0: 20 27 6c 27 2c 20 27 6c 27 2c 20 27 65 27 2c 20   'l', 'l', 'e', 
f4b0: 27 64 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'd', ' ', .    '
f4c0: 6f 27 2c 20 27 75 27 2c 20 27 74 27 2c 20 27 20  o', 'u', 't', ' 
f4d0: 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 66 27  ', .    'o', 'f'
f4e0: 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 73 27 2c  , ' ', .    's',
f4f0: 20 27 65 27 2c 20 27 71 27 2c 20 27 75 27 2c 20   'e', 'q', 'u', 
f500: 27 65 27 2c 20 27 6e 27 2c 20 27 63 27 2c 20 27  'e', 'n', 'c', '
f510: 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a 20 20 63 6f  e', 0.  };..  co
f520: 6e 73 74 20 76 6f 69 64 20 2a 7a 3b 0a 20 20 69  nst void *z;.  i
f530: 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65  f( !db ){.    re
f540: 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6f 75 74  turn (void *)out
f550: 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20 20 69 66 28  OfMem;.  }.  if(
f560: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
f570: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
f580: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28   ){.    return (
f590: 76 6f 69 64 20 2a 29 6d 69 73 75 73 65 3b 0a 20  void *)misuse;. 
f5a0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
f5b0: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
f5c0: 65 78 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d  ex);.  if( db->m
f5d0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
f5e0: 20 20 20 7a 20 3d 20 28 76 6f 69 64 20 2a 29 6f     z = (void *)o
f5f0: 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 65 6c 73 65  utOfMem;.  }else
f600: 7b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  {.    z = sqlite
f610: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64  3_value_text16(d
f620: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 69 66  b->pErr);.    if
f630: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
f640: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
f650: 20 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71   db->errCode, sq
f660: 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
f670: 65 72 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20  errCode));.     
f680: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
f690: 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
f6a0: 72 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f  rr);.    }.    /
f6b0: 2a 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79  * A malloc() may
f6c0: 20 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74   have failed wit
f6d0: 68 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20  hin the call to 
f6e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
f6f0: 78 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62  xt16().    ** ab
f700: 6f 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20  ove. If this is 
f710: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
f720: 68 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  he db->mallocFai
f730: 6c 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74  led flag needs t
f740: 6f 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61  o.    ** be clea
f750: 72 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72  red before retur
f760: 6e 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69  ning. Do this di
f770: 72 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20  rectly, instead 
f780: 6f 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71  of via.    ** sq
f790: 6c 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20  lite3ApiExit(), 
f7a0: 74 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67  to avoid setting
f7b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
f7c0: 6e 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61  ndle error messa
f7d0: 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64  ge..    */.    d
f7e0: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f7f0: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
f800: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
f810: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
f820: 75 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20  urn z;.}.#endif 
f830: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  /* SQLITE_OMIT_U
f840: 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52  TF16 */../*.** R
f850: 65 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72  eturn the most r
f860: 65 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65  ecent error code
f870: 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e   generated by an
f880: 20 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e   SQLite routine.
f890: 20 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70   If NULL is.** p
f8a0: 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
f8b0: 6e 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d  nction, we assum
f8c0: 65 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69  e a malloc() fai
f8d0: 6c 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74  led during sqlit
f8e0: 65 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e  e3_open()..*/.in
f8f0: 74 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  t sqlite3_errcod
f900: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
f910: 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c    if( db && !sql
f920: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
f930: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
f940: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
f950: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
f960: 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64  }.  if( !db || d
f970: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f980: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
f990: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
f9a0: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72    return db->err
f9b0: 43 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61  Code & db->errMa
f9c0: 73 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  sk;.}.int sqlite
f9d0: 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
f9e0: 64 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  de(sqlite3 *db){
f9f0: 0a 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71  .  if( db && !sq
fa00: 6c 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b  lite3SafetyCheck
fa10: 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a  SickOrOk(db) ){.
fa20: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
fa30: 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20  E_MISUSE_BKPT;. 
fa40: 20 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20   }.  if( !db || 
fa50: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
fa60: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
fa70: 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
fa80: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72  .  return db->er
fa90: 72 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rCode;.}../*.** 
faa0: 52 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20  Return a string 
fab0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
fac0: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
fad0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
fae0: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20  e.** argument.  
faf0: 46 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20 73 69  For now, this si
fb00: 6d 70 6c 79 20 63 61 6c 6c 73 20 74 68 65 20 69  mply calls the i
fb10: 6e 74 65 72 6e 61 6c 20 73 71 6c 69 74 65 33 45  nternal sqlite3E
fb20: 72 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74  rrStr().** funct
fb30: 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ion..*/.const ch
fb40: 61 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 73  ar *sqlite3_errs
fb50: 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 72 65  tr(int rc){.  re
fb60: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53  turn sqlite3ErrS
fb70: 74 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  tr(rc);.}../*.**
fb80: 20 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20   Invalidate all 
fb90: 63 61 63 68 65 64 20 4b 65 79 49 6e 66 6f 20 6f  cached KeyInfo o
fba0: 62 6a 65 63 74 73 20 66 6f 72 20 64 61 74 61 62  bjects for datab
fbb0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22  ase connection "
fbc0: 64 62 22 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  db".*/.static vo
fbd0: 69 64 20 69 6e 76 61 6c 69 64 61 74 65 43 61 63  id invalidateCac
fbe0: 68 65 64 4b 65 79 49 6e 66 6f 28 73 71 6c 69 74  hedKeyInfo(sqlit
fbf0: 65 33 20 2a 64 62 29 7b 0a 20 20 44 62 20 2a 70  e3 *db){.  Db *p
fc00: 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Db;             
fc10: 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67         /* A sing
fc20: 6c 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  le database */. 
fc30: 20 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20   int iDb;       
fc40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fc50: 54 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64  The database ind
fc60: 65 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 48  ex number */.  H
fc70: 61 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20  ashElem *k;     
fc80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
fc90: 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74  r looping over t
fca0: 61 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a  ables in pDb */.
fcb0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20    Table *pTab;  
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fcd0: 20 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20   A table in the 
fce0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e  database */.  In
fcf0: 64 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20  dex *pIdx;      
fd00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63            /* Eac
fd10: 68 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 66 6f  h index */..  fo
fd20: 72 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d  r(iDb=0, pDb=db-
fd30: 3e 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44  >aDb; iDb<db->nD
fd40: 62 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29  b; iDb++, pDb++)
fd50: 7b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  {.    if( pDb->p
fd60: 42 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  Bt==0 ) continue
fd70: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72  ;.    sqlite3Btr
fd80: 65 65 45 6e 74 65 72 28 70 44 62 2d 3e 70 42 74  eeEnter(pDb->pBt
fd90: 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c  );.    for(k=sql
fda0: 69 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44  iteHashFirst(&pD
fdb0: 62 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48  b->pSchema->tblH
fdc0: 61 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69  ash);  k; k=sqli
fdd0: 74 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a  teHashNext(k)){.
fde0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61        pTab = (Ta
fdf0: 62 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44  ble*)sqliteHashD
fe00: 61 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 66 6f  ata(k);.      fo
fe10: 72 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e  r(pIdx=pTab->pIn
fe20: 64 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d  dex; pIdx; pIdx=
fe30: 70 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  pIdx->pNext){.  
fe40: 20 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e        if( pIdx->
fe50: 70 4b 65 79 49 6e 66 6f 20 26 26 20 70 49 64 78  pKeyInfo && pIdx
fe60: 2d 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d  ->pKeyInfo->db==
fe70: 64 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  db ){.          
fe80: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e  sqlite3KeyInfoUn
fe90: 72 65 66 28 70 49 64 78 2d 3e 70 4b 65 79 49 6e  ref(pIdx->pKeyIn
fea0: 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  fo);.          p
feb0: 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20  Idx->pKeyInfo = 
fec0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
fed0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
fee0: 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
fef0: 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a  (pDb->pBt);.  }.
ff00: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
ff10: 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20  a new collating 
ff20: 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74  function for dat
ff30: 61 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65  abase "db".  The
ff40: 20 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a   name is zName.*
ff50: 2a 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69  * and the encodi
ff60: 6e 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74  ng is enc..*/.st
ff70: 61 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43  atic int createC
ff80: 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69  ollation(.  sqli
ff90: 74 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74  te3* db,.  const
ffa0: 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20   char *zName, . 
ffb0: 20 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a   u8 enc,.  void*
ffc0: 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
ffd0: 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
ffe0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
fff0: 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
10000 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
10010 69 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65  id*).){.  CollSe
10020 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20  q *pColl;.  int 
10030 65 6e 63 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d  enc2;.  int nNam
10040 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
10050 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20  n30(zName);.  . 
10060 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
10070 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
10080 6d 75 74 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20  mutex) );..  /* 
10090 49 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20  If SQLITE_UTF16 
100a0 69 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20  is specified as 
100b0 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70  the encoding typ
100c0 65 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69  e, transform thi
100d0 73 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66  s.  ** to one of
100e0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20   SQLITE_UTF16LE 
100f0 6f 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42  or SQLITE_UTF16B
10100 45 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a  E using the.  **
10110 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
10120 49 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54  IVE macro. SQLIT
10130 45 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75  E_UTF16 is not u
10140 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a  sed internally..
10150 20 20 2a 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e    */.  enc2 = en
10160 63 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65  c;.  testcase( e
10170 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  nc2==SQLITE_UTF1
10180 36 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  6 );.  testcase(
10190 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54   enc2==SQLITE_UT
101a0 46 31 36 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20  F16_ALIGNED );. 
101b0 20 69 66 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54   if( enc2==SQLIT
101c0 45 5f 55 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d  E_UTF16 || enc2=
101d0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c  =SQLITE_UTF16_AL
101e0 49 47 4e 45 44 20 29 7b 0a 20 20 20 20 65 6e 63  IGNED ){.    enc
101f0 32 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31 36  2 = SQLITE_UTF16
10200 4e 41 54 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66  NATIVE;.  }.  if
10210 28 20 65 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54  ( enc2<SQLITE_UT
10220 46 38 20 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54  F8 || enc2>SQLIT
10230 45 5f 55 54 46 31 36 42 45 20 29 7b 0a 20 20 20  E_UTF16BE ){.   
10240 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d   return SQLITE_M
10250 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a  ISUSE_BKPT;.  }.
10260 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74  .  /* Check if t
10270 68 69 73 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f  his call is remo
10280 76 69 6e 67 20 6f 72 20 72 65 70 6c 61 63 69 6e  ving or replacin
10290 67 20 61 6e 20 65 78 69 73 74 69 6e 67 20 63 6f  g an existing co
102a0 6c 6c 61 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65  llation .  ** se
102b0 71 75 65 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61  quence. If so, a
102c0 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 63 74  nd there are act
102d0 69 76 65 20 56 4d 73 2c 20 72 65 74 75 72 6e 20  ive VMs, return 
102e0 62 75 73 79 2e 20 49 66 20 74 68 65 72 65 0a 20  busy. If there. 
102f0 20 2a 2a 20 61 72 65 20 6e 6f 20 61 63 74 69 76   ** are no activ
10300 65 20 56 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74  e VMs, invalidat
10310 65 20 61 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c  e any pre-compil
10320 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  ed statements.. 
10330 20 2a 2f 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   */.  pColl = sq
10340 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
10350 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
10360 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 69 66 28 20  Name, 0);.  if( 
10370 70 43 6f 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e  pColl && pColl->
10380 78 43 6d 70 20 29 7b 0a 20 20 20 20 69 66 28 20  xCmp ){.    if( 
10390 64 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20  db->nVdbeActive 
103a0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
103b0 45 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45  Error(db, SQLITE
103c0 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
103d0 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74  "unable to delet
103e0 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69  e/modify collati
103f0 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20  on sequence due 
10400 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
10410 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65  ents");.      re
10420 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
10430 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10440 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
10450 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
10460 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43  .    invalidateC
10470 61 63 68 65 64 4b 65 79 49 6e 66 6f 28 64 62 29  achedKeyInfo(db)
10480 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c  ;..    /* If col
10490 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
104a0 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65  pColl was create
104b0 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 61 20  d directly by a 
104c0 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
104d0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
104e0 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74  llation, and not
104f0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73 79   generated by sy
10500 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20  nthCollSeq(),.  
10510 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f    ** then any co
10520 70 69 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e  pies made by syn
10530 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64  thCollSeq() need
10540 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74   to be invalidat
10550 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c  ed..    ** Also,
10560 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72   collation destr
10570 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e  uctor - CollSeq.
10580 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f  xDel() - functio
10590 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a  n may need.    *
105a0 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a  * to be called..
105b0 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20      */ .    if( 
105c0 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53  (pColl->enc & ~S
105d0 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
105e0 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20  NED)==enc2 ){.  
105f0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f      CollSeq *aCo
10600 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ll = sqlite3Hash
10610 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  Find(&db->aCollS
10620 65 71 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  eq, zName, nName
10630 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  );.      int j;.
10640 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
10650 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
10660 20 20 43 6f 6c 6c 53 65 71 20 2a 70 20 3d 20 26    CollSeq *p = &
10670 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20  aColl[j];.      
10680 20 20 69 66 28 20 70 2d 3e 65 6e 63 3d 3d 70 43    if( p->enc==pC
10690 6f 6c 6c 2d 3e 65 6e 63 20 29 7b 0a 20 20 20 20  oll->enc ){.    
106a0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 78 44 65        if( p->xDe
106b0 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l ){.           
106c0 20 70 2d 3e 78 44 65 6c 28 70 2d 3e 70 55 73 65   p->xDel(p->pUse
106d0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
106e0 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 43 6d            p->xCm
106f0 70 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  p = 0;.        }
10700 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
10710 20 7d 0a 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71   }..  pColl = sq
10720 6c 69 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71  lite3FindCollSeq
10730 28 64 62 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a  (db, (u8)enc2, z
10740 4e 61 6d 65 2c 20 31 29 3b 0a 20 20 69 66 28 20  Name, 1);.  if( 
10750 70 43 6f 6c 6c 3d 3d 30 20 29 20 72 65 74 75 72  pColl==0 ) retur
10760 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
10770 20 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20    pColl->xCmp = 
10780 78 43 6f 6d 70 61 72 65 3b 0a 20 20 70 43 6f 6c  xCompare;.  pCol
10790 6c 2d 3e 70 55 73 65 72 20 3d 20 70 43 74 78 3b  l->pUser = pCtx;
107a0 0a 20 20 70 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d  .  pColl->xDel =
107b0 20 78 44 65 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e   xDel;.  pColl->
107c0 65 6e 63 20 3d 20 28 75 38 29 28 65 6e 63 32 20  enc = (u8)(enc2 
107d0 7c 20 28 65 6e 63 20 26 20 53 51 4c 49 54 45 5f  | (enc & SQLITE_
107e0 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29 29 3b  UTF16_ALIGNED));
107f0 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28  .  sqlite3Error(
10800 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30  db, SQLITE_OK, 0
10810 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
10820 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  TE_OK;.}.../*.**
10830 20 54 68 69 73 20 61 72 72 61 79 20 64 65 66 69   This array defi
10840 6e 65 73 20 68 61 72 64 20 75 70 70 65 72 20 62  nes hard upper b
10850 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74 20 76  ounds on limit v
10860 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a 20 69  alues.  The.** i
10870 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73 74 20  nitializer must 
10880 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e 63 20  be kept in sync 
10890 77 69 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f  with the SQLITE_
108a0 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65 66 69  LIMIT_*.** #defi
108b0 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33 2e 68  nes in sqlite3.h
108c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
108d0 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d 69 74  t int aHardLimit
108e0 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54 45 5f  [] = {.  SQLITE_
108f0 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51  MAX_LENGTH,.  SQ
10900 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
10910 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  GTH,.  SQLITE_MA
10920 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49  X_COLUMN,.  SQLI
10930 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
10940 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  H,.  SQLITE_MAX_
10950 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 2c  COMPOUND_SELECT,
10960 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44  .  SQLITE_MAX_VD
10970 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54 45 5f  BE_OP,.  SQLITE_
10980 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
10990 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  ,.  SQLITE_MAX_A
109a0 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c 49 54  TTACHED,.  SQLIT
109b0 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
109c0 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  RN_LENGTH,.  SQL
109d0 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
109e0 5f 4e 55 4d 42 45 52 2c 0a 20 20 53 51 4c 49 54  _NUMBER,.  SQLIT
109f0 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
10a00 50 54 48 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d  PTH,.};../*.** M
10a10 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61 72  ake sure the har
10a20 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65 74  d limits are set
10a30 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20 76   to reasonable v
10a40 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c  alues.*/.#if SQL
10a50 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31  ITE_MAX_LENGTH<1
10a60 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
10a70 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73  E_MAX_LENGTH mus
10a80 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31 30  t be at least 10
10a90 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  0.#endif.#if SQL
10aa0 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
10ab0 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20 53  TH<100.# error S
10ac0 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45  QLITE_MAX_SQL_LE
10ad0 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74 20  NGTH must be at 
10ae0 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69 66  least 100.#endif
10af0 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
10b00 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54  SQL_LENGTH>SQLIT
10b10 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65  E_MAX_LENGTH.# e
10b20 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
10b30 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20  SQL_LENGTH must 
10b40 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20 74  not be greater t
10b50 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  han SQLITE_MAX_L
10b60 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69 66  ENGTH.#endif.#if
10b70 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
10b80 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20  OUND_SELECT<2.# 
10b90 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
10ba0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
10bb0 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
10bc0 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  t 2.#endif.#if S
10bd0 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
10be0 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  P<40.# error SQL
10bf0 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20  ITE_MAX_VDBE_OP 
10c00 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
10c10 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   40.#endif.#if S
10c20 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
10c30 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49  ON_ARG<0 || SQLI
10c40 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
10c50 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f 72  ARG>1000.# error
10c60 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43   SQLITE_MAX_FUNC
10c70 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62 65  TION_ARG must be
10c80 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31   between 0 and 1
10c90 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53  000.#endif.#if S
10ca0 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
10cb0 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  ED<0 || SQLITE_M
10cc0 41 58 5f 41 54 54 41 43 48 45 44 3e 36 32 0a 23  AX_ATTACHED>62.#
10cd0 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
10ce0 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73 74 20  X_ATTACHED must 
10cf0 62 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64  be between 0 and
10d00 20 36 32 0a 23 65 6e 64 69 66 0a 23 69 66 20 53   62.#endif.#if S
10d10 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50  QLITE_MAX_LIKE_P
10d20 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a  ATTERN_LENGTH<1.
10d30 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
10d40 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  AX_LIKE_PATTERN_
10d50 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61  LENGTH must be a
10d60 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66  t least 1.#endif
10d70 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
10d80 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65  COLUMN>32767.# e
10d90 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
10da0 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20  COLUMN must not 
10db0 65 78 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e  exceed 32767.#en
10dc0 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
10dd0 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  AX_TRIGGER_DEPTH
10de0 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <1.# error SQLIT
10df0 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
10e00 50 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c  PTH must be at l
10e10 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 0a 0a  east 1.#endif...
10e20 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
10e30 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d 69   value of a limi
10e40 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20 6f  t.  Report the o
10e50 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66 20  ld value..** If 
10e60 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69 74  an invalid limit
10e70 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c 69   index is suppli
10e80 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a 2a  ed, report -1..*
10e90 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65  * Make no change
10ea0 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70 6f  s but still repo
10eb0 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75 65  rt the old value
10ec0 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20 6c   if the.** new l
10ed0 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76 65  imit is negative
10ee0 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f  ..**.** A new lo
10ef0 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20 6e  wer limit does n
10f00 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74 69  ot shrink existi
10f10 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a 2a  ng constructs..*
10f20 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65 76  * It merely prev
10f30 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72 75  ents new constru
10f40 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64 20  cts that exceed 
10f50 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f  the limit.** fro
10f60 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e  m forming..*/.in
10f70 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28  t sqlite3_limit(
10f80 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
10f90 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e 65   limitId, int ne
10fa0 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20 6f  wLimit){.  int o
10fb0 6c 64 4c 69 6d 69 74 3b 0a 0a 0a 20 20 2f 2a 20  ldLimit;...  /* 
10fc0 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33  EVIDENCE-OF: R-3
10fd0 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20 65  0189-54097 For e
10fe0 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67 6f  ach limit catego
10ff0 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  ry SQLITE_LIMIT_
11000 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65 20  NAME.  ** there 
11010 69 73 20 61 20 68 61 72 64 20 75 70 70 65 72 20  is a hard upper 
11020 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f 6d  bound set at com
11030 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20 43  pile-time by a C
11040 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20 20   preprocessor.  
11050 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64 20  ** macro called 
11060 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e  SQLITE_MAX_NAME.
11070 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22 20   (The "_LIMIT_" 
11080 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20 63  in the name is c
11090 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20 22  hanged to.  ** "
110a0 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20  _MAX_".).  */.  
110b0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
110c0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
110d0 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  LENGTH]==SQLITE_
110e0 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20  MAX_LENGTH );.  
110f0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
11100 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
11110 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c  SQL_LENGTH]==SQL
11120 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47  ITE_MAX_SQL_LENG
11130 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
11140 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
11150 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d  E_LIMIT_COLUMN]=
11160 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55  =SQLITE_MAX_COLU
11170 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  MN );.  assert( 
11180 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
11190 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50  E_LIMIT_EXPR_DEP
111a0 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
111b0 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20 20  EXPR_DEPTH );.  
111c0 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
111d0 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
111e0 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 5d  COMPOUND_SELECT]
111f0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  ==SQLITE_MAX_COM
11200 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a 20  POUND_SELECT);. 
11210 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
11220 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
11230 5f 56 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54  _VDBE_OP]==SQLIT
11240 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29 3b  E_MAX_VDBE_OP );
11250 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
11260 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
11270 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 5d  IT_FUNCTION_ARG]
11280 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  ==SQLITE_MAX_FUN
11290 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20 61  CTION_ARG );.  a
112a0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
112b0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41  t[SQLITE_LIMIT_A
112c0 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54 45  TTACHED]==SQLITE
112d0 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29 3b  _MAX_ATTACHED );
112e0 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
112f0 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
11300 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f  IT_LIKE_PATTERN_
11310 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20 20  LENGTH]==.      
11320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11340 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
11350 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MAX_LIKE_PATTERN
11360 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
11370 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
11380 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
11390 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53  IABLE_NUMBER]==S
113a0 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
113b0 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61 73  LE_NUMBER);.  as
113c0 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
113d0 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52  [SQLITE_LIMIT_TR
113e0 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53 51  IGGER_DEPTH]==SQ
113f0 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
11400 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
11410 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  rt( SQLITE_LIMIT
11420 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3d 3d  _TRIGGER_DEPTH==
11430 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d  (SQLITE_N_LIMIT-
11440 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20 6c 69  1) );...  if( li
11450 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d 69 74  mitId<0 || limit
11460 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d  Id>=SQLITE_N_LIM
11470 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  IT ){.    return
11480 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69   -1;.  }.  oldLi
11490 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d 69 74  mit = db->aLimit
114a0 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69 66 28  [limitId];.  if(
114b0 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29 7b 20   newLimit>=0 ){ 
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114d0 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32 34 37    /* IMP: R-5247
114e0 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20 20 69  6-28732 */.    i
114f0 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48 61 72  f( newLimit>aHar
11500 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20  dLimit[limitId] 
11510 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69 6d 69  ){.      newLimi
11520 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74 5b 6c  t = aHardLimit[l
11530 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49 4d 50  imitId];  /* IMP
11540 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33 34 20  : R-51463-25634 
11550 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 62 2d  */.    }.    db-
11560 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d  >aLimit[limitId]
11570 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20 20 7d   = newLimit;.  }
11580 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c 69 6d  .  return oldLim
11590 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  it;             
115a0 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
115b0 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20 2a 2f  R-53341-35419 */
115c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
115d0 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20  unction is used 
115e0 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20 55 52  to parse both UR
115f0 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49 20 66  Is and non-URI f
11600 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65 64 20  ilenames passed 
11610 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72 20 74  by the.** user t
11620 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e 73 20  o API functions 
11630 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 20 6f  sqlite3_open() o
11640 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  r sqlite3_open_v
11650 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64 61 74  2(), and for dat
11660 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20 73 70  abase.** URIs sp
11670 65 63 69 66 69 65 64 20 61 73 20 70 61 72 74 20  ecified as part 
11680 6f 66 20 41 54 54 41 43 48 20 73 74 61 74 65 6d  of ATTACH statem
11690 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ents..**.** The 
116a0 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74  first argument t
116b0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  o this function 
116c0 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
116d0 68 65 20 56 46 53 20 74 6f 20 75 73 65 20 28 6f  he VFS to use (o
116e0 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f 20 73  r.** a NULL to s
116f0 69 67 6e 69 66 79 20 74 68 65 20 64 65 66 61 75  ignify the defau
11700 6c 74 20 56 46 53 29 20 69 66 20 74 68 65 20 55  lt VFS) if the U
11710 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  RI does not cont
11720 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78 22 0a  ain a "vfs=xxx".
11730 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ** query paramet
11740 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64 20 61  er. The second a
11750 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 73  rgument contains
11760 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e 6f 6e   the URI (or non
11770 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29 0a 2a  -URI filename).*
11780 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e 20 74  * itself. When t
11790 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
117a0 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46 6c 61  called the *pFla
117b0 67 73 20 76 61 72 69 61 62 6c 65 20 73 68 6f 75  gs variable shou
117c0 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68  ld contain.** th
117d0 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67 73 20  e default flags 
117e0 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
117f0 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69 74 68  base handle with
11800 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74 6f 72  . The value stor
11810 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73  ed in.** *pFlags
11820 20 6d 61 79 20 62 65 20 75 70 64 61 74 65 64 20   may be updated 
11830 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
11840 20 69 66 20 74 68 65 20 55 52 49 20 66 69 6c 65   if the URI file
11850 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20 0a 2a  name contains .*
11860 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20 6f 72  * "cache=xxx" or
11870 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75 65 72   "mode=xxx" quer
11880 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 2a 2a  y parameters..**
11890 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75  .** If successfu
118a0 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  l, SQLITE_OK is 
118b0 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74 68 69  returned. In thi
118c0 73 20 63 61 73 65 20 2a 70 70 56 66 73 20 69 73  s case *ppVfs is
118d0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
118e0 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68 61 74  .** the VFS that
118f0 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
11900 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
11910 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a 46 69  base file. *pzFi
11920 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20  le is set to.** 
11930 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
11940 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  r containing the
11950 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c   name of the fil
11960 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20 69 73  e to open. It is
11970 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f 6e 73   the .** respons
11980 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20 63  ibility of the c
11990 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
119a0 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  lly call sqlite3
119b0 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c 65 61  _free() to relea
119c0 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  se.** this buffe
119d0 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65  r..**.** If an e
119e0 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
119f0 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f  n an SQLite erro
11a00 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
11a10 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d 73 67  ed and *pzErrMsg
11a20 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74 20 74  .** may be set t
11a30 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  o point to a buf
11a40 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61  fer containing a
11a50 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
11a60 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d 65 73  ge error .** mes
11a70 73 61 67 65 2e 20 49 74 20 69 73 20 74 68 65 20  sage. It is the 
11a80 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
11a90 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20  f the caller to 
11aa0 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c 65 61  eventually relea
11ab0 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66 66 65  se.** this buffe
11ac0 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c  r by calling sql
11ad0 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
11ae0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72 73 65  int sqlite3Parse
11af0 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  Uri(.  const cha
11b00 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73 2c 20  r *zDefaultVfs, 
11b10 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20 74 6f         /* VFS to
11b20 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66 73 3d   use if no "vfs=
11b30 78 78 78 22 20 71 75 65 72 79 20 6f 70 74 69 6f  xxx" query optio
11b40 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  n */.  const cha
11b50 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20 20 20  r *zUri,        
11b60 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d 74 65         /* Nul-te
11b70 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74 6f 20  rminated URI to 
11b80 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73 69 67  parse */.  unsig
11b90 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67 73 2c  ned int *pFlags,
11ba0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4e             /* IN
11bb0 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f 50 45  /OUT: SQLITE_OPE
11bc0 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f 0a 20  N_XXX flags */. 
11bd0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 2a 70   sqlite3_vfs **p
11be0 70 56 66 73 2c 20 20 20 20 20 20 20 20 20 20 20  pVfs,           
11bf0 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74 6f 20   /* OUT: VFS to 
11c00 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72 20 2a  use */ .  char *
11c10 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20 20 20  *pzFile,        
11c20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
11c30 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f  : Filename compo
11c40 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f 0a 20  nent of URI */. 
11c50 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d 73 67   char **pzErrMsg
11c60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c70 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72 20 6d   /* OUT: Error m
11c80 65 73 73 61 67 65 20 28 69 66 20 72 63 21 3d 53  essage (if rc!=S
11c90 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a  QLITE_OK) */.){.
11ca0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
11cb0 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64  E_OK;.  unsigned
11cc0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a 70 46   int flags = *pF
11cd0 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20 63 68  lags;.  const ch
11ce0 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65 66 61  ar *zVfs = zDefa
11cf0 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72 20 2a  ultVfs;.  char *
11d00 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20 63 3b  zFile;.  char c;
11d10 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20 73 71  .  int nUri = sq
11d20 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 55  lite3Strlen30(zU
11d30 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ri);..  assert( 
11d40 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29 3b 0a  *pzErrMsg==0 );.
11d50 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73 20 26  .  if( ((flags &
11d60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49   SQLITE_OPEN_URI
11d70 29 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62  ) || sqlite3Glob
11d80 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e 55 72  alConfig.bOpenUr
11d90 69 29 20 0a 20 20 20 26 26 20 6e 55 72 69 3e 3d  i) .   && nUri>=
11da0 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55 72 69  5 && memcmp(zUri
11db0 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d 3d 30  , "file:", 5)==0
11dc0 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20   .  ){.    char 
11dd0 2a 7a 4f 70 74 3b 0a 20 20 20 20 69 6e 74 20 65  *zOpt;.    int e
11de0 53 74 61 74 65 3b 20 20 20 20 20 20 20 20 20 20  State;          
11df0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
11e00 65 72 20 73 74 61 74 65 20 77 68 65 6e 20 70 61  er state when pa
11e10 72 73 69 6e 67 20 55 52 49 20 2a 2f 0a 20 20 20  rsing URI */.   
11e20 20 69 6e 74 20 69 49 6e 3b 20 20 20 20 20 20 20   int iIn;       
11e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11e40 2a 20 49 6e 70 75 74 20 63 68 61 72 61 63 74 65  * Input characte
11e50 72 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69  r index */.    i
11e60 6e 74 20 69 4f 75 74 20 3d 20 30 3b 20 20 20 20  nt iOut = 0;    
11e70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11e80 4f 75 74 70 75 74 20 63 68 61 72 61 63 74 65 72  Output character
11e90 20 69 6e 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e   index */.    in
11ea0 74 20 6e 42 79 74 65 20 3d 20 6e 55 72 69 2b 32  t nByte = nUri+2
11eb0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42  ;           /* B
11ec0 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 74 6f  ytes of space to
11ed0 20 61 6c 6c 6f 63 61 74 65 20 2a 2f 0a 0a 20 20   allocate */..  
11ee0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
11ef0 68 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55  he SQLITE_OPEN_U
11f00 52 49 20 66 6c 61 67 20 69 73 20 73 65 74 20 74  RI flag is set t
11f10 6f 20 69 6e 64 69 63 61 74 65 20 74 6f 20 74 68  o indicate to th
11f20 65 20 56 46 53 20 78 4f 70 65 6e 20 0a 20 20 20  e VFS xOpen .   
11f30 20 2a 2a 20 6d 65 74 68 6f 64 20 74 68 61 74 20   ** method that 
11f40 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 78 74  there may be ext
11f50 72 61 20 70 61 72 61 6d 65 74 65 72 73 20 66 6f  ra parameters fo
11f60 6c 6c 6f 77 69 6e 67 20 74 68 65 20 66 69 6c 65  llowing the file
11f70 2d 6e 61 6d 65 2e 20 20 2a 2f 0a 20 20 20 20 66  -name.  */.    f
11f80 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f 4f  lags |= SQLITE_O
11f90 50 45 4e 5f 55 52 49 3b 0a 0a 20 20 20 20 66 6f  PEN_URI;..    fo
11fa0 72 28 69 49 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72  r(iIn=0; iIn<nUr
11fb0 69 3b 20 69 49 6e 2b 2b 29 20 6e 42 79 74 65 20  i; iIn++) nByte 
11fc0 2b 3d 20 28 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27  += (zUri[iIn]=='
11fd0 26 27 29 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d  &');.    zFile =
11fe0 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
11ff0 6e 42 79 74 65 29 3b 0a 20 20 20 20 69 66 28 20  nByte);.    if( 
12000 21 7a 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20  !zFile ) return 
12010 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20  SQLITE_NOMEM;.. 
12020 20 20 20 69 49 6e 20 3d 20 35 3b 0a 23 69 66 6e     iIn = 5;.#ifn
12030 64 65 66 20 53 51 4c 49 54 45 5f 41 4c 4c 4f 57  def SQLITE_ALLOW
12040 5f 55 52 49 5f 41 55 54 48 4f 52 49 54 59 0a 20  _URI_AUTHORITY. 
12050 20 20 20 2f 2a 20 44 69 73 63 61 72 64 20 74 68     /* Discard th
12060 65 20 73 63 68 65 6d 65 20 61 6e 64 20 61 75 74  e scheme and aut
12070 68 6f 72 69 74 79 20 73 65 67 6d 65 6e 74 73 20  hority segments 
12080 6f 66 20 74 68 65 20 55 52 49 2e 20 2a 2f 0a 20  of the URI. */. 
12090 20 20 20 69 66 28 20 7a 55 72 69 5b 35 5d 3d 3d     if( zUri[5]==
120a0 27 2f 27 20 26 26 20 7a 55 72 69 5b 36 5d 3d 3d  '/' && zUri[6]==
120b0 27 2f 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e  '/' ){.      iIn
120c0 20 3d 20 37 3b 0a 20 20 20 20 20 20 77 68 69 6c   = 7;.      whil
120d0 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26 20  e( zUri[iIn] && 
120e0 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 2f 27 20 29  zUri[iIn]!='/' )
120f0 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66   iIn++;.      if
12100 28 20 69 49 6e 21 3d 37 20 26 26 20 28 69 49 6e  ( iIn!=7 && (iIn
12110 21 3d 31 36 20 7c 7c 20 6d 65 6d 63 6d 70 28 22  !=16 || memcmp("
12120 6c 6f 63 61 6c 68 6f 73 74 22 2c 20 26 7a 55 72  localhost", &zUr
12130 69 5b 37 5d 2c 20 39 29 29 20 29 7b 0a 20 20 20  i[7], 9)) ){.   
12140 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
12150 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
12160 28 22 69 6e 76 61 6c 69 64 20 75 72 69 20 61 75  ("invalid uri au
12170 74 68 6f 72 69 74 79 3a 20 25 2e 2a 73 22 2c 20  thority: %.*s", 
12180 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e  .            iIn
12190 2d 37 2c 20 26 7a 55 72 69 5b 37 5d 29 3b 0a 20  -7, &zUri[7]);. 
121a0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
121b0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
121c0 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75 72 69    goto parse_uri
121d0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
121e0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
121f0 2f 2a 20 43 6f 70 79 20 74 68 65 20 66 69 6c 65  /* Copy the file
12200 6e 61 6d 65 20 61 6e 64 20 61 6e 79 20 71 75 65  name and any que
12210 72 79 20 70 61 72 61 6d 65 74 65 72 73 20 69 6e  ry parameters in
12220 74 6f 20 74 68 65 20 7a 46 69 6c 65 20 62 75 66  to the zFile buf
12230 66 65 72 2e 20 0a 20 20 20 20 2a 2a 20 44 65 63  fer. .    ** Dec
12240 6f 64 65 20 25 48 48 20 65 73 63 61 70 65 20 63  ode %HH escape c
12250 6f 64 65 73 20 61 6c 6f 6e 67 20 74 68 65 20 77  odes along the w
12260 61 79 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ay. .    **.    
12270 2a 2a 20 57 69 74 68 69 6e 20 74 68 69 73 20 6c  ** Within this l
12280 6f 6f 70 2c 20 76 61 72 69 61 62 6c 65 20 65 53  oop, variable eS
12290 74 61 74 65 20 6d 61 79 20 62 65 20 73 65 74 20  tate may be set 
122a0 74 6f 20 30 2c 20 31 20 6f 72 20 32 2c 20 64 65  to 0, 1 or 2, de
122b0 70 65 6e 64 69 6e 67 0a 20 20 20 20 2a 2a 20 6f  pending.    ** o
122c0 6e 20 74 68 65 20 70 61 72 73 69 6e 67 20 63 6f  n the parsing co
122d0 6e 74 65 78 74 2e 20 41 73 20 66 6f 6c 6c 6f 77  ntext. As follow
122e0 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  s:.    **.    **
122f0 20 20 20 30 3a 20 50 61 72 73 69 6e 67 20 66 69     0: Parsing fi
12300 6c 65 2d 6e 61 6d 65 2e 0a 20 20 20 20 2a 2a 20  le-name..    ** 
12310 20 20 31 3a 20 50 61 72 73 69 6e 67 20 6e 61 6d    1: Parsing nam
12320 65 20 73 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e  e section of a n
12330 61 6d 65 3d 76 61 6c 75 65 20 71 75 65 72 79 20  ame=value query 
12340 70 61 72 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a  parameter..    *
12350 2a 20 20 20 32 3a 20 50 61 72 73 69 6e 67 20 76  *   2: Parsing v
12360 61 6c 75 65 20 73 65 63 74 69 6f 6e 20 6f 66 20  alue section of 
12370 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71 75 65  a name=value que
12380 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 20 20  ry parameter..  
12390 20 20 2a 2f 0a 20 20 20 20 65 53 74 61 74 65 20    */.    eState 
123a0 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
123b0 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21  (c = zUri[iIn])!
123c0 3d 30 20 26 26 20 63 21 3d 27 23 27 20 29 7b 0a  =0 && c!='#' ){.
123d0 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20 20        iIn++;.   
123e0 20 20 20 69 66 28 20 63 3d 3d 27 25 27 20 0a 20     if( c=='%' . 
123f0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
12400 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49  Isxdigit(zUri[iI
12410 6e 5d 29 20 0a 20 20 20 20 20 20 20 26 26 20 73  n]) .       && s
12420 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a  qlite3Isxdigit(z
12430 55 72 69 5b 69 49 6e 2b 31 5d 29 20 0a 20 20 20  Uri[iIn+1]) .   
12440 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e     ){.        in
12450 74 20 6f 63 74 65 74 20 3d 20 28 73 71 6c 69 74  t octet = (sqlit
12460 65 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b  e3HexToInt(zUri[
12470 69 49 6e 2b 2b 5d 29 20 3c 3c 20 34 29 3b 0a 20  iIn++]) << 4);. 
12480 20 20 20 20 20 20 20 6f 63 74 65 74 20 2b 3d 20         octet += 
12490 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28  sqlite3HexToInt(
124a0 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 3b 0a 0a 20  zUri[iIn++]);.. 
124b0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6f         assert( o
124c0 63 74 65 74 3e 3d 30 20 26 26 20 6f 63 74 65 74  ctet>=0 && octet
124d0 3c 32 35 36 20 29 3b 0a 20 20 20 20 20 20 20 20  <256 );.        
124e0 69 66 28 20 6f 63 74 65 74 3d 3d 30 20 29 7b 0a  if( octet==0 ){.
124f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 69            /* Thi
12500 73 20 62 72 61 6e 63 68 20 69 73 20 74 61 6b 65  s branch is take
12510 6e 20 77 68 65 6e 20 22 25 30 30 22 20 61 70 70  n when "%00" app
12520 65 61 72 73 20 77 69 74 68 69 6e 20 74 68 65 20  ears within the 
12530 55 52 49 2e 20 49 6e 20 74 68 69 73 0a 20 20 20  URI. In this.   
12540 20 20 20 20 20 20 20 2a 2a 20 63 61 73 65 20 77         ** case w
12550 65 20 69 67 6e 6f 72 65 20 61 6c 6c 20 74 65 78  e ignore all tex
12560 74 20 69 6e 20 74 68 65 20 72 65 6d 61 69 6e 64  t in the remaind
12570 65 72 20 6f 66 20 74 68 65 20 70 61 74 68 2c 20  er of the path, 
12580 6e 61 6d 65 20 6f 72 0a 20 20 20 20 20 20 20 20  name or.        
12590 20 20 2a 2a 20 76 61 6c 75 65 20 63 75 72 72 65    ** value curre
125a0 6e 74 6c 79 20 62 65 69 6e 67 20 70 61 72 73 65  ntly being parse
125b0 64 2e 20 53 6f 20 69 67 6e 6f 72 65 20 74 68 65  d. So ignore the
125c0 20 63 75 72 72 65 6e 74 20 63 68 61 72 61 63 74   current charact
125d0 65 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  er.          ** 
125e0 61 6e 64 20 73 6b 69 70 20 74 6f 20 74 68 65 20  and skip to the 
125f0 6e 65 78 74 20 22 3f 22 2c 20 22 3d 22 20 6f 72  next "?", "=" or
12600 20 22 26 22 2c 20 61 73 20 61 70 70 72 6f 70 72   "&", as appropr
12610 69 61 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  iate. */.       
12620 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
12630 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
12640 63 21 3d 27 23 27 20 0a 20 20 20 20 20 20 20 20  c!='#' .        
12650 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
12660 21 3d 30 20 7c 7c 20 63 21 3d 27 3f 27 29 0a 20  !=0 || c!='?'). 
12670 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
12680 28 65 53 74 61 74 65 21 3d 31 20 7c 7c 20 28 63  (eState!=1 || (c
12690 21 3d 27 3d 27 20 26 26 20 63 21 3d 27 26 27 29  !='=' && c!='&')
126a0 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ).              
126b0 26 26 20 28 65 53 74 61 74 65 21 3d 32 20 7c 7c  && (eState!=2 ||
126c0 20 63 21 3d 27 26 27 29 0a 20 20 20 20 20 20 20   c!='&').       
126d0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
126e0 20 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20    iIn++;.       
126f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
12700 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
12710 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d 20 6f   }.        c = o
12720 63 74 65 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ctet;.      }els
12730 65 20 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20  e if( eState==1 
12740 26 26 20 28 63 3d 3d 27 26 27 20 7c 7c 20 63 3d  && (c=='&' || c=
12750 3d 27 3d 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='=') ){.       
12760 20 69 66 28 20 7a 46 69 6c 65 5b 69 4f 75 74 2d   if( zFile[iOut-
12770 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  1]==0 ){.       
12780 20 20 20 2f 2a 20 41 6e 20 65 6d 70 74 79 20 6f     /* An empty o
12790 70 74 69 6f 6e 20 6e 61 6d 65 2e 20 49 67 6e 6f  ption name. Igno
127a0 72 65 20 74 68 69 73 20 6f 70 74 69 6f 6e 20 61  re this option a
127b0 6c 74 6f 67 65 74 68 65 72 2e 20 2a 2f 0a 20 20  ltogether. */.  
127c0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a          while( z
127d0 55 72 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69  Uri[iIn] && zUri
127e0 5b 69 49 6e 5d 21 3d 27 23 27 20 26 26 20 7a 55  [iIn]!='#' && zU
127f0 72 69 5b 69 49 6e 2d 31 5d 21 3d 27 26 27 20 29  ri[iIn-1]!='&' )
12800 20 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20   iIn++;.        
12810 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
12820 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
12830 28 20 63 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20  ( c=='&' ){.    
12840 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74        zFile[iOut
12850 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20  ++] = '\0';.    
12860 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12870 20 20 20 20 20 65 53 74 61 74 65 20 3d 20 32 3b       eState = 2;
12880 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12890 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20 20     c = 0;.      
128a0 7d 65 6c 73 65 20 69 66 28 20 28 65 53 74 61 74  }else if( (eStat
128b0 65 3d 3d 30 20 26 26 20 63 3d 3d 27 3f 27 29 20  e==0 && c=='?') 
128c0 7c 7c 20 28 65 53 74 61 74 65 3d 3d 32 20 26 26  || (eState==2 &&
128d0 20 63 3d 3d 27 26 27 29 20 29 7b 0a 20 20 20 20   c=='&') ){.    
128e0 20 20 20 20 63 20 3d 20 30 3b 0a 20 20 20 20 20      c = 0;.     
128f0 20 20 20 65 53 74 61 74 65 20 3d 20 31 3b 0a 20     eState = 1;. 
12900 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 46 69       }.      zFi
12910 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 63 3b 0a  le[iOut++] = c;.
12920 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 53      }.    if( eS
12930 74 61 74 65 3d 3d 31 20 29 20 7a 46 69 6c 65 5b  tate==1 ) zFile[
12940 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
12950 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
12960 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
12970 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
12980 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63  0';..    /* Chec
12990 6b 20 69 66 20 74 68 65 72 65 20 77 65 72 65 20  k if there were 
129a0 61 6e 79 20 6f 70 74 69 6f 6e 73 20 73 70 65 63  any options spec
129b0 69 66 69 65 64 20 74 68 61 74 20 73 68 6f 75 6c  ified that shoul
129c0 64 20 62 65 20 69 6e 74 65 72 70 72 65 74 65 64  d be interpreted
129d0 20 0a 20 20 20 20 2a 2a 20 68 65 72 65 2e 20 4f   .    ** here. O
129e0 70 74 69 6f 6e 73 20 74 68 61 74 20 61 72 65 20  ptions that are 
129f0 69 6e 74 65 72 70 72 65 74 65 64 20 68 65 72 65  interpreted here
12a00 20 69 6e 63 6c 75 64 65 20 22 76 66 73 22 20 61   include "vfs" a
12a10 6e 64 20 74 68 6f 73 65 20 74 68 61 74 0a 20 20  nd those that.  
12a20 20 20 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64 20    ** correspond 
12a30 74 6f 20 66 6c 61 67 73 20 74 68 61 74 20 6d 61  to flags that ma
12a40 79 20 62 65 20 70 61 73 73 65 64 20 74 6f 20 74  y be passed to t
12a50 68 65 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f  he sqlite3_open_
12a60 76 32 28 29 0a 20 20 20 20 2a 2a 20 6d 65 74 68  v2().    ** meth
12a70 6f 64 2e 20 2a 2f 0a 20 20 20 20 7a 4f 70 74 20  od. */.    zOpt 
12a80 3d 20 26 7a 46 69 6c 65 5b 73 71 6c 69 74 65 33  = &zFile[sqlite3
12a90 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 29 2b  Strlen30(zFile)+
12aa0 31 5d 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a  1];.    while( z
12ab0 4f 70 74 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Opt[0] ){.      
12ac0 69 6e 74 20 6e 4f 70 74 20 3d 20 73 71 6c 69 74  int nOpt = sqlit
12ad0 65 33 53 74 72 6c 65 6e 33 30 28 7a 4f 70 74 29  e3Strlen30(zOpt)
12ae0 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 56  ;.      char *zV
12af0 61 6c 20 3d 20 26 7a 4f 70 74 5b 6e 4f 70 74 2b  al = &zOpt[nOpt+
12b00 31 5d 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 56  1];.      int nV
12b10 61 6c 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  al = sqlite3Strl
12b20 65 6e 33 30 28 7a 56 61 6c 29 3b 0a 0a 20 20 20  en30(zVal);..   
12b30 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d 33 20 26     if( nOpt==3 &
12b40 26 20 6d 65 6d 63 6d 70 28 22 76 66 73 22 2c 20  & memcmp("vfs", 
12b50 7a 4f 70 74 2c 20 33 29 3d 3d 30 20 29 7b 0a 20  zOpt, 3)==0 ){. 
12b60 20 20 20 20 20 20 20 7a 56 66 73 20 3d 20 7a 56         zVfs = zV
12b70 61 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  al;.      }else{
12b80 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20  .        struct 
12b90 4f 70 65 6e 4d 6f 64 65 20 7b 0a 20 20 20 20 20  OpenMode {.     
12ba0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
12bb0 2a 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  *z;.          in
12bc0 74 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  t mode;.        
12bd0 7d 20 2a 61 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  } *aMode = 0;.  
12be0 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 6f 64        char *zMod
12bf0 65 54 79 70 65 20 3d 20 30 3b 0a 20 20 20 20 20  eType = 0;.     
12c00 20 20 20 69 6e 74 20 6d 61 73 6b 20 3d 20 30 3b     int mask = 0;
12c10 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d  .        int lim
12c20 69 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20  it = 0;..       
12c30 20 69 66 28 20 6e 4f 70 74 3d 3d 35 20 26 26 20   if( nOpt==5 && 
12c40 6d 65 6d 63 6d 70 28 22 63 61 63 68 65 22 2c 20  memcmp("cache", 
12c50 7a 4f 70 74 2c 20 35 29 3d 3d 30 20 29 7b 0a 20  zOpt, 5)==0 ){. 
12c60 20 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20           static 
12c70 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20  struct OpenMode 
12c80 61 43 61 63 68 65 4d 6f 64 65 5b 5d 20 3d 20 7b  aCacheMode[] = {
12c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
12ca0 73 68 61 72 65 64 22 2c 20 20 53 51 4c 49 54 45  shared",  SQLITE
12cb0 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
12cc0 45 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  E },.           
12cd0 20 7b 20 22 70 72 69 76 61 74 65 22 2c 20 53 51   { "private", SQ
12ce0 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
12cf0 45 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  ECACHE },.      
12d00 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20        { 0, 0 }. 
12d10 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20           };..   
12d20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51         mask = SQ
12d30 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
12d40 43 41 43 48 45 7c 53 51 4c 49 54 45 5f 4f 50 45  CACHE|SQLITE_OPE
12d50 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45 3b 0a  N_PRIVATECACHE;.
12d60 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65 20            aMode 
12d70 3d 20 61 43 61 63 68 65 4d 6f 64 65 3b 0a 20 20  = aCacheMode;.  
12d80 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20          limit = 
12d90 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  mask;.          
12da0 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 63 61 63  zModeType = "cac
12db0 68 65 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  he";.        }. 
12dc0 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d         if( nOpt=
12dd0 3d 34 20 26 26 20 6d 65 6d 63 6d 70 28 22 6d 6f  =4 && memcmp("mo
12de0 64 65 22 2c 20 7a 4f 70 74 2c 20 34 29 3d 3d 30  de", zOpt, 4)==0
12df0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
12e00 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e  atic struct Open
12e10 4d 6f 64 65 20 61 4f 70 65 6e 4d 6f 64 65 5b 5d  Mode aOpenMode[]
12e20 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20   = {.           
12e30 20 7b 20 22 72 6f 22 2c 20 20 53 51 4c 49 54 45   { "ro",  SQLITE
12e40 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 7d  _OPEN_READONLY }
12e50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
12e60 22 72 77 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50  "rw",  SQLITE_OP
12e70 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7d 2c 20  EN_READWRITE }, 
12e80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 22  .            { "
12e90 72 77 63 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  rwc", SQLITE_OPE
12ea0 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
12eb0 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
12ec0 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
12ed0 7b 20 22 6d 65 6d 6f 72 79 22 2c 20 53 51 4c 49  { "memory", SQLI
12ee0 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 20 7d  TE_OPEN_MEMORY }
12ef0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  ,.            { 
12f00 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20  0, 0 }.         
12f10 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d   };..          m
12f20 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ask = SQLITE_OPE
12f30 4e 5f 52 45 41 44 4f 4e 4c 59 20 7c 20 53 51 4c  N_READONLY | SQL
12f40 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
12f50 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  TE.             
12f60 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4f        | SQLITE_O
12f70 50 45 4e 5f 43 52 45 41 54 45 20 7c 20 53 51 4c  PEN_CREATE | SQL
12f80 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 3b  ITE_OPEN_MEMORY;
12f90 0a 20 20 20 20 20 20 20 20 20 20 61 4d 6f 64 65  .          aMode
12fa0 20 3d 20 61 4f 70 65 6e 4d 6f 64 65 3b 0a 20 20   = aOpenMode;.  
12fb0 20 20 20 20 20 20 20 20 6c 69 6d 69 74 20 3d 20          limit = 
12fc0 6d 61 73 6b 20 26 20 66 6c 61 67 73 3b 0a 20 20  mask & flags;.  
12fd0 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
12fe0 65 20 3d 20 22 61 63 63 65 73 73 22 3b 0a 20 20  e = "access";.  
12ff0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
13000 20 69 66 28 20 61 4d 6f 64 65 20 29 7b 0a 20 20   if( aMode ){.  
13010 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
13020 20 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64           int mod
13030 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  e = 0;.         
13040 20 66 6f 72 28 69 3d 30 3b 20 61 4d 6f 64 65 5b   for(i=0; aMode[
13050 69 5d 2e 7a 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  i].z; i++){.    
13060 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
13070 61 72 20 2a 7a 20 3d 20 61 4d 6f 64 65 5b 69 5d  ar *z = aMode[i]
13080 2e 7a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  .z;.            
13090 69 66 28 20 6e 56 61 6c 3d 3d 73 71 6c 69 74 65  if( nVal==sqlite
130a0 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 26 26 20  3Strlen30(z) && 
130b0 30 3d 3d 6d 65 6d 63 6d 70 28 7a 56 61 6c 2c 20  0==memcmp(zVal, 
130c0 7a 2c 20 6e 56 61 6c 29 20 29 7b 0a 20 20 20 20  z, nVal) ){.    
130d0 20 20 20 20 20 20 20 20 20 20 6d 6f 64 65 20 3d            mode =
130e0 20 61 4d 6f 64 65 5b 69 5d 2e 6d 6f 64 65 3b 0a   aMode[i].mode;.
130f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
13100 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
13110 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
13120 20 20 20 20 20 20 20 20 20 69 66 28 20 6d 6f 64           if( mod
13130 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
13140 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
13150 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
13160 22 6e 6f 20 73 75 63 68 20 25 73 20 6d 6f 64 65  "no such %s mode
13170 3a 20 25 73 22 2c 20 7a 4d 6f 64 65 54 79 70 65  : %s", zModeType
13180 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20 20  , zVal);.       
13190 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
131a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
131b0 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
131c0 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ri_out;.        
131d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
131e0 28 20 28 6d 6f 64 65 20 26 20 7e 53 51 4c 49 54  ( (mode & ~SQLIT
131f0 45 5f 4f 50 45 4e 5f 4d 45 4d 4f 52 59 29 3e 6c  E_OPEN_MEMORY)>l
13200 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
13210 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
13220 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
13230 22 25 73 20 6d 6f 64 65 20 6e 6f 74 20 61 6c 6c  "%s mode not all
13240 6f 77 65 64 3a 20 25 73 22 2c 0a 20 20 20 20 20  owed: %s",.     
13250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13270 20 20 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56     zModeType, zV
13280 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
13290 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 45 52   rc = SQLITE_PER
132a0 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67  M;.            g
132b0 6f 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75  oto parse_uri_ou
132c0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
132d0 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d           flags =
132e0 20 28 66 6c 61 67 73 20 26 20 7e 6d 61 73 6b 29   (flags & ~mask)
132f0 20 7c 20 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20   | mode;.       
13300 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
13310 20 20 7a 4f 70 74 20 3d 20 26 7a 56 61 6c 5b 6e    zOpt = &zVal[n
13320 56 61 6c 2b 31 5d 3b 0a 20 20 20 20 7d 0a 0a 20  Val+1];.    }.. 
13330 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 46 69 6c   }else{.    zFil
13340 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  e = sqlite3_mall
13350 6f 63 28 6e 55 72 69 2b 32 29 3b 0a 20 20 20 20  oc(nUri+2);.    
13360 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72 65 74  if( !zFile ) ret
13370 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13380 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a 46 69  ;.    memcpy(zFi
13390 6c 65 2c 20 7a 55 72 69 2c 20 6e 55 72 69 29 3b  le, zUri, nUri);
133a0 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 5d  .    zFile[nUri]
133b0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69   = '\0';.    zFi
133c0 6c 65 5b 6e 55 72 69 2b 31 5d 20 3d 20 27 5c 30  le[nUri+1] = '\0
133d0 27 3b 0a 20 20 20 20 66 6c 61 67 73 20 26 3d 20  ';.    flags &= 
133e0 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49  ~SQLITE_OPEN_URI
133f0 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 56 66 73 20  ;.  }..  *ppVfs 
13400 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
13410 6e 64 28 7a 56 66 73 29 3b 0a 20 20 69 66 28 20  nd(zVfs);.  if( 
13420 2a 70 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20  *ppVfs==0 ){.   
13430 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c   *pzErrMsg = sql
13440 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f  ite3_mprintf("no
13450 20 73 75 63 68 20 76 66 73 3a 20 25 73 22 2c 20   such vfs: %s", 
13460 7a 56 66 73 29 3b 0a 20 20 20 20 72 63 20 3d 20  zVfs);.    rc = 
13470 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
13480 7d 0a 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  }. parse_uri_out
13490 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  :.  if( rc!=SQLI
134a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
134b0 69 74 65 33 5f 66 72 65 65 28 7a 46 69 6c 65 29  ite3_free(zFile)
134c0 3b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 30 3b  ;.    zFile = 0;
134d0 0a 20 20 7d 0a 20 20 2a 70 46 6c 61 67 73 20 3d  .  }.  *pFlags =
134e0 20 66 6c 61 67 73 3b 0a 20 20 2a 70 7a 46 69 6c   flags;.  *pzFil
134f0 65 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 72 65 74  e = zFile;.  ret
13500 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
13510 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 64  * This routine d
13520 6f 65 73 20 74 68 65 20 77 6f 72 6b 20 6f 66 20  oes the work of 
13530 6f 70 65 6e 69 6e 67 20 61 20 64 61 74 61 62 61  opening a databa
13540 73 65 20 6f 6e 20 62 65 68 61 6c 66 20 6f 66 0a  se on behalf of.
13550 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28  ** sqlite3_open(
13560 29 20 61 6e 64 20 73 71 6c 69 74 65 33 5f 6f 70  ) and sqlite3_op
13570 65 6e 31 36 28 29 2e 20 54 68 65 20 64 61 74 61  en16(). The data
13580 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 22 7a  base filename "z
13590 46 69 6c 65 6e 61 6d 65 22 20 20 0a 2a 2a 20 69  Filename"  .** i
135a0 73 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 2e  s UTF-8 encoded.
135b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f  .*/.static int o
135c0 70 65 6e 44 61 74 61 62 61 73 65 28 0a 20 20 63  penDatabase(.  c
135d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
135e0 6e 61 6d 65 2c 20 2f 2a 20 44 61 74 61 62 61 73  name, /* Databas
135f0 65 20 66 69 6c 65 6e 61 6d 65 20 55 54 46 2d 38  e filename UTF-8
13600 20 65 6e 63 6f 64 65 64 20 2a 2f 0a 20 20 73 71   encoded */.  sq
13610 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20 20  lite3 **ppDb,   
13620 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 52 65 74       /* OUT: Ret
13630 75 72 6e 65 64 20 64 61 74 61 62 61 73 65 20 68  urned database h
13640 61 6e 64 6c 65 20 2a 2f 0a 20 20 75 6e 73 69 67  andle */.  unsig
13650 6e 65 64 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  ned int flags,  
13660 20 20 2f 2a 20 4f 70 65 72 61 74 69 6f 6e 61 6c    /* Operational
13670 20 66 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73   flags */.  cons
13680 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20  t char *zVfs    
13690 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
136a0 65 20 56 46 53 20 74 6f 20 75 73 65 20 2a 2f 0a  e VFS to use */.
136b0 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
136c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
136d0 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20 61 6c       /* Store al
136e0 6c 6f 63 61 74 65 64 20 68 61 6e 64 6c 65 20 68  located handle h
136f0 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ere */.  int rc;
13700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13710 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
13720 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
13730 20 69 73 54 68 72 65 61 64 73 61 66 65 3b 20 20   isThreadsafe;  
13740 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
13750 54 72 75 65 20 66 6f 72 20 74 68 72 65 61 64 73  True for threads
13760 61 66 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20  afe connections 
13770 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4f 70 65 6e  */.  char *zOpen
13780 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
13790 20 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65       /* Filename
137a0 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   argument to pas
137b0 73 20 74 6f 20 42 74 72 65 65 4f 70 65 6e 28 29  s to BtreeOpen()
137c0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 72 72   */.  char *zErr
137d0 4d 73 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Msg = 0;        
137e0 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d        /* Error m
137f0 65 73 73 61 67 65 20 66 72 6f 6d 20 73 71 6c 69  essage from sqli
13800 74 65 33 50 61 72 73 65 55 72 69 28 29 20 2a 2f  te3ParseUri() */
13810 0a 0a 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23  ..  *ppDb = 0;.#
13820 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
13830 49 54 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63  IT_AUTOINIT.  rc
13840 20 3d 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69   = sqlite3_initi
13850 61 6c 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72  alize();.  if( r
13860 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23  c ) return rc;.#
13870 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 4f 6e 6c 79  endif..  /* Only
13880 20 61 6c 6c 6f 77 20 73 65 6e 73 69 62 6c 65 20   allow sensible 
13890 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 6f 66 20  combinations of 
138a0 62 69 74 73 20 69 6e 20 74 68 65 20 66 6c 61 67  bits in the flag
138b0 73 20 61 72 67 75 6d 65 6e 74 2e 20 20 0a 20 20  s argument.  .  
138c0 2a 2a 20 54 68 72 6f 77 20 61 6e 20 65 72 72 6f  ** Throw an erro
138d0 72 20 69 66 20 61 6e 79 20 6e 6f 6e 2d 73 65 6e  r if any non-sen
138e0 73 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 69  se combination i
138f0 73 20 75 73 65 64 2e 20 20 49 66 20 77 65 0a 20  s used.  If we. 
13900 20 2a 2a 20 64 6f 20 6e 6f 74 20 62 6c 6f 63 6b   ** do not block
13910 20 69 6c 6c 65 67 61 6c 20 63 6f 6d 62 69 6e 61   illegal combina
13920 74 69 6f 6e 73 20 68 65 72 65 2c 20 69 74 20 63  tions here, it c
13930 6f 75 6c 64 20 74 72 69 67 67 65 72 0a 20 20 2a  ould trigger.  *
13940 2a 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  * assert() state
13950 6d 65 6e 74 73 20 69 6e 20 64 65 65 70 65 72 20  ments in deeper 
13960 6c 61 79 65 72 73 2e 20 20 53 65 6e 73 69 62 6c  layers.  Sensibl
13970 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 0a 20  e combinations. 
13980 20 2a 2a 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20   ** are:.  **.  
13990 2a 2a 20 20 31 3a 20 20 53 51 4c 49 54 45 5f 4f  **  1:  SQLITE_O
139a0 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 0a 20 20 2a  PEN_READONLY.  *
139b0 2a 20 20 32 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  2:  SQLITE_OP
139c0 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 2a  EN_READWRITE.  *
139d0 2a 20 20 36 3a 20 20 53 51 4c 49 54 45 5f 4f 50  *  6:  SQLITE_OP
139e0 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53  EN_READWRITE | S
139f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
13a00 45 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  E.  */.  assert(
13a10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
13a20 44 4f 4e 4c 59 20 20 3d 3d 20 30 78 30 31 20 29  DONLY  == 0x01 )
13a30 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
13a40 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
13a50 45 20 3d 3d 20 30 78 30 32 20 29 3b 0a 20 20 61  E == 0x02 );.  a
13a60 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
13a70 45 4e 5f 43 52 45 41 54 45 20 20 20 20 3d 3d 20  EN_CREATE    == 
13a80 30 78 30 34 20 29 3b 0a 20 20 74 65 73 74 63 61  0x04 );.  testca
13a90 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26 37  se( (1<<(flags&7
13aa0 29 29 3d 3d 30 78 30 32 20 29 3b 20 2f 2a 20 52  ))==0x02 ); /* R
13ab0 45 41 44 4f 4e 4c 59 20 2a 2f 0a 20 20 74 65 73  EADONLY */.  tes
13ac0 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67  tcase( (1<<(flag
13ad0 73 26 37 29 29 3d 3d 30 78 30 34 20 29 3b 20 2f  s&7))==0x04 ); /
13ae0 2a 20 52 45 41 44 57 52 49 54 45 20 2a 2f 0a 20  * READWRITE */. 
13af0 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28   testcase( (1<<(
13b00 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 34 30 20  flags&7))==0x40 
13b10 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45 20  ); /* READWRITE 
13b20 7c 20 43 52 45 41 54 45 20 2a 2f 0a 20 20 69 66  | CREATE */.  if
13b30 28 20 28 28 31 3c 3c 28 66 6c 61 67 73 26 37 29  ( ((1<<(flags&7)
13b40 29 20 26 20 30 78 34 36 29 3d 3d 30 20 29 20 72  ) & 0x46)==0 ) r
13b50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
13b60 55 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 69 66 28  USE_BKPT;..  if(
13b70 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
13b80 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d  nfig.bCoreMutex=
13b90 3d 30 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65  =0 ){.    isThre
13ba0 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65  adsafe = 0;.  }e
13bb0 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26 20  lse if( flags & 
13bc0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55  SQLITE_OPEN_NOMU
13bd0 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72  TEX ){.    isThr
13be0 65 61 64 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d  eadsafe = 0;.  }
13bf0 65 6c 73 65 20 69 66 28 20 66 6c 61 67 73 20 26  else if( flags &
13c00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
13c10 4c 4d 55 54 45 58 20 29 7b 0a 20 20 20 20 69 73  LMUTEX ){.    is
13c20 54 68 72 65 61 64 73 61 66 65 20 3d 20 31 3b 0a  Threadsafe = 1;.
13c30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 73 54    }else{.    isT
13c40 68 72 65 61 64 73 61 66 65 20 3d 20 73 71 6c 69  hreadsafe = sqli
13c50 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
13c60 62 46 75 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a  bFullMutex;.  }.
13c70 20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51    if( flags & SQ
13c80 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54  LITE_OPEN_PRIVAT
13c90 45 43 41 43 48 45 20 29 7b 0a 20 20 20 20 66 6c  ECACHE ){.    fl
13ca0 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f  ags &= ~SQLITE_O
13cb0 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 3b  PEN_SHAREDCACHE;
13cc0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
13cd0 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
13ce0 2e 73 68 61 72 65 64 43 61 63 68 65 45 6e 61 62  .sharedCacheEnab
13cf0 6c 65 64 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  led ){.    flags
13d00 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
13d10 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20 7d  SHAREDCACHE;.  }
13d20 0a 0a 20 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61  ..  /* Remove ha
13d30 72 6d 66 75 6c 20 62 69 74 73 20 66 72 6f 6d 20  rmful bits from 
13d40 74 68 65 20 66 6c 61 67 73 20 70 61 72 61 6d 65  the flags parame
13d50 74 65 72 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ter.  **.  ** Th
13d60 65 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f  e SQLITE_OPEN_NO
13d70 4d 55 54 45 58 20 61 6e 64 20 53 51 4c 49 54 45  MUTEX and SQLITE
13d80 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20  _OPEN_FULLMUTEX 
13d90 66 6c 61 67 73 20 77 65 72 65 0a 20 20 2a 2a 20  flags were.  ** 
13da0 64 65 61 6c 74 20 77 69 74 68 20 69 6e 20 74 68  dealt with in th
13db0 65 20 70 72 65 76 69 6f 75 73 20 63 6f 64 65 20  e previous code 
13dc0 62 6c 6f 63 6b 2e 20 20 42 65 73 69 64 65 73 20  block.  Besides 
13dd0 74 68 65 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a  these, the only.
13de0 20 20 2a 2a 20 76 61 6c 69 64 20 69 6e 70 75 74    ** valid input
13df0 20 66 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74   flags for sqlit
13e00 65 33 5f 6f 70 65 6e 5f 76 32 28 29 20 61 72 65  e3_open_v2() are
13e10 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
13e20 44 4f 4e 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49  DONLY,.  ** SQLI
13e30 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
13e40 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43  E, SQLITE_OPEN_C
13e50 52 45 41 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50  REATE, SQLITE_OP
13e60 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 2c 0a  EN_SHAREDCACHE,.
13e70 20 20 2a 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e    ** SQLITE_OPEN
13e80 5f 50 52 49 56 41 54 45 43 41 43 48 45 2c 20 61  _PRIVATECACHE, a
13e90 6e 64 20 73 6f 6d 65 20 72 65 73 65 72 76 65 64  nd some reserved
13ea0 20 62 69 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79   bits.  Silently
13eb0 20 6d 61 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61   mask.  ** off a
13ec0 6c 6c 20 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a  ll other flags..
13ed0 20 20 2a 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20    */.  flags &= 
13ee0 20 7e 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   ~( SQLITE_OPEN_
13ef0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a  DELETEONCLOSE |.
13f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
13f10 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55  QLITE_OPEN_EXCLU
13f20 53 49 56 45 20 7c 0a 20 20 20 20 20 20 20 20 20  SIVE |.         
13f30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
13f40 4e 5f 4d 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20  N_MAIN_DB |.    
13f50 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
13f60 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c  E_OPEN_TEMP_DB |
13f70 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
13f80 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41   SQLITE_OPEN_TRA
13f90 4e 53 49 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20  NSIENT_DB | .   
13fa0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
13fb0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
13fc0 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
13fd0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
13fe0 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20  EN_TEMP_JOURNAL 
13ff0 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
14000 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55    SQLITE_OPEN_SU
14010 42 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20  BJOURNAL | .    
14020 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
14030 45 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f  E_OPEN_MASTER_JO
14040 55 52 4e 41 4c 20 7c 0a 20 20 20 20 20 20 20 20  URNAL |.        
14050 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
14060 45 4e 5f 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20  EN_NOMUTEX |.   
14070 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
14080 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45  TE_OPEN_FULLMUTE
14090 58 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  X |.            
140a0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57     SQLITE_OPEN_W
140b0 41 4c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  AL.             
140c0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
140d0 65 20 74 68 65 20 73 71 6c 69 74 65 20 64 61 74  e the sqlite dat
140e0 61 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  a structure */. 
140f0 20 64 62 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c   db = sqlite3Mal
14100 6c 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28  locZero( sizeof(
14110 73 71 6c 69 74 65 33 29 20 29 3b 0a 20 20 69 66  sqlite3) );.  if
14120 28 20 64 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f  ( db==0 ) goto o
14130 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28  pendb_out;.  if(
14140 20 69 73 54 68 72 65 61 64 73 61 66 65 20 29 7b   isThreadsafe ){
14150 0a 20 20 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d  .    db->mutex =
14160 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c   sqlite3MutexAll
14170 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
14180 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20 20  RECURSIVE);.    
14190 69 66 28 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30  if( db->mutex==0
141a0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
141b0 33 5f 66 72 65 65 28 64 62 29 3b 0a 20 20 20 20  3_free(db);.    
141c0 20 20 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20    db = 0;.      
141d0 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
141e0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
141f0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14200 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64  (db->mutex);.  d
14210 62 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 78 66  b->errMask = 0xf
14220 66 3b 0a 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32  f;.  db->nDb = 2
14230 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ;.  db->magic = 
14240 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 42 55 53  SQLITE_MAGIC_BUS
14250 59 3b 0a 20 20 64 62 2d 3e 61 44 62 20 3d 20 64  Y;.  db->aDb = d
14260 62 2d 3e 61 44 62 53 74 61 74 69 63 3b 0a 0a 20  b->aDbStatic;.. 
14270 20 61 73 73 65 72 74 28 20 73 69 7a 65 6f 66 28   assert( sizeof(
14280 64 62 2d 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a  db->aLimit)==siz
14290 65 6f 66 28 61 48 61 72 64 4c 69 6d 69 74 29 20  eof(aHardLimit) 
142a0 29 3b 0a 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e  );.  memcpy(db->
142b0 61 4c 69 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d  aLimit, aHardLim
142c0 69 74 2c 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61  it, sizeof(db->a
142d0 4c 69 6d 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61  Limit));.  db->a
142e0 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a 20  utoCommit = 1;. 
142f0 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61 63   db->nextAutovac
14300 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a 4d   = -1;.  db->szM
14310 6d 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  map = sqlite3Glo
14320 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61 70  balConfig.szMmap
14330 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67 65  ;.  db->nextPage
14340 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  size = 0;.  db->
14350 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
14360 53 68 6f 72 74 43 6f 6c 4e 61 6d 65 73 20 7c 20  ShortColNames | 
14370 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54 72 69  SQLITE_EnableTri
14380 67 67 65 72 20 7c 20 53 51 4c 49 54 45 5f 43 61  gger | SQLITE_Ca
14390 63 68 65 53 70 69 6c 6c 0a 23 69 66 20 21 64 65  cheSpill.#if !de
143a0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46  fined(SQLITE_DEF
143b0 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49  AULT_AUTOMATIC_I
143c0 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49 54 45 5f  NDEX) || SQLITE_
143d0 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49  DEFAULT_AUTOMATI
143e0 43 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20 20  C_INDEX.        
143f0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
14400 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65 6e 64  E_AutoIndex.#end
14410 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45  if.#if SQLITE_DE
14420 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d 41  FAULT_FILE_FORMA
14430 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20 20  T<4.            
14440 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 65       | SQLITE_Le
14450 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e 64  gacyFileFmt.#end
14460 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  if.#ifdef SQLITE
14470 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58 54  _ENABLE_LOAD_EXT
14480 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20 20  ENSION.         
14490 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
144a0 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a 23  _LoadExtension.#
144b0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
144c0 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53 49  _DEFAULT_RECURSI
144d0 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20 20 20  VE_TRIGGERS.    
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
144f0 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65 72  QLITE_RecTrigger
14500 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  s.#endif.#if def
14510 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46 41  ined(SQLITE_DEFA
14520 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53  ULT_FOREIGN_KEYS
14530 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45 46 41  ) && SQLITE_DEFA
14540 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59 53  ULT_FOREIGN_KEYS
14550 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14560 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65 69    | SQLITE_Forei
14570 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a 20 20  gnKeys.#endif.  
14580 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33 48      ;.  sqlite3H
14590 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43 6f  ashInit(&db->aCo
145a0 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20  llSeq);.#ifndef 
145b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
145c0 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69 74  UALTABLE.  sqlit
145d0 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e  e3HashInit(&db->
145e0 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66  aModule);.#endif
145f0 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20 64  ..  /* Add the d
14600 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
14610 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52 59   sequence BINARY
14620 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20 66  . BINARY works f
14630 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20 20  or both UTF-8.  
14640 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20 73  ** and UTF-16, s
14650 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e 20  o add a version 
14660 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f 69  for each to avoi
14670 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61 72  d any unnecessar
14680 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69 6f  y.  ** conversio
14690 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72 72  ns. The only err
146a0 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63 75  or that can occu
146b0 72 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c 6c  r here is a mall
146c0 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20 20  oc() failure..  
146d0 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  */.  createColla
146e0 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59  tion(db, "BINARY
146f0 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  ", SQLITE_UTF8, 
14700 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  0, binCollFunc, 
14710 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c  0);.  createColl
14720 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52  ation(db, "BINAR
14730 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  Y", SQLITE_UTF16
14740 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  BE, 0, binCollFu
14750 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
14760 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
14770 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
14780 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43 6f  TF16LE, 0, binCo
14790 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
147a0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
147b0 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49 54  , "RTRIM", SQLIT
147c0 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29 31  E_UTF8, (void*)1
147d0 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
147e0 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  );.  if( db->mal
147f0 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
14800 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
14810 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 70 44 66 6c  ;.  }.  db->pDfl
14820 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  tColl = sqlite3F
14830 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 53  indCollSeq(db, S
14840 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 42 49 4e  QLITE_UTF8, "BIN
14850 41 52 59 22 2c 20 30 29 3b 0a 20 20 61 73 73 65  ARY", 0);.  asse
14860 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c  rt( db->pDfltCol
14870 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c  l!=0 );..  /* Al
14880 73 6f 20 61 64 64 20 61 20 55 54 46 2d 38 20 63  so add a UTF-8 c
14890 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65 20  ase-insensitive 
148a0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
148b0 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61 74 65 43  ce. */.  createC
148c0 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e 4f  ollation(db, "NO
148d0 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55 54  CASE", SQLITE_UT
148e0 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f 6c  F8, 0, nocaseCol
148f0 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b 0a  latingFunc, 0);.
14900 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20  .  /* Parse the 
14910 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72 67  filename/URI arg
14920 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d 3e  ument. */.  db->
14930 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61 67  openFlags = flag
14940 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  s;.  rc = sqlite
14950 33 50 61 72 73 65 55 72 69 28 7a 56 66 73 2c 20  3ParseUri(zVfs, 
14960 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61 67  zFilename, &flag
14970 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20 26 7a  s, &db->pVfs, &z
14980 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29 3b  Open, &zErrMsg);
14990 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
149a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
149b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
149c0 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69   ) db->mallocFai
149d0 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  led = 1;.    sql
149e0 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63  ite3Error(db, rc
149f0 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73 22  , zErrMsg ? "%s"
14a00 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b 0a   : 0, zErrMsg);.
14a10 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14a20 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 67  (zErrMsg);.    g
14a30 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
14a40 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74    }..  /* Open t
14a50 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61 62  he backend datab
14a60 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20 20  ase driver */.  
14a70 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  rc = sqlite3Btre
14a80 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c 20  eOpen(db->pVfs, 
14a90 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d 3e  zOpen, db, &db->
14aa0 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a 20  aDb[0].pBt, 0,. 
14ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14ac0 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20 53         flags | S
14ad0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
14ae0 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  DB);.  if( rc!=S
14af0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14b00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
14b10 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  OERR_NOMEM ){.  
14b20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
14b30 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20  NOMEM;.    }.   
14b40 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
14b50 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 67 6f  , rc, 0);.    go
14b60 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
14b70 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e   }.  db->aDb[0].
14b80 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65  pSchema = sqlite
14b90 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64  3SchemaGet(db, d
14ba0 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a  b->aDb[0].pBt);.
14bb0 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63    db->aDb[1].pSc
14bc0 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63  hema = sqlite3Sc
14bd0 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a  hemaGet(db, 0);.
14be0 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75  ..  /* The defau
14bf0 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  lt safety_level 
14c00 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
14c10 61 62 61 73 65 20 69 73 20 27 66 75 6c 6c 27 3b  abase is 'full';
14c20 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20   for the temp.  
14c30 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74 20 69  ** database it i
14c40 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d  s 'NONE'. This m
14c50 61 74 63 68 65 73 20 74 68 65 20 70 61 67 65 72  atches the pager
14c60 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e   layer defaults.
14c70 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44    .  */.  db->aD
14c80 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61  b[0].zName = "ma
14c90 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30  in";.  db->aDb[0
14ca0 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d  ].safety_level =
14cb0 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d   3;.  db->aDb[1]
14cc0 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b  .zName = "temp";
14cd0 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61  .  db->aDb[1].sa
14ce0 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a  fety_level = 1;.
14cf0 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53  .  db->magic = S
14d00 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e  QLITE_MAGIC_OPEN
14d10 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c  ;.  if( db->mall
14d20 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
14d30 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
14d40 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73  .  }..  /* Regis
14d50 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e  ter all built-in
14d60 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20   functions, but 
14d70 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74  do not attempt t
14d80 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20  o read the.  ** 
14d90 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 20  database schema 
14da0 79 65 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c  yet. This is del
14db0 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66  ayed until the f
14dc0 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 64 61  irst time the da
14dd0 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61  tabase.  ** is a
14de0 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20  ccessed..  */.  
14df0 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
14e00 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a   SQLITE_OK, 0);.
14e10 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74 65    sqlite3Registe
14e20 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f 6e  rBuiltinFunction
14e30 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f 61  s(db);..  /* Loa
14e40 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74 65  d automatic exte
14e50 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73 69  nsions - extensi
14e60 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 62 65  ons that have be
14e70 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20 20  en registered.  
14e80 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71 6c  ** using the sql
14e90 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f 65  ite3_automatic_e
14ea0 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e 0a  xtension() API..
14eb0 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
14ec0 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b  te3_errcode(db);
14ed0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
14ee0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
14ef0 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65 6e  te3AutoLoadExten
14f00 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20 72  sions(db);.    r
14f10 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63  c = sqlite3_errc
14f20 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66 28  ode(db);.    if(
14f30 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14f40 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65  {.      goto ope
14f50 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ndb_out;.    }. 
14f60 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
14f70 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20 20  E_ENABLE_FTS1.  
14f80 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  if( !db->mallocF
14f90 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78 74  ailed ){.    ext
14fa0 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46  ern int sqlite3F
14fb0 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33 2a  ts1Init(sqlite3*
14fc0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
14fd0 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29 3b  te3Fts1Init(db);
14fe0 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  .  }.#endif..#if
14ff0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15000 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64 62  E_FTS2.  if( !db
15010 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26  ->mallocFailed &
15020 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
15030 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69 6e  ){.    extern in
15040 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69  t sqlite3Fts2Ini
15050 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20  t(sqlite3*);.   
15060 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
15070 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  2Init(db);.  }.#
15080 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
15090 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 33  LITE_ENABLE_FTS3
150a0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
150b0 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
150c0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
150d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74 73   rc = sqlite3Fts
150e0 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  3Init(db);.  }.#
150f0 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51  endif..#ifdef SQ
15100 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a  LITE_ENABLE_ICU.
15110 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
15120 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
15130 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15140 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75 49  rc = sqlite3IcuI
15150 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e  nit(db);.  }.#en
15160 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
15170 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45 0a  TE_ENABLE_RTREE.
15180 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f    if( !db->mallo
15190 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d 53  cFailed && rc==S
151a0 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20 72  QLITE_OK){.    r
151b0 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65 65  c = sqlite3Rtree
151c0 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
151d0 6e 64 69 66 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c  ndif..  /* -DSQL
151e0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
151f0 49 4e 47 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73  ING_MODE=1 makes
15200 20 45 58 43 4c 55 53 49 56 45 20 74 68 65 20 64   EXCLUSIVE the d
15210 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20  efault locking. 
15220 20 2a 2a 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c   ** mode.  -DSQL
15230 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
15240 49 4e 47 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20  ING_MODE=0 make 
15250 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66 61 75  NORMAL the defau
15260 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20  lt locking.  ** 
15270 6d 6f 64 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74  mode.  Doing not
15280 68 69 6e 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f  hing at all also
15290 20 6d 61 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68   makes NORMAL th
152a0 65 20 64 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a  e default..  */.
152b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
152c0 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
152d0 44 45 0a 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63  DE.  db->dfltLoc
152e0 6b 4d 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 44  kMode = SQLITE_D
152f0 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
15300 4f 44 45 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  ODE;.  sqlite3Pa
15310 67 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73  gerLockingMode(s
15320 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
15330 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29  (db->aDb[0].pBt)
15340 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
15350 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
15360 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
15370 4e 47 5f 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66  NG_MODE);.#endif
15380 0a 0a 20 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68  ..  /* Enable th
15390 65 20 6c 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c  e lookaside-mall
153a0 6f 63 20 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a  oc subsystem */.
153b0 20 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65    setupLookaside
153c0 28 64 62 2c 20 30 2c 20 73 71 6c 69 74 65 33 47  (db, 0, sqlite3G
153d0 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f  lobalConfig.szLo
153e0 6f 6b 61 73 69 64 65 2c 0a 20 20 20 20 20 20 20  okaside,.       
153f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15400 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
15410 6e 66 69 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29  nfig.nLookaside)
15420 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  ;..  sqlite3_wal
15430 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28  _autocheckpoint(
15440 64 62 2c 20 53 51 4c 49 54 45 5f 44 45 46 41 55  db, SQLITE_DEFAU
15450 4c 54 5f 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b  LT_WAL_AUTOCHECK
15460 50 4f 49 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f  POINT);..opendb_
15470 6f 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  out:.  sqlite3_f
15480 72 65 65 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66  ree(zOpen);.  if
15490 28 20 64 62 20 29 7b 0a 20 20 20 20 61 73 73 65  ( db ){.    asse
154a0 72 74 28 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30  rt( db->mutex!=0
154b0 20 7c 7c 20 69 73 54 68 72 65 61 64 73 61 66 65   || isThreadsafe
154c0 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c  ==0 || sqlite3Gl
154d0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
154e0 4d 75 74 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20  Mutex==0 );.    
154f0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
15500 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
15510 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
15520 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a  e3_errcode(db);.
15530 20 20 61 73 73 65 72 74 28 20 64 62 21 3d 30 20    assert( db!=0 
15540 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
15550 4d 45 4d 20 29 3b 0a 20 20 69 66 28 20 72 63 3d  MEM );.  if( rc=
15560 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b  =SQLITE_NOMEM ){
15570 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
15580 73 65 28 64 62 29 3b 0a 20 20 20 20 64 62 20 3d  se(db);.    db =
15590 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
155a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
155b0 0a 20 20 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  .    db->magic =
155c0 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49   SQLITE_MAGIC_SI
155d0 43 4b 3b 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20  CK;.  }.  *ppDb 
155e0 3d 20 64 62 3b 0a 23 69 66 64 65 66 20 53 51 4c  = db;.#ifdef SQL
155f0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f  ITE_ENABLE_SQLLO
15600 47 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  G.  if( sqlite3G
15610 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c  lobalConfig.xSql
15620 6c 6f 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  log ){.    /* Op
15630 65 6e 69 6e 67 20 61 20 64 62 20 68 61 6e 64 6c  ening a db handl
15640 65 2e 20 46 6f 75 72 74 68 20 70 61 72 61 6d 65  e. Fourth parame
15650 74 65 72 20 69 73 20 70 61 73 73 65 64 20 30 2e  ter is passed 0.
15660 20 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 41   */.    void *pA
15670 72 67 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  rg = sqlite3Glob
15680 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
15690 41 72 67 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Arg;.    sqlite3
156a0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
156b0 6c 6c 6f 67 28 70 41 72 67 2c 20 64 62 2c 20 7a  llog(pArg, db, z
156c0 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20  Filename, 0);.  
156d0 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
156e0 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  n sqlite3ApiExit
156f0 28 30 2c 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (0, rc);.}../*.*
15700 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 64 61 74  * Open a new dat
15710 61 62 61 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f  abase handle..*/
15720 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
15730 6e 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n(.  const char 
15740 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73  *zFilename, .  s
15750 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 20 0a 29  qlite3 **ppDb .)
15760 7b 0a 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44  {.  return openD
15770 61 74 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d  atabase(zFilenam
15780 65 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20  e, ppDb,.       
15790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
157a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
157b0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
157c0 45 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d  EN_CREATE, 0);.}
157d0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65  .int sqlite3_ope
157e0 6e 5f 76 32 28 0a 20 20 63 6f 6e 73 74 20 63 68  n_v2(.  const ch
157f0 61 72 20 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20  ar *filename,   
15800 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
15810 6e 61 6d 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a  name (UTF-8) */.
15820 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44 62    sqlite3 **ppDb
15830 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
15840 3a 20 53 51 4c 69 74 65 20 64 62 20 68 61 6e 64  : SQLite db hand
15850 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67  le */.  int flag
15860 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
15870 2f 2a 20 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f  /* Flags */.  co
15880 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 20  nst char *zVfs  
15890 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
158a0 20 56 46 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75   VFS module to u
158b0 73 65 20 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72  se */.){.  retur
158c0 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 66  n openDatabase(f
158d0 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28  ilename, ppDb, (
158e0 75 6e 73 69 67 6e 65 64 20 69 6e 74 29 66 6c 61  unsigned int)fla
158f0 67 73 2c 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69  gs, zVfs);.}..#i
15900 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
15910 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70  T_UTF16./*.** Op
15920 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
15930 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74  e handle..*/.int
15940 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28   sqlite3_open16(
15950 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
15960 46 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c  Filename, .  sql
15970 69 74 65 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20  ite3 **ppDb.){. 
15980 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69   char const *zFi
15990 6c 65 6e 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46  lename8;   /* zF
159a0 69 6c 65 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20  ilename encoded 
159b0 69 6e 20 55 54 46 2d 38 20 69 6e 73 74 65 61 64  in UTF-8 instead
159c0 20 6f 66 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20   of UTF-16 */.  
159d0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 70  sqlite3_value *p
159e0 56 61 6c 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  Val;.  int rc;..
159f0 20 20 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e    assert( zFilen
15a00 61 6d 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ame );.  assert(
15a10 20 70 70 44 62 20 29 3b 0a 20 20 2a 70 70 44 62   ppDb );.  *ppDb
15a20 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 0;.#ifndef SQ
15a30 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e  LITE_OMIT_AUTOIN
15a40 49 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  IT.  rc = sqlite
15a50 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  3_initialize();.
15a60 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
15a70 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70  n rc;.#endif.  p
15a80 56 61 6c 20 3d 20 73 71 6c 69 74 65 33 56 61 6c  Val = sqlite3Val
15a90 75 65 4e 65 77 28 30 29 3b 0a 20 20 73 71 6c 69  ueNew(0);.  sqli
15aa0 74 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 70  te3ValueSetStr(p
15ab0 56 61 6c 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61  Val, -1, zFilena
15ac0 6d 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36  me, SQLITE_UTF16
15ad0 4e 41 54 49 56 45 2c 20 53 51 4c 49 54 45 5f 53  NATIVE, SQLITE_S
15ae0 54 41 54 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e  TATIC);.  zFilen
15af0 61 6d 65 38 20 3d 20 73 71 6c 69 74 65 33 56 61  ame8 = sqlite3Va
15b00 6c 75 65 54 65 78 74 28 70 56 61 6c 2c 20 53 51  lueText(pVal, SQ
15b10 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 69 66  LITE_UTF8);.  if
15b20 28 20 7a 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a  ( zFilename8 ){.
15b30 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 44 61 74      rc = openDat
15b40 61 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38  abase(zFilename8
15b50 2c 20 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20  , ppDb,.        
15b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
15b70 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
15b80 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45  ITE | SQLITE_OPE
15b90 4e 5f 43 52 45 41 54 45 2c 20 30 29 3b 0a 20 20  N_CREATE, 0);.  
15ba0 20 20 61 73 73 65 72 74 28 20 2a 70 70 44 62 20    assert( *ppDb 
15bb0 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
15bc0 4d 45 4d 20 29 3b 0a 20 20 20 20 69 66 28 20 72  MEM );.    if( r
15bd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15be0 21 44 62 48 61 73 50 72 6f 70 65 72 74 79 28 2a  !DbHasProperty(*
15bf0 70 70 44 62 2c 20 30 2c 20 44 42 5f 53 63 68 65  ppDb, 0, DB_Sche
15c00 6d 61 4c 6f 61 64 65 64 29 20 29 7b 0a 20 20 20  maLoaded) ){.   
15c10 20 20 20 45 4e 43 28 2a 70 70 44 62 29 20 3d 20     ENC(*ppDb) = 
15c20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
15c30 56 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  VE;.    }.  }els
15c40 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  e{.    rc = SQLI
15c50 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
15c60 73 71 6c 69 74 65 33 56 61 6c 75 65 46 72 65 65  sqlite3ValueFree
15c70 28 70 56 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72  (pVal);..  retur
15c80 6e 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  n sqlite3ApiExit
15c90 28 30 2c 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69  (0, rc);.}.#endi
15ca0 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
15cb0 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _UTF16 */../*.**
15cc0 20 52 65 67 69 73 74 65 72 20 61 20 6e 65 77 20   Register a new 
15cd0 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
15ce0 63 65 20 77 69 74 68 20 74 68 65 20 64 61 74 61  ce with the data
15cf0 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a  base handle db..
15d00 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
15d10 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28  reate_collation(
15d20 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
15d30 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
15d40 4e 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63  Name, .  int enc
15d50 2c 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c  , .  void* pCtx,
15d60 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65  .  int(*xCompare
15d70 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  )(void*,int,cons
15d80 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73  t void*,int,cons
15d90 74 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e  t void*).){.  in
15da0 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f  t rc;.  sqlite3_
15db0 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
15dc0 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74  mutex);.  assert
15dd0 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
15de0 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 63 72  led );.  rc = cr
15df0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
15e00 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63  , zName, (u8)enc
15e10 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61 72 65  , pCtx, xCompare
15e20 2c 20 30 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  , 0);.  rc = sql
15e30 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
15e40 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
15e50 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
15e60 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
15e70 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  rc;.}../*.** Reg
15e80 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
15e90 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
15ea0 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
15eb0 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
15ec0 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
15ed0 65 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a  e_collation_v2(.
15ee0 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a    sqlite3* db, .
15ef0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
15f00 61 6d 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c  ame, .  int enc,
15f10 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
15f20 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
15f30 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
15f40 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
15f50 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28   void*),.  void(
15f60 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b  *xDel)(void*).){
15f70 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
15f80 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
15f90 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61  (db->mutex);.  a
15fa0 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
15fb0 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63  ocFailed );.  rc
15fc0 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69   = createCollati
15fd0 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75  on(db, zName, (u
15fe0 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f  8)enc, pCtx, xCo
15ff0 6d 70 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20  mpare, xDel);.  
16000 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
16010 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
16020 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
16030 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
16040 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
16050 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16060 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
16070 65 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f  egister a new co
16080 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
16090 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61   with the databa
160a0 73 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f  se handle db..*/
160b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
160c0 61 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28  ate_collation16(
160d0 0a 20 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20  .  sqlite3* db, 
160e0 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a  .  const void *z
160f0 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  Name,.  int enc,
16100 20 0a 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a   .  void* pCtx,.
16110 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29    int(*xCompare)
16120 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74  (void*,int,const
16130 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74   void*,int,const
16140 20 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74   void*).){.  int
16150 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
16160 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b  .  char *zName8;
16170 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16180 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
16190 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62  );.  assert( !db
161a0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
161b0 3b 0a 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c  ;.  zName8 = sql
161c0 69 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c  ite3Utf16to8(db,
161d0 20 7a 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49   zName, -1, SQLI
161e0 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b  TE_UTF16NATIVE);
161f0 0a 20 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b  .  if( zName8 ){
16200 0a 20 20 20 20 72 63 20 3d 20 63 72 65 61 74 65  .    rc = create
16210 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
16220 61 6d 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70  ame8, (u8)enc, p
16230 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30  Ctx, xCompare, 0
16240 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  );.    sqlite3Db
16250 46 72 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29  Free(db, zName8)
16260 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
16270 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
16280 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
16290 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
162a0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
162b0 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
162c0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
162d0 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69  6 */../*.** Regi
162e0 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  ster a collation
162f0 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
16300 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  y callback with 
16310 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
16320 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61  dle.** db. Repla
16330 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c  ce any previousl
16340 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c  y installed coll
16350 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
16360 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73  actory..*/.int s
16370 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
16380 5f 6e 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74  _needed(.  sqlit
16390 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20  e3 *db, .  void 
163a0 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c  *pCollNeededArg,
163b0 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e   .  void(*xCollN
163c0 65 65 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c  eeded)(void*,sql
163d0 69 74 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52  ite3*,int eTextR
163e0 65 70 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a  ep,const char*).
163f0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  ){.  sqlite3_mut
16400 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
16410 65 78 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c  ex);.  db->xColl
16420 4e 65 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65  Needed = xCollNe
16430 65 64 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c  eded;.  db->xCol
16440 6c 4e 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20  lNeeded16 = 0;. 
16450 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
16460 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
16470 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
16480 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
16490 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
164a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
164b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
164c0 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52  IT_UTF16./*.** R
164d0 65 67 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74  egister a collat
164e0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
164f0 74 6f 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69  tory callback wi
16500 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
16510 68 61 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65  handle.** db. Re
16520 70 6c 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f  place any previo
16530 75 73 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63  usly installed c
16540 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
16550 65 20 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e  e factory..*/.in
16560 74 20 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74  t sqlite3_collat
16570 69 6f 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20  ion_needed16(.  
16580 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
16590 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65  void *pCollNeede
165a0 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78  dArg, .  void(*x
165b0 43 6f 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f  CollNeeded16)(vo
165c0 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
165d0 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
165e0 76 6f 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69  void*).){.  sqli
165f0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
16600 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
16610 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20  ->xCollNeeded = 
16620 30 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  0;.  db->xCollNe
16630 65 64 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65  eded16 = xCollNe
16640 65 64 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43  eded16;.  db->pC
16650 6f 6c 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70  ollNeededArg = p
16660 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20  CollNeededArg;. 
16670 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
16680 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
16690 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
166a0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  _OK;.}.#endif /*
166b0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46   SQLITE_OMIT_UTF
166c0 31 36 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53  16 */..#ifndef S
166d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45  QLITE_OMIT_DEPRE
166e0 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73  CATED./*.** This
166f0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77   function is now
16700 20 61 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e   an anachronism.
16710 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 20 75   It used to be u
16720 73 65 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66  sed to recover f
16730 72 6f 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28  rom a.** malloc(
16740 29 20 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53  ) failure, but S
16750 51 4c 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74  QLite now does t
16760 68 69 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  his automaticall
16770 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
16780 33 5f 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72  3_global_recover
16790 28 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e  (void){.  return
167a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
167b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74  ndif../*.** Test
167c0 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20   to see whether 
167d0 6f 72 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  or not the datab
167e0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
167f0 73 20 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a  s in autocommit.
16800 2a 2a 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e  ** mode.  Return
16810 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20 61   TRUE if it is a
16820 6e 64 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e  nd FALSE if not.
16830 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64    Autocommit mod
16840 65 20 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65  e is on.** by de
16850 66 61 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d  fault.  Autocomm
16860 69 74 20 69 73 20 64 69 73 61 62 6c 65 64 20 62  it is disabled b
16870 79 20 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d  y a BEGIN statem
16880 65 6e 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65  ent and reenable
16890 64 0a 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74  d.** by the next
168a0 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42   COMMIT or ROLLB
168b0 41 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ACK..*/.int sqli
168c0 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d  te3_get_autocomm
168d0 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  it(sqlite3 *db){
168e0 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75  .  return db->au
168f0 74 6f 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a  toCommit;.}../*.
16900 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
16910 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75   routines are su
16920 62 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e  btitutes for con
16930 73 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f  stants SQLITE_CO
16940 52 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45  RRUPT,.** SQLITE
16950 5f 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f  _MISUSE, SQLITE_
16960 43 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45  CANTOPEN, SQLITE
16970 5f 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69  _IOERR and possi
16980 62 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a  bly other error.
16990 2a 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54  ** constants.  T
169a0 68 65 79 20 73 65 72 76 65 72 20 74 77 6f 20 70  hey server two p
169b0 75 72 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  urposes:.**.**  
169c0 20 31 2e 20 20 53 65 72 76 65 20 61 73 20 61 20   1.  Serve as a 
169d0 63 6f 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65  convenient place
169e0 20 74 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70   to set a breakp
169f0 6f 69 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67  oint in a debugg
16a00 65 72 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64  er.**       to d
16a10 65 74 65 63 74 20 77 68 65 6e 20 76 65 72 73 69  etect when versi
16a20 6f 6e 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69  on error conditi
16a30 6f 6e 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ons occurs..**.*
16a40 2a 20 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73  *   2.  Invoke s
16a50 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20  qlite3_log() to 
16a60 70 72 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72  provide the sour
16a70 63 65 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e  ce code location
16a80 20 77 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20   where.**       
16a90 61 20 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f  a low-level erro
16aa0 72 20 69 73 20 66 69 72 73 74 20 64 65 74 65 63  r is first detec
16ab0 74 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ted..*/.int sqli
16ac0 74 65 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28  te3CorruptError(
16ad0 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74  int lineno){.  t
16ae0 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33  estcase( sqlite3
16af0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f  GlobalConfig.xLo
16b00 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65  g!=0 );.  sqlite
16b10 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52  3_log(SQLITE_COR
16b20 52 55 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20  RUPT,.          
16b30 20 20 20 20 22 64 61 74 61 62 61 73 65 20 63 6f      "database co
16b40 72 72 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65  rruption at line
16b50 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c   %d of [%.10s]",
16b60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6c  .              l
16b70 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65  ineno, 20+sqlite
16b80 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20  3_sourceid());. 
16b90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
16ba0 4f 52 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71  ORRUPT;.}.int sq
16bb0 6c 69 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72  lite3MisuseError
16bc0 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20  (int lineno){.  
16bd0 74 65 73 74 63 61 73 65 28 20 73 71 6c 69 74 65  testcase( sqlite
16be0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c  3GlobalConfig.xL
16bf0 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  og!=0 );.  sqlit
16c00 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49  e3_log(SQLITE_MI
16c10 53 55 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20  SUSE, .         
16c20 20 20 20 20 20 22 6d 69 73 75 73 65 20 61 74 20       "misuse at 
16c30 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30  line %d of [%.10
16c40 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  s]",.           
16c50 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71     lineno, 20+sq
16c60 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
16c70 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
16c80 54 45 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74  TE_MISUSE;.}.int
16c90 20 73 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e   sqlite3Cantopen
16ca0 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f  Error(int lineno
16cb0 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20 73  ){.  testcase( s
16cc0 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16cd0 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20  ig.xLog!=0 );.  
16ce0 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49  sqlite3_log(SQLI
16cf0 54 45 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20  TE_CANTOPEN, .  
16d00 20 20 20 20 20 20 20 20 20 20 20 20 22 63 61 6e              "can
16d10 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74  not open file at
16d20 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31   line %d of [%.1
16d30 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  0s]",.          
16d40 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73      lineno, 20+s
16d50 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28  qlite3_sourceid(
16d60 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ));.  return SQL
16d70 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a  ITE_CANTOPEN;.}.
16d80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
16d90 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44  _OMIT_DEPRECATED
16da0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
16db0 20 63 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75   convenience rou
16dc0 74 69 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20  tine that makes 
16dd0 73 75 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68  sure that all th
16de0 72 65 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a  read-specific.**
16df0 20 64 61 74 61 20 66 6f 72 20 74 68 69 73 20 74   data for this t
16e00 68 72 65 61 64 20 68 61 73 20 62 65 65 6e 20 64  hread has been d
16e10 65 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a  eallocated..**.*
16e20 2a 20 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67  * SQLite no long
16e30 65 72 20 75 73 65 73 20 74 68 72 65 61 64 2d 73  er uses thread-s
16e40 70 65 63 69 66 69 63 20 64 61 74 61 20 73 6f 20  pecific data so 
16e50 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
16e60 6e 6f 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20  now a.** no-op. 
16e70 20 49 74 20 69 73 20 72 65 74 61 69 6e 65 64 20   It is retained 
16e80 66 6f 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63  for historical c
16e90 6f 6d 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f  ompatibility..*/
16ea0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68  .void sqlite3_th
16eb0 72 65 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69  read_cleanup(voi
16ec0 64 29 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  d){.}.#endif../*
16ed0 0a 2a 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20  .** Return meta 
16ee0 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
16ef0 74 20 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c  t a specific col
16f00 75 6d 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73  umn of a databas
16f10 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20  e table..** See 
16f20 63 6f 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74  comment in sqlit
16f30 65 33 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69  e3.h (sqlite.h.i
16f40 6e 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a  n) for details..
16f50 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
16f60 5f 45 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d  _ENABLE_COLUMN_M
16f70 45 54 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69  ETADATA.int sqli
16f80 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
16f90 5f 6d 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c  _metadata(.  sql
16fa0 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
16fb0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e           /* Conn
16fc0 65 63 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f  ection handle */
16fd0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
16fe0 44 62 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f  DbName,        /
16ff0 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20  * Database name 
17000 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
17010 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e  st char *zTableN
17020 61 6d 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c  ame,     /* Tabl
17030 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73  e name */.  cons
17040 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e  t char *zColumnN
17050 61 6d 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  ame,    /* Colum
17060 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72  n name */.  char
17070 20 63 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54   const **pzDataT
17080 79 70 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55  ype,    /* OUTPU
17090 54 3a 20 44 65 63 6c 61 72 65 64 20 64 61 74 61  T: Declared data
170a0 20 74 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20   type */.  char 
170b0 63 6f 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65  const **pzCollSe
170c0 71 2c 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54  q,     /* OUTPUT
170d0 3a 20 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  : Collation sequ
170e0 65 6e 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69  ence name */.  i
170f0 6e 74 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20  nt *pNotNull,   
17100 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55             /* OU
17110 54 50 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f  TPUT: True if NO
17120 54 20 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e  T NULL constrain
17130 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e  t exists */.  in
17140 74 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20  t *pPrimaryKey, 
17150 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54            /* OUT
17160 50 55 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c  PUT: True if col
17170 75 6d 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a  umn part of PK *
17180 2f 0a 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e  /.  int *pAutoin
17190 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
171a0 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20  /* OUTPUT: True 
171b0 69 66 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74  if column is aut
171c0 6f 2d 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29  o-increment */.)
171d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
171e0 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
171f0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d  .  Table *pTab =
17200 20 30 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43   0;.  Column *pC
17210 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43  ol = 0;.  int iC
17220 6f 6c 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73  ol;..  char cons
17230 74 20 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30  t *zDataType = 0
17240 3b 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ;.  char const *
17250 7a 43 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20  zCollSeq = 0;.  
17260 69 6e 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b  int notnull = 0;
17270 0a 20 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65  .  int primaryke
17280 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74  y = 0;.  int aut
17290 6f 69 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  oinc = 0;..  /* 
172a0 45 6e 73 75 72 65 20 74 68 65 20 64 61 74 61 62  Ensure the datab
172b0 61 73 65 20 73 63 68 65 6d 61 20 68 61 73 20 62  ase schema has b
172c0 65 65 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20  een loaded */.  
172d0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
172e0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
172f0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e    sqlite3BtreeEn
17300 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63  terAll(db);.  rc
17310 20 3d 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64   = sqlite3Init(d
17320 62 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  b, &zErrMsg);.  
17330 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72  if( SQLITE_OK!=r
17340 63 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72  c ){.    goto er
17350 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ror_out;.  }..  
17360 2f 2a 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61  /* Locate the ta
17370 62 6c 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20  ble in question 
17380 2a 2f 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69  */.  pTab = sqli
17390 74 65 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c  te3FindTable(db,
173a0 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62   zTableName, zDb
173b0 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54  Name);.  if( !pT
173c0 61 62 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c  ab || pTab->pSel
173d0 65 63 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20  ect ){.    pTab 
173e0 3d 20 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72  = 0;.    goto er
173f0 72 6f 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ror_out;.  }..  
17400 2f 2a 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75  /* Find the colu
17410 6d 6e 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66  mn for which inf
17420 6f 20 69 73 20 72 65 71 75 65 73 74 65 64 20 2a  o is requested *
17430 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 49  /.  if( sqlite3I
17440 73 52 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61  sRowid(zColumnNa
17450 6d 65 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20  me) ){.    iCol 
17460 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20  = pTab->iPKey;. 
17470 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29     if( iCol>=0 )
17480 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26  {.      pCol = &
17490 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
174a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  ;.    }.  }else{
174b0 0a 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b  .    for(iCol=0;
174c0 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
174d0 3b 20 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  ; iCol++){.     
174e0 20 70 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61   pCol = &pTab->a
174f0 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20  Col[iCol];.     
17500 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53   if( 0==sqlite3S
17510 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  trICmp(pCol->zNa
17520 6d 65 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29  me, zColumnName)
17530 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
17540 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
17550 0a 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70  .    if( iCol==p
17560 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
17570 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20     pTab = 0;.   
17580 20 20 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75     goto error_ou
17590 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  t;.    }.  }..  
175a0 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
175b0 20 62 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68   block stores th
175c0 65 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  e meta informati
175d0 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20  on that will be 
175e0 72 65 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f  returned.  ** to
175f0 20 74 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c   the caller in l
17600 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a  ocal variables z
17610 44 61 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53  DataType, zCollS
17620 65 71 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69  eq, notnull, pri
17630 6d 61 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64  marykey.  ** and
17640 20 61 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69   autoinc. At thi
17650 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72  s point there ar
17660 65 20 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74  e two possibilit
17670 69 65 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20  ies:.  ** .  ** 
17680 20 20 20 20 31 2e 20 54 68 65 20 73 70 65 63 69      1. The speci
17690 66 69 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  fied column name
176a0 20 77 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69   was rowid", "oi
176b0 64 22 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20  d" or "_rowid_" 
176c0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64  .  **        and
176d0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70   there is no exp
176e0 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64  licitly declared
176f0 20 49 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20   IPK column. .  
17700 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54  **.  **     2. T
17710 68 65 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20  he table is not 
17720 61 20 76 69 65 77 20 61 6e 64 20 74 68 65 20 63  a view and the c
17730 6f 6c 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74  olumn name ident
17740 69 66 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20  ified an .  **  
17750 20 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79        explicitly
17760 20 64 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e   declared column
17770 2e 20 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f  . Copy meta info
17780 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43  rmation from *pC
17790 6f 6c 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ol..  */ .  if( 
177a0 70 43 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74  pCol ){.    zDat
177b0 61 54 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54  aType = pCol->zT
177c0 79 70 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65  ype;.    zCollSe
177d0 71 20 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b  q = pCol->zColl;
177e0 0a 20 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70  .    notnull = p
177f0 43 6f 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b  Col->notNull!=0;
17800 0a 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20  .    primarykey 
17810 20 3d 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61   = (pCol->colFla
17820 67 73 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49  gs & COLFLAG_PRI
17830 4d 4b 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75  MKEY)!=0;.    au
17840 74 6f 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50  toinc = pTab->iP
17850 4b 65 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54  Key==iCol && (pT
17860 61 62 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54  ab->tabFlags & T
17870 46 5f 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29  F_Autoincrement)
17880 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  !=0;.  }else{.  
17890 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49    zDataType = "I
178a0 4e 54 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69  NTEGER";.    pri
178b0 6d 61 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d  marykey = 1;.  }
178c0 0a 20 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71  .  if( !zCollSeq
178d0 20 29 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71   ){.    zCollSeq
178e0 20 3d 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d   = "BINARY";.  }
178f0 0a 0a 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73  ..error_out:.  s
17900 71 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65  qlite3BtreeLeave
17910 41 6c 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57  All(db);..  /* W
17920 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74  hether the funct
17930 69 6f 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64  ion call succeed
17940 65 64 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65  ed or failed, se
17950 74 20 74 68 65 20 6f 75 74 70 75 74 20 70 61 72  t the output par
17960 61 6d 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20  ameters.  ** to 
17970 77 68 61 74 65 76 65 72 20 74 68 65 69 72 20 6c  whatever their l
17980 6f 63 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74  ocal counterpart
17990 73 20 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e  s contain. If an
179a0 20 65 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72   error did occur
179b0 2c 0a 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20  ,.  ** this has 
179c0 74 68 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65  the effect of ze
179d0 72 6f 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74  roing all output
179e0 20 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a   parameters..  *
179f0 2f 0a 20 20 69 66 28 20 70 7a 44 61 74 61 54 79  /.  if( pzDataTy
17a00 70 65 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65  pe ) *pzDataType
17a10 20 3d 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20   = zDataType;.  
17a20 69 66 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20  if( pzCollSeq ) 
17a30 2a 70 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f  *pzCollSeq = zCo
17a40 6c 6c 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f  llSeq;.  if( pNo
17a50 74 4e 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c  tNull ) *pNotNul
17a60 6c 20 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69  l = notnull;.  i
17a70 66 28 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29  f( pPrimaryKey )
17a80 20 2a 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20   *pPrimaryKey = 
17a90 70 72 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66  primarykey;.  if
17aa0 28 20 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41  ( pAutoinc ) *pA
17ab0 75 74 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63  utoinc = autoinc
17ac0 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f  ;..  if( SQLITE_
17ad0 4f 4b 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20  OK==rc && !pTab 
17ae0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
17af0 46 72 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67  Free(db, zErrMsg
17b00 29 3b 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d  );.    zErrMsg =
17b10 20 73 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28   sqlite3MPrintf(
17b20 64 62 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62  db, "no such tab
17b30 6c 65 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73  le column: %s.%s
17b40 22 2c 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20  ", zTableName,. 
17b50 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61         zColumnNa
17b60 6d 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  me);.    rc = SQ
17b70 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
17b80 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
17b90 62 2c 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f  b, rc, (zErrMsg?
17ba0 22 25 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67  "%s":0), zErrMsg
17bb0 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72  );.  sqlite3DbFr
17bc0 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b  ee(db, zErrMsg);
17bd0 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
17be0 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
17bf0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
17c00 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
17c10 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
17c20 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
17c30 6c 65 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c  leep for a littl
17c40 65 20 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e  e while.  Return
17c50 20 74 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74   the amount of t
17c60 69 6d 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e  ime slept..*/.in
17c70 74 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28  t sqlite3_sleep(
17c80 69 6e 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74  int ms){.  sqlit
17c90 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20  e3_vfs *pVfs;.  
17ca0 69 6e 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d  int rc;.  pVfs =
17cb0 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e   sqlite3_vfs_fin
17cc0 64 28 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73  d(0);.  if( pVfs
17cd0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17ce0 0a 20 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74  .  /* This funct
17cf0 69 6f 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c  ion works in mil
17d00 6c 69 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74  liseconds, but t
17d10 68 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73  he underlying Os
17d20 53 6c 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50  Sleep() .  ** AP
17d30 49 20 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f  I uses microseco
17d40 6e 64 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31  nds. Hence the 1
17d50 30 30 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63  000's..  */.  rc
17d60 20 3d 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65   = (sqlite3OsSle
17d70 65 70 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73  ep(pVfs, 1000*ms
17d80 29 2f 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72  )/1000);.  retur
17d90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  n rc;.}../*.** E
17da0 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
17db0 20 74 68 65 20 65 78 74 65 6e 64 65 64 20 72 65   the extended re
17dc0 73 75 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69  sult codes..*/.i
17dd0 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e  nt sqlite3_exten
17de0 64 65 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73  ded_result_codes
17df0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
17e00 74 20 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69  t onoff){.  sqli
17e10 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
17e20 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
17e30 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66  ->errMask = onof
17e40 66 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a  f ? 0xffffffff :
17e50 20 30 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33   0xff;.  sqlite3
17e60 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
17e70 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
17e80 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
17e90 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65  /*.** Invoke the
17ea0 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65   xFileControl me
17eb0 74 68 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63  thod on a partic
17ec0 75 6c 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a  ular database..*
17ed0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69  /.int sqlite3_fi
17ee0 6c 65 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74  le_control(sqlit
17ef0 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
17f00 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74  ar *zDbName, int
17f10 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
17f20 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
17f30 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72  ITE_ERROR;.  Btr
17f40 65 65 20 2a 70 42 74 72 65 65 3b 0a 0a 20 20 73  ee *pBtree;..  s
17f50 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
17f60 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
17f70 20 70 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65   pBtree = sqlite
17f80 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64  3DbNameToBtree(d
17f90 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69  b, zDbName);.  i
17fa0 66 28 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20  f( pBtree ){.   
17fb0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
17fc0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
17fd0 20 2a 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65   *fd;.    sqlite
17fe0 33 42 74 72 65 65 45 6e 74 65 72 28 70 42 74 72  3BtreeEnter(pBtr
17ff0 65 65 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20  ee);.    pPager 
18000 3d 20 73 71 6c 69 74 65 33 42 74 72 65 65 50 61  = sqlite3BtreePa
18010 67 65 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20  ger(pBtree);.   
18020 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
18030 3d 30 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73  =0 );.    fd = s
18040 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28  qlite3PagerFile(
18050 70 50 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73  pPager);.    ass
18060 65 72 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20  ert( fd!=0 );.  
18070 20 20 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45    if( op==SQLITE
18080 5f 46 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e  _FCNTL_FILE_POIN
18090 54 45 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73  TER ){.      *(s
180a0 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41  qlite3_file**)pA
180b0 72 67 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72  rg = fd;.      r
180c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
180d0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d     }else if( fd-
180e0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
180f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18100 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c  sFileControl(fd,
18110 20 6f 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20   op, pArg);.    
18120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
18130 3d 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e  = SQLITE_NOTFOUN
18140 44 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  D;.    }.    sql
18150 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28 70  ite3BtreeLeave(p
18160 42 74 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71  Btree);.  }.  sq
18170 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
18180 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
18190 72 65 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a  return rc;   .}.
181a0 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65  ./*.** Interface
181b0 20 74 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20   to the testing 
181c0 6c 6f 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71  logic..*/.int sq
181d0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
181e0 6f 6c 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b  ol(int op, ...){
181f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23  .  int rc = 0;.#
18200 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
18210 49 54 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a  IT_BUILTIN_TEST.
18220 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
18230 76 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29  va_start(ap, op)
18240 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
18250 7b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  {..    /*.    **
18260 20 53 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   Save the curren
18270 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 50  t state of the P
18280 52 4e 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  RNG..    */.    
18290 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
182a0 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20  CTRL_PRNG_SAVE: 
182b0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
182c0 72 6e 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a  rngSaveState();.
182d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
182e0 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
182f0 2a 20 52 65 73 74 6f 72 65 20 74 68 65 20 73 74  * Restore the st
18300 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20  ate of the PRNG 
18310 74 6f 20 74 68 65 20 6c 61 73 74 20 73 74 61 74  to the last stat
18320 65 20 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20  e saved using.  
18330 20 20 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20    ** PRNG_SAVE. 
18340 20 49 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61   If PRNG_SAVE ha
18350 73 20 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62  s never before b
18360 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e  een called, then
18370 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72  .    ** this ver
18380 62 20 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47  b acts like PRNG
18390 5f 52 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20  _RESET..    */. 
183a0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
183b0 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
183c0 54 4f 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71  TORE: {.      sq
183d0 6c 69 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65  lite3PrngRestore
183e0 53 74 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62  State();.      b
183f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
18400 20 2f 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74   /*.    ** Reset
18410 20 74 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74   the PRNG back t
18420 6f 20 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69  o its uninitiali
18430 7a 65 64 20 73 74 61 74 65 2e 20 20 54 68 65 20  zed state.  The 
18440 6e 65 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  next call.    **
18450 20 74 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   to sqlite3_rand
18460 6f 6d 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65  omness() will re
18470 73 65 65 64 20 74 68 65 20 50 52 4e 47 20 75 73  seed the PRNG us
18480 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c  ing a single cal
18490 6c 0a 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20  l.    ** to the 
184a0 78 52 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68  xRandomness meth
184b0 6f 64 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c  od of the defaul
184c0 74 20 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20  t VFS..    */.  
184d0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
184e0 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45  STCTRL_PRNG_RESE
184f0 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
18500 65 33 50 72 6e 67 52 65 73 65 74 53 74 61 74 65  e3PrngResetState
18510 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ();.      break;
18520 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
18530 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
18540 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56  est_control(BITV
18550 45 43 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70  EC_TEST, size, p
18560 72 6f 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20  rogram).    **. 
18570 20 20 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74     ** Run a test
18580 20 61 67 61 69 6e 73 74 20 61 20 42 69 74 76 65   against a Bitve
18590 63 20 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65  c object of size
185a0 2e 20 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61  .  The program a
185b0 72 67 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69  rgument.    ** i
185c0 73 20 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e  s an array of in
185d0 74 65 67 65 72 73 20 74 68 61 74 20 64 65 66 69  tegers that defi
185e0 6e 65 73 20 74 68 65 20 74 65 73 74 2e 20 20 52  nes the test.  R
185f0 65 74 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20  eturn -1 on a.  
18600 20 20 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f    ** memory allo
18610 63 61 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20  cation error, 0 
18620 6f 6e 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e  on success, or n
18630 6f 6e 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65  on-zero for an e
18640 72 72 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65  rror..    ** See
18650 20 74 68 65 20 73 71 6c 69 74 65 33 42 69 74 76   the sqlite3Bitv
18660 65 63 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20  ecBuiltinTest() 
18670 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
18680 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20  nformation..    
18690 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
186a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56  TE_TESTCTRL_BITV
186b0 45 43 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20  EC_TEST: {.     
186c0 20 69 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67   int sz = va_arg
186d0 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
186e0 20 69 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61   int *aProg = va
186f0 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a  _arg(ap, int*);.
18700 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18710 65 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54  e3BitvecBuiltinT
18720 65 73 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a  est(sz, aProg);.
18730 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18740 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a   }..    /*.    *
18750 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
18760 63 6f 6e 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d  control(BENIGN_M
18770 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65  ALLOC_HOOKS, xBe
18780 67 69 6e 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a  gin, xEnd).    *
18790 2a 0a 20 20 20 20 2a 2a 20 52 65 67 69 73 74 65  *.    ** Registe
187a0 72 20 68 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20  r hooks to call 
187b0 74 6f 20 69 6e 64 69 63 61 74 65 20 77 68 69 63  to indicate whic
187c0 68 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75  h malloc() failu
187d0 72 65 73 20 0a 20 20 20 20 2a 2a 20 61 72 65 20  res .    ** are 
187e0 62 65 6e 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20  benign..    */. 
187f0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
18800 45 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d  ESTCTRL_BENIGN_M
18810 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20  ALLOC_HOOKS: {. 
18820 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
18830 64 20 28 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f  d (*void_functio
18840 6e 29 28 76 6f 69 64 29 3b 0a 20 20 20 20 20 20  n)(void);.      
18850 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42  void_function xB
18860 65 6e 69 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20  enignBegin;.    
18870 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20    void_function 
18880 78 42 65 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20  xBenignEnd;.    
18890 20 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d    xBenignBegin =
188a0 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
188b0 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20  _function);.    
188c0 20 20 78 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76    xBenignEnd = v
188d0 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66  a_arg(ap, void_f
188e0 75 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  unction);.      
188f0 73 71 6c 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c  sqlite3BenignMal
18900 6c 6f 63 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e  locHooks(xBenign
18910 42 65 67 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e  Begin, xBenignEn
18920 64 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  d);.      break;
18930 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
18940 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
18950 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
18960 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e 44  TE_TESTCTRL_PEND
18970 49 4e 47 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e  ING_BYTE, unsign
18980 65 64 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a  ed int X).    **
18990 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20  .    ** Set the 
189a0 50 45 4e 44 49 4e 47 20 62 79 74 65 20 74 6f 20  PENDING byte to 
189b0 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
189c0 20 61 72 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e   argument, if X>
189d0 30 2e 0a 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e  0..    ** Make n
189e0 6f 20 63 68 61 6e 67 65 73 20 69 66 20 58 3d 3d  o changes if X==
189f0 30 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 76  0.  Return the v
18a00 61 6c 75 65 20 6f 66 20 74 68 65 20 70 65 6e 64  alue of the pend
18a10 69 6e 67 20 62 79 74 65 0a 20 20 20 20 2a 2a 20  ing byte.    ** 
18a20 61 73 20 69 74 20 65 78 69 73 74 69 6e 67 20 62  as it existing b
18a30 65 66 6f 72 65 20 74 68 69 73 20 72 6f 75 74 69  efore this routi
18a40 6e 65 20 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20  ne was called.. 
18a50 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50     **.    ** IMP
18a60 4f 52 54 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e  ORTANT:  Changin
18a70 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
18a80 74 65 20 66 72 6f 6d 20 30 78 34 30 30 30 30 30  te from 0x400000
18a90 30 30 20 72 65 73 75 6c 74 73 20 69 6e 0a 20 20  00 results in.  
18aa0 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74    ** an incompat
18ab0 69 62 6c 65 20 64 61 74 61 62 61 73 65 20 66 69  ible database fi
18ac0 6c 65 20 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e  le format.  Chan
18ad0 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e 47  ging the PENDING
18ae0 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 77 68 69   byte.    ** whi
18af0 6c 65 20 61 6e 79 20 64 61 74 61 62 61 73 65 20  le any database 
18b00 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70  connection is op
18b10 65 6e 20 72 65 73 75 6c 74 73 20 69 6e 20 75 6e  en results in un
18b20 64 65 66 69 6e 65 64 20 61 6e 64 0a 20 20 20 20  defined and.    
18b30 2a 2a 20 64 69 6c 65 74 65 72 69 6f 75 73 20 62  ** dileterious b
18b40 65 68 61 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a  ehavior..    */.
18b50 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
18b60 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
18b70 5f 42 59 54 45 3a 20 7b 0a 20 20 20 20 20 20 72  _BYTE: {.      r
18b80 63 20 3d 20 50 45 4e 44 49 4e 47 5f 42 59 54 45  c = PENDING_BYTE
18b90 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
18ba0 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 20 20 20 20  _OMIT_WSD.      
18bb0 7b 0a 20 20 20 20 20 20 20 20 75 6e 73 69 67 6e  {.        unsign
18bc0 65 64 20 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20  ed int newVal = 
18bd0 76 61 5f 61 72 67 28 61 70 2c 20 75 6e 73 69 67  va_arg(ap, unsig
18be0 6e 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ned int);.      
18bf0 20 20 69 66 28 20 6e 65 77 56 61 6c 20 29 20 73    if( newVal ) s
18c00 71 6c 69 74 65 33 50 65 6e 64 69 6e 67 42 79 74  qlite3PendingByt
18c10 65 20 3d 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20  e = newVal;.    
18c20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
18c30 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
18c40 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
18c50 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
18c60 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
18c70 52 4c 5f 41 53 53 45 52 54 2c 20 69 6e 74 20 58  RL_ASSERT, int X
18c80 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ).    **.    ** 
18c90 54 68 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76  This action prov
18ca0 69 64 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20  ides a run-time 
18cb0 74 65 73 74 20 74 6f 20 73 65 65 20 77 68 65 74  test to see whet
18cc0 68 65 72 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a  her or not.    *
18cd0 2a 20 61 73 73 65 72 74 28 29 20 77 61 73 20 65  * assert() was e
18ce0 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c  nabled at compil
18cf0 65 2d 74 69 6d 65 2e 20 20 49 66 20 58 20 69 73  e-time.  If X is
18d00 20 74 72 75 65 20 61 6e 64 20 61 73 73 65 72 74   true and assert
18d10 28 29 0a 20 20 20 20 2a 2a 20 69 73 20 65 6e 61  ().    ** is ena
18d20 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72  bled, then the r
18d30 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
18d40 72 75 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  rue.  If X is tr
18d50 75 65 20 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73  ue and.    ** as
18d60 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c  sert() is disabl
18d70 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74  ed, then the ret
18d80 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65 72  urn value is zer
18d90 6f 2e 20 20 49 66 20 58 20 69 73 0a 20 20 20 20  o.  If X is.    
18da0 2a 2a 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  ** false and ass
18db0 65 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64  ert() is enabled
18dc0 2c 20 74 68 65 6e 20 74 68 65 20 61 73 73 65 72  , then the asser
18dd0 74 69 6f 6e 20 66 69 72 65 73 20 61 6e 64 20 74  tion fires and t
18de0 68 65 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73  he.    ** proces
18df0 73 20 61 62 6f 72 74 73 2e 20 20 49 66 20 58 20  s aborts.  If X 
18e00 69 73 20 66 61 6c 73 65 20 61 6e 64 20 61 73 73  is false and ass
18e10 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
18e20 64 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20  d, then the.    
18e30 2a 2a 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  ** return value 
18e40 69 73 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a  is zero..    */.
18e50 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
18e60 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54 3a  TESTCTRL_ASSERT:
18e70 20 7b 0a 20 20 20 20 20 20 76 6f 6c 61 74 69 6c   {.      volatil
18e80 65 20 69 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20  e int x = 0;.   
18e90 20 20 20 61 73 73 65 72 74 28 20 28 78 20 3d 20     assert( (x = 
18ea0 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 29 21  va_arg(ap,int))!
18eb0 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  =0 );.      rc =
18ec0 20 78 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   x;.      break;
18ed0 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a  .    }...    /*.
18ee0 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
18ef0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
18f00 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
18f10 41 59 53 2c 20 69 6e 74 20 58 29 0a 20 20 20 20  AYS, int X).    
18f20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 61  **.    ** This a
18f30 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20 61  ction provides a
18f40 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 74   run-time test t
18f50 6f 20 73 65 65 20 68 6f 77 20 74 68 65 20 41 4c  o see how the AL
18f60 57 41 59 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20  WAYS and.    ** 
18f70 4e 45 56 45 52 20 6d 61 63 72 6f 73 20 77 65 72  NEVER macros wer
18f80 65 20 64 65 66 69 6e 65 64 20 61 74 20 63 6f 6d  e defined at com
18f90 70 69 6c 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a  pile-time..    *
18fa0 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 74  *.    ** The ret
18fb0 75 72 6e 20 76 61 6c 75 65 20 69 73 20 41 4c 57  urn value is ALW
18fc0 41 59 53 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a  AYS(X).  .    **
18fd0 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f  .    ** The reco
18fe0 6d 6d 65 6e 64 65 64 20 74 65 73 74 20 69 73 20  mmended test is 
18ff0 58 3d 3d 32 2e 20 20 49 66 20 74 68 65 20 72 65  X==2.  If the re
19000 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 32 2c  turn value is 2,
19010 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 20 20   that means.    
19020 2a 2a 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20  ** ALWAYS() and 
19030 4e 45 56 45 52 28 29 20 61 72 65 20 62 6f 74 68  NEVER() are both
19040 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f   no-op pass-thro
19050 75 67 68 20 6d 61 63 72 6f 73 2c 20 77 68 69 63  ugh macros, whic
19060 68 20 69 73 20 74 68 65 0a 20 20 20 20 2a 2a 20  h is the.    ** 
19070 64 65 66 61 75 6c 74 20 73 65 74 74 69 6e 67 2e  default setting.
19080 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
19090 76 61 6c 75 65 20 69 73 20 31 2c 20 74 68 65 6e  value is 1, then
190a0 20 41 4c 57 41 59 53 28 29 20 69 73 20 65 69 74   ALWAYS() is eit
190b0 68 65 72 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d  her.    ** hard-
190c0 63 6f 64 65 64 20 74 6f 20 74 72 75 65 20 6f 72  coded to true or
190d0 20 65 6c 73 65 20 69 74 20 61 73 73 65 72 74 73   else it asserts
190e0 20 69 66 20 69 74 73 20 61 72 67 75 6d 65 6e 74   if its argument
190f0 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a   is false..    *
19100 2a 20 54 68 65 20 66 69 72 73 74 20 62 65 68 61  * The first beha
19110 76 69 6f 72 20 28 68 61 72 64 2d 63 6f 64 65 64  vior (hard-coded
19120 20 74 6f 20 74 72 75 65 29 20 69 73 20 74 68 65   to true) is the
19130 20 63 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20   case if.    ** 
19140 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
19150 41 53 53 45 52 54 20 73 68 6f 77 73 20 74 68 61  ASSERT shows tha
19160 74 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  t assert() is di
19170 73 61 62 6c 65 64 20 61 6e 64 20 74 68 65 20 73  sabled and the s
19180 65 63 6f 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68  econd.    ** beh
19190 61 76 69 6f 72 20 28 61 73 73 65 72 74 20 69 66  avior (assert if
191a0 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 74 6f   the argument to
191b0 20 41 4c 57 41 59 53 28 29 20 69 73 20 66 61 6c   ALWAYS() is fal
191c0 73 65 29 20 69 73 20 74 68 65 20 63 61 73 65 20  se) is the case 
191d0 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54 45  if.    ** SQLITE
191e0 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52 54  _TESTCTRL_ASSERT
191f0 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73 65   shows that asse
19200 72 74 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2e  rt() is enabled.
19210 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
19220 68 65 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74  he run-time test
19230 20 70 72 6f 63 65 64 75 72 65 20 6d 69 67 68 74   procedure might
19240 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20   look something 
19250 6c 69 6b 65 20 74 68 69 73 3a 0a 20 20 20 20 2a  like this:.    *
19260 2a 0a 20 20 20 20 2a 2a 20 20 20 20 69 66 28 20  *.    **    if( 
19270 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
19280 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
19290 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d  CTRL_ALWAYS, 2)=
192a0 3d 32 20 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20  =2 ){.    **    
192b0 20 20 2f 2f 20 41 4c 57 41 59 53 28 29 20 61 6e    // ALWAYS() an
192c0 64 20 4e 45 56 45 52 28 29 20 61 72 65 20 6e 6f  d NEVER() are no
192d0 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
192e0 20 6d 61 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20   macros.    **  
192f0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
19300 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
19310 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
19320 5f 41 53 53 45 52 54 2c 20 31 29 20 29 7b 0a 20  _ASSERT, 1) ){. 
19330 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c     **      // AL
19340 57 41 59 53 28 78 29 20 61 73 73 65 72 74 73 20  WAYS(x) asserts 
19350 74 68 61 74 20 78 20 69 73 20 74 72 75 65 2e 20  that x is true. 
19360 4e 45 56 45 52 28 78 29 20 61 73 73 65 72 74 73  NEVER(x) asserts
19370 20 78 20 69 73 20 66 61 6c 73 65 2e 0a 20 20 20   x is false..   
19380 20 2a 2a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   **    }else{.  
19390 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57    **      // ALW
193a0 41 59 53 28 78 29 20 69 73 20 61 20 63 6f 6e 73  AYS(x) is a cons
193b0 74 61 6e 74 20 31 2e 20 20 4e 45 56 45 52 28 78  tant 1.  NEVER(x
193c0 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
193d0 30 2e 0a 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20  0..    **    }. 
193e0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
193f0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
19400 4c 57 41 59 53 3a 20 7b 0a 20 20 20 20 20 20 69  LWAYS: {.      i
19410 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61 70  nt x = va_arg(ap
19420 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 72 63 20  ,int);.      rc 
19430 3d 20 41 4c 57 41 59 53 28 78 29 3b 0a 20 20 20  = ALWAYS(x);.   
19440 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19450 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65  .    /*   sqlite
19460 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
19470 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52  QLITE_TESTCTRL_R
19480 45 53 45 52 56 45 2c 20 73 71 6c 69 74 65 33 20  ESERVE, sqlite3 
19490 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
194a0 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 74 68  **.    ** Set th
194b0 65 20 6e 52 65 73 65 72 76 65 20 73 69 7a 65 20  e nReserve size 
194c0 74 6f 20 4e 20 66 6f 72 20 74 68 65 20 6d 61 69  to N for the mai
194d0 6e 20 64 61 74 61 62 61 73 65 20 6f 6e 20 74 68  n database on th
194e0 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 2a  e database.    *
194f0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e  * connection db.
19500 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
19510 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
19520 5f 52 45 53 45 52 56 45 3a 20 7b 0a 20 20 20 20  _RESERVE: {.    
19530 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
19540 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
19550 65 33 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20  e3*);.      int 
19560 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
19570 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
19580 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
19590 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20  ->mutex);.      
195a0 73 71 6c 69 74 65 33 42 74 72 65 65 53 65 74 50  sqlite3BtreeSetP
195b0 61 67 65 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b  ageSize(db->aDb[
195c0 30 5d 2e 70 42 74 2c 20 30 2c 20 78 2c 20 30 29  0].pBt, 0, x, 0)
195d0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
195e0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
195f0 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 62 72  mutex);.      br
19600 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
19610 2f 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  /*  sqlite3_test
19620 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
19630 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a  TESTCTRL_OPTIMIZ
19640 41 54 49 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20  ATIONS, sqlite3 
19650 2a 64 62 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20  *db, int N).    
19660 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65  **.    ** Enable
19670 20 6f 72 20 64 69 73 61 62 6c 65 20 76 61 72 69   or disable vari
19680 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
19690 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 70 75  s for testing pu
196a0 72 70 6f 73 65 73 2e 20 20 54 68 65 20 0a 20 20  rposes.  The .  
196b0 20 20 2a 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20    ** argument N 
196c0 69 73 20 61 20 62 69 74 6d 61 73 6b 20 6f 66 20  is a bitmask of 
196d0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f  optimizations to
196e0 20 62 65 20 64 69 73 61 62 6c 65 64 2e 20 20 46   be disabled.  F
196f0 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a  or normal.    **
19700 20 6f 70 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f   operation N sho
19710 75 6c 64 20 62 65 20 30 2e 20 20 54 68 65 20 69  uld be 0.  The i
19720 64 65 61 20 69 73 20 74 68 61 74 20 61 20 74 65  dea is that a te
19730 73 74 20 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65  st program (like
19740 20 74 68 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20   the.    ** SQL 
19750 4c 6f 67 69 63 20 54 65 73 74 20 6f 72 20 53 4c  Logic Test or SL
19760 54 20 74 65 73 74 20 6d 6f 64 75 6c 65 29 20 63  T test module) c
19770 61 6e 20 72 75 6e 20 74 68 65 20 73 61 6d 65 20  an run the same 
19780 53 51 4c 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d  SQL multiple tim
19790 65 73 0a 20 20 20 20 2a 2a 20 77 69 74 68 20 76  es.    ** with v
197a0 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74  arious optimizat
197b0 69 6f 6e 73 20 64 69 73 61 62 6c 65 64 20 74 6f  ions disabled to
197c0 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
197d0 20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 20   same answer.   
197e0 20 2a 2a 20 69 73 20 6f 62 74 61 69 6e 65 64 20   ** is obtained 
197f0 69 6e 20 65 76 65 72 79 20 63 61 73 65 2e 0a 20  in every case.. 
19800 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
19810 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f  QLITE_TESTCTRL_O
19820 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a  PTIMIZATIONS: {.
19830 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
19840 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
19850 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
19860 64 62 2d 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d  db->dbOptFlags =
19870 20 28 75 31 36 29 28 76 61 5f 61 72 67 28 61 70   (u16)(va_arg(ap
19880 2c 20 69 6e 74 29 20 26 20 30 78 66 66 66 66 29  , int) & 0xffff)
19890 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
198a0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
198b0 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20  ITE_N_KEYWORD.  
198c0 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
198d0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
198e0 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57  _TESTCTRL_ISKEYW
198f0 4f 52 44 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ORD, const char 
19900 2a 7a 57 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20  *zWord).    **. 
19910 20 20 20 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69     ** If zWord i
19920 73 20 61 20 6b 65 79 77 6f 72 64 20 72 65 63 6f  s a keyword reco
19930 67 6e 69 7a 65 64 20 62 79 20 74 68 65 20 70 61  gnized by the pa
19940 72 73 65 72 2c 20 74 68 65 6e 20 72 65 74 75 72  rser, then retur
19950 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  n the.    ** num
19960 62 65 72 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e  ber of keywords.
19970 20 20 4f 72 20 69 66 20 7a 57 6f 72 64 20 69 73    Or if zWord is
19980 20 6e 6f 74 20 61 20 6b 65 79 77 6f 72 64 2c 20   not a keyword, 
19990 72 65 74 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a  return 0..    **
199a0 20 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 74 65   .    ** This te
199b0 73 74 20 66 65 61 74 75 72 65 20 69 73 20 6f 6e  st feature is on
199c0 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  ly available in 
199d0 74 68 65 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e  the amalgamation
199e0 20 73 69 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68   since.    ** th
199f0 65 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f  e SQLITE_N_KEYWO
19a00 52 44 20 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20  RD macro is not 
19a10 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20  defined in this 
19a20 66 69 6c 65 20 69 66 20 53 51 4c 69 74 65 0a 20  file if SQLite. 
19a30 20 20 20 2a 2a 20 69 73 20 62 75 69 6c 74 20 75     ** is built u
19a40 73 69 6e 67 20 73 65 70 61 72 61 74 65 20 73 6f  sing separate so
19a50 75 72 63 65 20 66 69 6c 65 73 2e 0a 20 20 20 20  urce files..    
19a60 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
19a70 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45  TE_TESTCTRL_ISKE
19a80 59 57 4f 52 44 3a 20 7b 0a 20 20 20 20 20 20 63  YWORD: {.      c
19a90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72 64  onst char *zWord
19aa0 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 63 6f   = va_arg(ap, co
19ab0 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 20  nst char*);.    
19ac0 20 20 69 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65    int n = sqlite
19ad0 33 53 74 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29  3Strlen30(zWord)
19ae0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 28 73 71  ;.      rc = (sq
19af0 6c 69 74 65 33 4b 65 79 77 6f 72 64 43 6f 64 65  lite3KeywordCode
19b00 28 28 75 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21  ((u8*)zWord, n)!
19b10 3d 54 4b 5f 49 44 29 20 3f 20 53 51 4c 49 54 45  =TK_ID) ? SQLITE
19b20 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a  _N_KEYWORD : 0;.
19b30 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19b40 20 7d 0a 23 65 6e 64 69 66 20 0a 0a 20 20 20 20   }.#endif ..    
19b50 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
19b60 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
19b70 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d  ESTCTRL_SCRATCHM
19b80 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77  ALLOC, sz, &pNew
19b90 2c 20 70 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a  , pFree);.    **
19ba0 0a 20 20 20 20 2a 2a 20 50 61 73 73 20 70 46 72  .    ** Pass pFr
19bb0 65 65 20 69 6e 74 6f 20 73 71 6c 69 74 65 33 53  ee into sqlite3S
19bc0 63 72 61 74 63 68 46 72 65 65 28 29 2e 20 0a 20  cratchFree(). . 
19bd0 20 20 20 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68     ** If sz>0 th
19be0 65 6e 20 61 6c 6c 6f 63 61 74 65 20 61 20 73 63  en allocate a sc
19bf0 72 61 74 63 68 20 62 75 66 66 65 72 20 69 6e 74  ratch buffer int
19c00 6f 20 70 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f  o pNew.  .    */
19c10 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19c20 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41 54 43  _TESTCTRL_SCRATC
19c30 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20  HMALLOC: {.     
19c40 20 76 6f 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a   void *pFree, **
19c50 70 70 4e 65 77 3b 0a 20 20 20 20 20 20 69 6e 74  ppNew;.      int
19c60 20 73 7a 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20   sz;.      sz = 
19c70 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
19c80 0a 20 20 20 20 20 20 70 70 4e 65 77 20 3d 20 76  .      ppNew = v
19c90 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a  a_arg(ap, void**
19ca0 29 3b 0a 20 20 20 20 20 20 70 46 72 65 65 20 3d  );.      pFree =
19cb0 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
19cc0 2a 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a  *);.      if( sz
19cd0 20 29 20 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69   ) *ppNew = sqli
19ce0 74 65 33 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63  te3ScratchMalloc
19cf0 28 73 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  (sz);.      sqli
19d00 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 70  te3ScratchFree(p
19d10 46 72 65 65 29 3b 0a 20 20 20 20 20 20 62 72 65  Free);.      bre
19d20 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
19d30 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
19d40 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
19d50 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
19d60 4d 45 5f 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e  ME_FAULT, int on
19d70 6f 66 66 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  off);.    **.   
19d80 20 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72   ** If parameter
19d90 20 6f 6e 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65   onoff is non-ze
19da0 72 6f 2c 20 63 6f 6e 66 69 67 75 72 65 20 74 68  ro, configure th
19db0 65 20 77 72 61 70 70 65 72 73 20 73 6f 20 74 68  e wrappers so th
19dc0 61 74 20 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75  at all.    ** su
19dd0 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
19de0 6f 20 6c 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e  o localtime() an
19df0 64 20 76 61 72 69 61 6e 74 73 20 66 61 69 6c 2e  d variants fail.
19e00 20 49 66 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72   If onoff is zer
19e10 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74  o,.    ** undo t
19e20 68 69 73 20 73 65 74 74 69 6e 67 2e 0a 20 20 20  his setting..   
19e30 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
19e40 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
19e50 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a  ALTIME_FAULT: {.
19e60 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
19e70 62 61 6c 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c  balConfig.bLocal
19e80 74 69 6d 65 46 61 75 6c 74 20 3d 20 76 61 5f 61  timeFault = va_a
19e90 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
19ea0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19eb0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
19ec0 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f  ITE_ENABLE_TREE_
19ed0 45 58 50 4c 41 49 4e 29 0a 20 20 20 20 2f 2a 20  EXPLAIN).    /* 
19ee0 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
19ef0 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
19f00 53 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53  STCTRL_EXPLAIN_S
19f10 54 4d 54 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20  TMT,.    **     
19f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19f30 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a     sqlite3_stmt*
19f40 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a  ,const char**);.
19f50 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
19f60 20 63 6f 6d 70 69 6c 65 64 20 77 69 74 68 20 53   compiled with S
19f70 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45  QLITE_ENABLE_TRE
19f80 45 5f 45 58 50 4c 41 49 4e 2c 20 65 61 63 68 20  E_EXPLAIN, each 
19f90 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 68 6f 6c  sqlite3_stmt hol
19fa0 64 73 0a 20 20 20 20 2a 2a 20 61 20 73 74 72 69  ds.    ** a stri
19fb0 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62 65  ng that describe
19fc0 73 20 74 68 65 20 6f 70 74 69 6d 69 7a 65 64 20  s the optimized 
19fd0 70 61 72 73 65 20 74 72 65 65 2e 20 20 54 68 69  parse tree.  Thi
19fe0 73 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20  s test-control. 
19ff0 20 20 20 2a 2a 20 72 65 74 75 72 6e 73 20 61 20     ** returns a 
1a000 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 61 74 20  pointer to that 
1a010 73 74 72 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  string..    */. 
1a020 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1a030 45 53 54 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f  ESTCTRL_EXPLAIN_
1a040 53 54 4d 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  STMT: {.      sq
1a050 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
1a060 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  t = va_arg(ap, s
1a070 71 6c 69 74 65 33 5f 73 74 6d 74 2a 29 3b 0a 20  qlite3_stmt*);. 
1a080 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
1a090 2a 2a 70 7a 52 65 74 20 3d 20 76 61 5f 61 72 67  **pzRet = va_arg
1a0a0 28 61 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a  (ap, const char*
1a0b0 2a 29 3b 0a 20 20 20 20 20 20 2a 70 7a 52 65 74  *);.      *pzRet
1a0c0 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 45 78   = sqlite3VdbeEx
1a0d0 70 6c 61 6e 61 74 69 6f 6e 28 28 56 64 62 65 2a  planation((Vdbe*
1a0e0 29 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 62  )pStmt);.      b
1a0f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1a100 69 66 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c  if..    /*   sql
1a110 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
1a120 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
1a130 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54 2c  L_NEVER_CORRUPT,
1a140 20 69 6e 74 29 3b 0a 20 20 20 20 2a 2a 0a 20 20   int);.    **.  
1a150 20 20 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61    ** Set or clea
1a160 72 20 61 20 66 6c 61 67 20 74 68 61 74 20 69 6e  r a flag that in
1a170 64 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65  dicates that the
1a180 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
1a190 73 20 61 6c 77 61 79 73 20 77 65 6c 6c 2d 0a 20  s always well-. 
1a1a0 20 20 20 2a 2a 20 66 6f 72 6d 65 64 20 61 6e 64     ** formed and
1a1b0 20 6e 65 76 65 72 20 63 6f 72 72 75 70 74 2e 20   never corrupt. 
1a1c0 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 63 6c   This flag is cl
1a1d0 65 61 72 20 62 79 20 64 65 66 61 75 6c 74 2c 20  ear by default, 
1a1e0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 0a  indicating that.
1a1f0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
1a200 66 69 6c 65 73 20 6d 69 67 68 74 20 68 61 76 65  files might have
1a210 20 61 72 62 69 74 72 61 72 79 20 63 6f 72 72 75   arbitrary corru
1a220 70 74 69 6f 6e 2e 20 20 53 65 74 74 69 6e 67 20  ption.  Setting 
1a230 74 68 65 20 66 6c 61 67 20 64 75 72 69 6e 67 0a  the flag during.
1a240 20 20 20 20 2a 2a 20 74 65 73 74 69 6e 67 20 63      ** testing c
1a250 61 75 73 65 73 20 63 65 72 74 61 69 6e 20 61 73  auses certain as
1a260 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
1a270 73 20 69 6e 20 74 68 65 20 63 6f 64 65 20 74 6f  s in the code to
1a280 20 62 65 20 61 63 74 69 76 61 74 65 64 0a 20 20   be activated.  
1a290 20 20 2a 2a 20 74 68 61 74 20 64 65 6d 6f 6e 73    ** that demons
1a2a0 74 72 61 74 20 69 6e 76 61 72 69 61 6e 74 73 20  trat invariants 
1a2b0 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 64  on well-formed d
1a2c0 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 0a 20  atabase files.. 
1a2d0 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53     */.    case S
1a2e0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e  QLITE_TESTCTRL_N
1a2f0 45 56 45 52 5f 43 4f 52 52 55 50 54 3a 20 7b 0a  EVER_CORRUPT: {.
1a300 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6e        sqlite3Con
1a310 66 69 67 2e 6e 65 76 65 72 43 6f 72 72 75 70 74  fig.neverCorrupt
1a320 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
1a330 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
1a340 0a 20 20 20 20 7d 0a 0a 20 20 7d 0a 20 20 76 61  .    }..  }.  va
1a350 5f 65 6e 64 28 61 70 29 3b 0a 23 65 6e 64 69 66  _end(ap);.#endif
1a360 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
1a370 42 55 49 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a  BUILTIN_TEST */.
1a380 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1a390 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
1a3a0 75 74 69 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c  utility routine,
1a3b0 20 75 73 65 66 75 6c 20 74 6f 20 56 46 53 20 69   useful to VFS i
1a3c0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20  mplementations, 
1a3d0 74 68 61 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74  that checks.** t
1a3e0 6f 20 73 65 65 20 69 66 20 61 20 64 61 74 61 62  o see if a datab
1a3f0 61 73 65 20 66 69 6c 65 20 77 61 73 20 61 20 55  ase file was a U
1a400 52 49 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 65  RI that containe
1a410 64 20 61 20 73 70 65 63 69 66 69 63 20 71 75 65  d a specific que
1a420 72 79 20 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72  ry .** parameter
1a430 2c 20 61 6e 64 20 69 66 20 73 6f 20 6f 62 74 61  , and if so obta
1a440 69 6e 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ins the value of
1a450 20 74 68 65 20 71 75 65 72 79 20 70 61 72 61 6d   the query param
1a460 65 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  eter..**.** The 
1a470 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65  zFilename argume
1a480 6e 74 20 69 73 20 74 68 65 20 66 69 6c 65 6e 61  nt is the filena
1a490 6d 65 20 70 6f 69 6e 74 65 72 20 70 61 73 73 65  me pointer passe
1a4a0 64 20 69 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e  d into the xOpen
1a4b0 28 29 0a 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20  ().** method of 
1a4c0 61 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61  a VFS implementa
1a4d0 74 69 6f 6e 2e 20 20 54 68 65 20 7a 50 61 72 61  tion.  The zPara
1a4e0 6d 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68  m argument is th
1a4f0 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a  e name of the.**
1a500 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72   query parameter
1a510 20 77 65 20 73 65 65 6b 2e 20 20 54 68 69 73 20   we seek.  This 
1a520 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
1a530 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
1a540 20 7a 50 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d   zParam.** param
1a550 65 74 65 72 20 69 66 20 69 74 20 65 78 69 73 74  eter if it exist
1a560 73 2e 20 20 49 66 20 74 68 65 20 70 61 72 61 6d  s.  If the param
1a570 65 74 65 72 20 64 6f 65 73 20 6e 6f 74 20 65 78  eter does not ex
1a580 69 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ist, this routin
1a590 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 4e  e.** returns a N
1a5a0 55 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a  ULL pointer..*/.
1a5b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
1a5c0 74 65 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65  te3_uri_paramete
1a5d0 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  r(const char *zF
1a5e0 69 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63  ilename, const c
1a5f0 68 61 72 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20  har *zParam){.  
1a600 69 66 28 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30  if( zFilename==0
1a610 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
1a620 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
1a630 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
1a640 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68  ename) + 1;.  wh
1a650 69 6c 65 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  ile( zFilename[0
1a660 5d 20 29 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d  ] ){.    int x =
1a670 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
1a680 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20  e, zParam);.    
1a690 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c  zFilename += sql
1a6a0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69  ite3Strlen30(zFi
1a6b0 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20  lename) + 1;.   
1a6c0 20 69 66 28 20 78 3d 3d 30 20 29 20 72 65 74 75   if( x==0 ) retu
1a6d0 72 6e 20 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  rn zFilename;.  
1a6e0 20 20 7a 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73    zFilename += s
1a6f0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
1a700 46 69 6c 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20  Filename) + 1;. 
1a710 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
1a720 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
1a730 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66   boolean value f
1a740 6f 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d  or a query param
1a750 65 74 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  eter..*/.int sql
1a760 69 74 65 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e  ite3_uri_boolean
1a770 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1a780 6c 65 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68  lename, const ch
1a790 61 72 20 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20  ar *zParam, int 
1a7a0 62 44 66 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20  bDflt){.  const 
1a7b0 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65  char *z = sqlite
1a7c0 33 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28  3_uri_parameter(
1a7d0 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61  zFilename, zPara
1a7e0 6d 29 3b 0a 20 20 62 44 66 6c 74 20 3d 20 62 44  m);.  bDflt = bD
1a7f0 66 6c 74 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e  flt!=0;.  return
1a800 20 7a 20 3f 20 73 71 6c 69 74 65 33 47 65 74 42   z ? sqlite3GetB
1a810 6f 6f 6c 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29  oolean(z, bDflt)
1a820 20 3a 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a   : bDflt;.}../*.
1a830 2a 2a 20 52 65 74 75 72 6e 20 61 20 36 34 2d 62  ** Return a 64-b
1a840 69 74 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  it integer value
1a850 20 66 6f 72 20 61 20 71 75 65 72 79 20 70 61 72   for a query par
1a860 61 6d 65 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74  ameter..*/.sqlit
1a870 65 33 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  e3_int64 sqlite3
1a880 5f 75 72 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f  _uri_int64(.  co
1a890 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1a8a0 61 6d 65 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e  ame,    /* Filen
1a8b0 61 6d 65 20 61 73 20 70 61 73 73 65 64 20 74 6f  ame as passed to
1a8c0 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73   xOpen */.  cons
1a8d0 74 20 63 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20  t char *zParam, 
1a8e0 20 20 20 20 20 20 2f 2a 20 55 52 49 20 70 61 72        /* URI par
1a8f0 61 6d 65 74 65 72 20 73 6f 75 67 68 74 20 2a 2f  ameter sought */
1a900 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1a910 20 62 44 66 6c 74 20 20 20 20 20 20 20 2f 2a 20   bDflt       /* 
1a920 72 65 74 75 72 6e 20 69 66 20 70 61 72 61 6d 65  return if parame
1a930 74 65 72 20 69 73 20 6d 69 73 73 69 6e 67 20 2a  ter is missing *
1a940 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  /.){.  const cha
1a950 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75  r *z = sqlite3_u
1a960 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69  ri_parameter(zFi
1a970 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
1a980 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
1a990 20 76 3b 0a 20 20 69 66 28 20 7a 20 26 26 20 73   v;.  if( z && s
1a9a0 71 6c 69 74 65 33 41 74 6f 69 36 34 28 7a 2c 20  qlite3Atoi64(z, 
1a9b0 26 76 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65  &v, sqlite3Strle
1a9c0 6e 33 30 28 7a 29 2c 20 53 51 4c 49 54 45 5f 55  n30(z), SQLITE_U
1a9d0 54 46 38 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  TF8)==SQLITE_OK 
1a9e0 29 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76  ){.    bDflt = v
1a9f0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62  ;.  }.  return b
1aa00 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Dflt;.}../*.** R
1aa10 65 74 75 72 6e 20 74 68 65 20 42 74 72 65 65 20  eturn the Btree 
1aa20 70 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69  pointer identifi
1aa30 65 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20  ed by zDbName.  
1aa40 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e  Return NULL if n
1aa50 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72  ot found..*/.Btr
1aa60 65 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d  ee *sqlite3DbNam
1aa70 65 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33  eToBtree(sqlite3
1aa80 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
1aa90 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e   *zDbName){.  in
1aaa0 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
1aab0 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
1aac0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62  .    if( db->aDb
1aad0 5b 69 5d 2e 70 42 74 0a 20 20 20 20 20 26 26 20  [i].pBt.     && 
1aae0 28 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73  (zDbName==0 || s
1aaf0 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44  qlite3StrICmp(zD
1ab00 62 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69  bName, db->aDb[i
1ab10 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a 20 20 20  ].zName)==0).   
1ab20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
1ab30 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
1ab40 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
1ab50 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
1ab60 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 6e  Return the filen
1ab70 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1ab80 61 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ase associated w
1ab90 69 74 68 20 61 20 64 61 74 61 62 61 73 65 0a 2a  ith a database.*
1aba0 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  * connection..*/
1abb0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1abc0 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65  ite3_db_filename
1abd0 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f  (sqlite3 *db, co
1abe0 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d  nst char *zDbNam
1abf0 65 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74  e){.  Btree *pBt
1ac00 20 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65   = sqlite3DbName
1ac10 54 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e  ToBtree(db, zDbN
1ac20 61 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ame);.  return p
1ac30 42 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65  Bt ? sqlite3Btre
1ac40 65 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42 74  eGetFilename(pBt
1ac50 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ) : 0;.}../*.** 
1ac60 52 65 74 75 72 6e 20 31 20 69 66 20 64 61 74 61  Return 1 if data
1ac70 62 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c  base is read-onl
1ac80 79 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f 77  y or 0 if read/w
1ac90 72 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d 31  rite.  Return -1
1aca0 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64   if.** no such d
1acb0 61 74 61 62 61 73 65 20 65 78 69 73 74 73 2e 0a  atabase exists..
1acc0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64  */.int sqlite3_d
1acd0 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74  b_readonly(sqlit
1ace0 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68  e3 *db, const ch
1acf0 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20  ar *zDbName){.  
1ad00 42 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71 6c  Btree *pBt = sql
1ad10 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
1ad20 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a  e(db, zDbName);.
1ad30 20 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73    return pBt ? s
1ad40 71 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61  qlite3PagerIsrea
1ad50 64 6f 6e 6c 79 28 73 71 6c 69 74 65 33 42 74 72  donly(sqlite3Btr
1ad60 65 65 50 61 67 65 72 28 70 42 74 29 29 20 3a 20  eePager(pBt)) : 
1ad70 2d 31 3b 0a 7d 0a                                -1;.}.