SQLITE_NOTICE(283): recovered 1 frames from WAL file /fossil/sqlite.fossil-wal

SQLite: Hex Artifact Content
/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 0548b69c5a5f2a8e69788bda36d04e8e5f3e2760:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66  u.h".#endif..#if
0320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0330: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0340: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0350: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0360: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0370: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0380: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
0390: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
03a0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
03b0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03d0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03e0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
03f0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0400: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0410: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0420: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0430: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0450: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0460: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0470: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0480: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0490: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
04a0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
04b0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
04c0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
04d0: 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30 30  F: R-63124-39300
04e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
04f0: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0500: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0510: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0520: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0530: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0540: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0550: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0560: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0570: 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ro. .*/.const ch
0580: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72  ar *sqlite3_sour
0590: 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74 75  ceid(void){ retu
05a0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  rn SQLITE_SOURCE
05b0: 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45  _ID; }../* IMPLE
05c0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
05d0: 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65 20  35210-63508 The 
05e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
05f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e 63  on_number() func
0600: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
0610: 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61 6c  an integer equal
0620: 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53 49   to SQLITE_VERSI
0630: 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e  ON_NUMBER..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  t sqlite3_libver
0650: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64  sion_number(void
0660: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0670: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b  _VERSION_NUMBER;
0680: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0690: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30 37 39  ATION-OF: R-2079
06a0: 30 2d 31 34 30 32 35 20 54 68 65 20 73 71 6c 69  0-14025 The sqli
06b0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
06c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
06d0: 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64  s.** zero if and
06e0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65 20   only if SQLite 
06f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
0700: 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64 65 20  h mutexing code 
0710: 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f 0a 2a  omitted due to.*
0720: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  * the SQLITE_THR
0730: 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c 65 2d  EADSAFE compile-
0740: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65 69 6e  time option bein
0750: 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69  g set to 0..*/.i
0760: 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  nt sqlite3_threa
0770: 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65 74  dsafe(void){ ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45 41  urn SQLITE_THREA
0790: 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21 64  DSAFE; }..#if !d
07a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
07b0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
07c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
07d0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
07e0: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
07f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  ng function poin
0800: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
0810: 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45  and if.** SQLITE
0820: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
0830: 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
0840: 20 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69   messages descri
0850: 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69  bing.** I/O acti
0860: 76 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75  ve are written u
0870: 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  sing this functi
0880: 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61  on.  These messa
0890: 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  ges.** are inten
08a0: 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ded for debuggin
08b0: 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e  g activity only.
08c0: 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c 69 74  .*/.void (*sqlit
08d0: 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74  e3IoTrace)(const
08e0: 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30   char*, ...) = 0
08f0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
0900: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0910: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0920: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0930: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0940: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0950: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0960: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0970: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0980: 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  re.** temporary 
0990: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  files..**.** See
09a0: 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d   also the "PRAGM
09b0: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
09c0: 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d  ectory" SQL comm
09d0: 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  and..*/.char *sq
09e0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
09f0: 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  tory = 0;../*.**
0a00: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
0a10: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
0a20: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
0a30: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
0a40: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
0a50: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
0a60: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
0a70: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
0a80: 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62  ore.** all datab
0a90: 61 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66  ase files specif
0aa0: 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74  ied with a relat
0ab0: 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a  ive pathname..**
0ac0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
0ad0: 20 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74   "PRAGMA data_st
0ae0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
0af0: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
0b00: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74  har *sqlite3_dat
0b10: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
0b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0b30: 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a  ze SQLite.  .**.
0b40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0b50: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74  must be called t
0b60: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
0b70: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0b80: 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20  on,.** VFS, and 
0b90: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73  mutex subsystems
0ba0: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
0bb0: 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b  any serious work
0bc0: 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e   with.** SQLite.
0bd0: 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73    But as long as
0be0: 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70   you do not comp
0bf0: 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ile with SQLITE_
0c00: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a  OMIT_AUTOINIT.**
0c10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
0c20: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74  ll be called aut
0c30: 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65  omatically by ke
0c40: 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20  y routines such 
0c50: 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70  as.** sqlite3_op
0c60: 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  en().  .**.** Th
0c70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
0c80: 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20  no-op except on 
0c90: 69 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63  its very first c
0ca0: 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63  all for the proc
0cb0: 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74  ess,.** or for t
0cc0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66  he first call af
0cd0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
0ce0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a  lite3_shutdown..
0cf0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
0d00: 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74  thread to call t
0d10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
0d20: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0d30: 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65  ion to.** comple
0d40: 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71  tion.  If subseq
0d50: 75 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c  uent threads cal
0d60: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  l this routine b
0d70: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
0d80: 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69  ** thread has fi
0d90: 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69  nished the initi
0da0: 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73  alization proces
0db0: 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73  s, then the subs
0dc0: 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64  equent.** thread
0dd0: 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74  s must block unt
0de0: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72  il the first thr
0df0: 65 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74  ead finishes wit
0e00: 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  h the initializa
0e10: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
0e20: 66 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67  first thread mig
0e30: 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ht call this rou
0e40: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
0e50: 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20  .  Recursive.** 
0e60: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f  calls to this ro
0e70: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
0e80: 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73   block, of cours
0e90: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
0ea0: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  e.** initializat
0eb0: 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c  ion process woul
0ec0: 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65  d never complete
0ed0: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65  ..**.** Let X be
0ee0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61   the first threa
0ef0: 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20  d to enter this 
0f00: 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20  routine.  Let Y 
0f10: 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  be some other.**
0f20: 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77   thread.  Then w
0f30: 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c  hile the initial
0f40: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
0f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58  his routine by X
0f60: 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74   is.** incomplet
0f70: 65 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65  e, it is require
0f80: 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  d that:.**.**   
0f90: 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69   *  Calls to thi
0fa0: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59  s routine from Y
0fb0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fc0: 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74  l the outer-most
0fd0: 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62  .**       call b
0fe0: 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a  y X completes..*
0ff0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72  *.**    *  Recur
1000: 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68  sive calls to th
1010: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  is routine from 
1020: 74 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20  thread X return 
1030: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
1040: 20 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f       without blo
1050: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
1060: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1070: 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f  (void){.  MUTEX_
1080: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
1090: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
10a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
10b0: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
10c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1100: 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
1110: 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72 63  TE_OMIT_WSD.  rc
1120: 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f 69   = sqlite3_wsd_i
1130: 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a 20  nit(4096, 24);. 
1140: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1150: 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
1160: 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   rc;.  }.#endif.
1170: 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65 20  .  /* If SQLite 
1180: 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70 6c  is already compl
1190: 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a 65  etely initialize
11a0: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  d, then this cal
11b0: 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65  l.  ** to sqlite
11c0: 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20 73  3_initialize() s
11d0: 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f 70  hould be a no-op
11e0: 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74 69  .  But the initi
11f0: 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20 6d  alization.  ** m
1200: 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65 2e  ust be complete.
1210: 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73 74    So isInit must
1220: 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74 69   not be set unti
1230: 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a 20  l the very end. 
1240: 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75 74   ** of this rout
1250: 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ine..  */.  if( 
1260: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1270: 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65 74  fig.isInit ) ret
1280: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  urn SQLITE_OK;..
1290: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
12a0: 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 7b 0a  ABLE_SQLLOG.  {.
12b0: 20 20 20 20 65 78 74 65 72 6e 20 76 6f 69 64 20      extern void 
12c0: 73 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c  sqlite3_init_sql
12d0: 6c 6f 67 28 76 6f 69 64 29 3b 0a 20 20 20 20 73  log(void);.    s
12e0: 71 6c 69 74 65 33 5f 69 6e 69 74 5f 73 71 6c 6c  qlite3_init_sqll
12f0: 6f 67 28 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  og();.  }.#endif
1300: 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1310: 20 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79   the mutex subsy
1320: 73 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69  stem is initiali
1330: 7a 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20  zed.  If unable 
1340: 74 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c  to .  ** initial
1350: 69 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75  ize the mutex su
1360: 62 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20  bsystem, return 
1370: 65 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65  early with the e
1380: 72 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68  rror..  ** If th
1390: 65 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73  e system is so s
13a0: 69 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20  ick that we are 
13b0: 75 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61  unable to alloca
13c0: 74 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a  te a mutex,.  **
13d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75   there is not mu
13e0: 63 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69  ch SQLite is goi
13f0: 6e 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f  ng to be able to
1400: 20 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54   do..  **.  ** T
1410: 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74  he mutex subsyst
1420: 65 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72  em must take car
1430: 65 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67  e of serializing
1440: 20 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e   its own.  ** in
1450: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20  itialization..  
1460: 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  */.  rc = sqlite
1470: 33 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20  3MutexInit();.  
1480: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
1490: 72 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61  rc;..  /* Initia
14a0: 6c 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28  lize the malloc(
14b0: 29 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65  ) system and the
14c0: 20 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74   recursive pInit
14d0: 4d 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a  Mutex mutex..  *
14e0: 2a 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e  * This operation
14f0: 20 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79   is protected by
1500: 20 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54   the STATIC_MAST
1510: 45 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20  ER mutex.  Note 
1520: 74 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41  that.  ** MutexA
1530: 6c 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64  lloc() is called
1540: 20 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75   for a static mu
1550: 74 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69  tex prior to ini
1560: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20  tializing the.  
1570: 2a 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  ** malloc subsys
1580: 74 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69  tem - this impli
1590: 65 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f  es that the allo
15a0: 63 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74  cation of a stat
15b0: 69 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75  ic.  ** mutex mu
15c0: 73 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73  st not require s
15d0: 75 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20  upport from the 
15e0: 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d  malloc subsystem
15f0: 2e 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c  ..  */.  MUTEX_L
1600: 4f 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20  OGIC( pMaster = 
1610: 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f  sqlite3MutexAllo
1620: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
1630: 54 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29  TATIC_MASTER); )
1640: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
1650: 5f 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b  _enter(pMaster);
1660: 0a 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  .  sqlite3Global
1670: 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e  Config.isMutexIn
1680: 69 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73  it = 1;.  if( !s
1690: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
16a0: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
16b0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
16c0: 74 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b  te3MallocInit();
16d0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
16e0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16f0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
1700: 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74  fig.isMallocInit
1710: 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73   = 1;.    if( !s
1720: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1730: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b  ig.pInitMutex ){
1740: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
1750: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
1760: 4d 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20  Mutex =.        
1770: 20 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41     sqlite3MutexA
1780: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1790: 58 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20  X_RECURSIVE);.  
17a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47      if( sqlite3G
17b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72  lobalConfig.bCor
17c0: 65 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74  eMutex && !sqlit
17d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
17e0: 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20  InitMutex ){.   
17f0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1800: 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a  _NOMEM;.      }.
1810: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
1820: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1830: 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62  .    sqlite3Glob
1840: 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69  alConfig.nRefIni
1850: 74 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20  tMutex++;.  }.  
1860: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1870: 61 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20  ave(pMaster);.. 
1880: 20 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74   /* If rc is not
1890: 20 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68   SQLITE_OK at th
18a0: 69 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65  is point, then e
18b0: 69 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63  ither the malloc
18c0: 0a 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20  .  ** subsystem 
18d0: 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69  could not be ini
18e0: 74 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20  tialized or the 
18f0: 73 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f  system failed to
1900: 20 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74   allocate.  ** t
1910: 68 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75  he pInitMutex mu
1920: 74 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  tex. Return an e
1930: 72 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63  rror in either c
1940: 61 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72  ase.  */.  if( r
1950: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1960: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1970: 20 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20   }..  /* Do the 
1980: 72 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74  rest of the init
1990: 69 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72  ialization under
19a0: 20 74 68 65 20 72 65 63 75 72 73 69 76 65 20 6d   the recursive m
19b0: 75 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61  utex so.  ** tha
19c0: 74 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c  t we will be abl
19d0: 65 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75  e to handle recu
19e0: 72 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f  rsive calls into
19f0: 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e  .  ** sqlite3_in
1a00: 69 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65  itialize().  The
1a10: 20 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73   recursive calls
1a20: 20 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74   normally come t
1a30: 68 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69  hrough.  ** sqli
1a40: 74 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68  te3_os_init() wh
1a50: 65 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71  en it invokes sq
1a60: 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
1a70: 65 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a  er(), but other.
1a80: 20 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63    ** recursive c
1a90: 61 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20  alls might also 
1aa0: 62 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a  be possible..  *
1ab0: 2a 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54  *.  ** IMPLEMENT
1ac0: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31 34  ATION-OF: R-0014
1ad0: 30 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20 61  0-37445 SQLite a
1ae0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 72  utomatically ser
1af0: 69 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20 20  ializes calls.  
1b00: 2a 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20  ** to the xInit 
1b10: 6d 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20 78  method, so the x
1b20: 49 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65 64  Init method need
1b30: 20 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73 61   not be threadsa
1b40: 66 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  fe..  **.  ** Th
1b50: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74 65  e following mute
1b60: 78 20 69 73 20 77 68 61 74 20 73 65 72 69 61 6c  x is what serial
1b70: 69 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20 74  izes access to t
1b80: 68 65 20 61 70 70 64 65 66 20 70 63 61 63 68 65  he appdef pcache
1b90: 20 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74 68   xInit.  ** meth
1ba0: 6f 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ods.  The sqlite
1bb0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
1bc0: 2e 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73 20  .xInit() all is 
1bd0: 65 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65 0a  embedded in the.
1be0: 20 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c    ** call to sql
1bf0: 69 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61  ite3PcacheInitia
1c00: 6c 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 73  lize()..  */.  s
1c10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
1c20: 65 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  er(sqlite3Global
1c30: 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65  Config.pInitMute
1c40: 78 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  x);.  if( sqlite
1c50: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1c60: 49 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69 74  Init==0 && sqlit
1c70: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1c80: 6e 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b 0a  nProgress==0 ){.
1c90: 20 20 20 20 46 75 6e 63 44 65 66 48 61 73 68 20      FuncDefHash 
1ca0: 2a 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c  *pHash = &GLOBAL
1cb0: 28 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71  (FuncDefHash, sq
1cc0: 6c 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74  lite3GlobalFunct
1cd0: 69 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74  ions);.    sqlit
1ce0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1cf0: 6e 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20  nProgress = 1;. 
1d00: 20 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68 2c     memset(pHash,
1d10: 20 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74   0, sizeof(sqlit
1d20: 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e  e3GlobalFunction
1d30: 73 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  s));.    sqlite3
1d40: 52 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75  RegisterGlobalFu
1d50: 6e 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69  nctions();.    i
1d60: 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
1d70: 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49  Config.isPCacheI
1d80: 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  nit==0 ){.      
1d90: 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  rc = sqlite3Pcac
1da0: 68 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a  heInitialize();.
1db0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1dc0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1dd0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1de0: 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68  alConfig.isPCach
1df0: 65 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  eInit = 1;.     
1e00: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49   rc = sqlite3OsI
1e10: 6e 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20  nit();.    }.   
1e20: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
1e30: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
1e40: 74 65 33 50 43 61 63 68 65 42 75 66 66 65 72 53  te3PCacheBufferS
1e50: 65 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f  etup( sqlite3Glo
1e60: 62 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c  balConfig.pPage,
1e70: 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69   .          sqli
1e80: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1e90: 73 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47  szPage, sqlite3G
1ea0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
1eb0: 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1ec0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73  3GlobalConfig.is
1ed0: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  Init = 1;.    }.
1ee0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1ef0: 6c 43 6f 6e 66 69 67 2e 69 6e 50 72 6f 67 72 65  lConfig.inProgre
1f00: 73 73 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  ss = 0;.  }.  sq
1f10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
1f20: 65 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  e(sqlite3GlobalC
1f30: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1f40: 29 3b 0a 0a 20 20 2f 2a 20 47 6f 20 62 61 63 6b  );..  /* Go back
1f50: 20 75 6e 64 65 72 20 74 68 65 20 73 74 61 74 69   under the stati
1f60: 63 20 6d 75 74 65 78 20 61 6e 64 20 63 6c 65 61  c mutex and clea
1f70: 6e 20 75 70 20 74 68 65 20 72 65 63 75 72 73 69  n up the recursi
1f80: 76 65 0a 20 20 2a 2a 20 6d 75 74 65 78 20 74 6f  ve.  ** mutex to
1f90: 20 70 72 65 76 65 6e 74 20 61 20 72 65 73 6f 75   prevent a resou
1fa0: 72 63 65 20 6c 65 61 6b 2e 0a 20 20 2a 2f 0a 20  rce leak..  */. 
1fb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1fc0: 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a 20  nter(pMaster);. 
1fd0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1fe0: 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74  nfig.nRefInitMut
1ff0: 65 78 2d 2d 3b 0a 20 20 69 66 28 20 73 71 6c 69  ex--;.  if( sqli
2000: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2010: 6e 52 65 66 49 6e 69 74 4d 75 74 65 78 3c 3d 30  nRefInitMutex<=0
2020: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2030: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2040: 66 69 67 2e 6e 52 65 66 49 6e 69 74 4d 75 74 65  fig.nRefInitMute
2050: 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69  x==0 );.    sqli
2060: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 73  te3_mutex_free(s
2070: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2080: 69 67 2e 70 49 6e 69 74 4d 75 74 65 78 29 3b 0a  ig.pInitMutex);.
2090: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
20a0: 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74  lConfig.pInitMut
20b0: 65 78 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  ex = 0;.  }.  sq
20c0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
20d0: 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20 2f  e(pMaster);..  /
20e0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
20f0: 69 73 20 6a 75 73 74 20 61 20 73 61 6e 69 74 79  is just a sanity
2100: 20 63 68 65 63 6b 20 74 6f 20 6d 61 6b 65 20 73   check to make s
2110: 75 72 65 20 53 51 4c 69 74 65 20 68 61 73 0a 20  ure SQLite has. 
2120: 20 2a 2a 20 62 65 65 6e 20 63 6f 6d 70 69 6c 65   ** been compile
2130: 64 20 63 6f 72 72 65 63 74 6c 79 2e 20 20 49 74  d correctly.  It
2140: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f   is important to
2150: 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65 2c 20   run this code, 
2160: 62 75 74 0a 20 20 2a 2a 20 77 65 20 64 6f 6e 27  but.  ** we don'
2170: 74 20 77 61 6e 74 20 74 6f 20 72 75 6e 20 69 74  t want to run it
2180: 20 74 6f 6f 20 6f 66 74 65 6e 20 61 6e 64 20 73   too often and s
2190: 6f 61 6b 20 75 70 20 43 50 55 20 63 79 63 6c 65  oak up CPU cycle
21a0: 73 20 66 6f 72 20 6e 6f 0a 20 20 2a 2a 20 72 65  s for no.  ** re
21b0: 61 73 6f 6e 2e 20 20 53 6f 20 77 65 20 72 75 6e  ason.  So we run
21c0: 20 69 74 20 6f 6e 63 65 20 64 75 72 69 6e 67 20   it once during 
21d0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a  initialization..
21e0: 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45    */.#ifndef NDE
21f0: 42 55 47 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  BUG.#ifndef SQLI
2200: 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
2210: 5f 50 4f 49 4e 54 0a 20 20 2f 2a 20 54 68 69 73  _POINT.  /* This
2220: 20 73 65 63 74 69 6f 6e 20 6f 66 20 63 6f 64 65   section of code
2230: 27 73 20 6f 6e 6c 79 20 22 6f 75 74 70 75 74 22  's only "output"
2240: 20 69 73 20 76 69 61 20 61 73 73 65 72 74 28 29   is via assert()
2250: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 2a 2f 0a   statements. */.
2260: 20 20 69 66 20 28 20 72 63 3d 3d 53 51 4c 49 54    if ( rc==SQLIT
2270: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 36 34 20  E_OK ){.    u64 
2280: 78 20 3d 20 28 28 28 75 36 34 29 31 29 3c 3c 36  x = (((u64)1)<<6
2290: 33 29 2d 31 3b 0a 20 20 20 20 64 6f 75 62 6c 65  3)-1;.    double
22a0: 20 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28 73   y;.    assert(s
22b0: 69 7a 65 6f 66 28 78 29 3d 3d 38 29 3b 0a 20 20  izeof(x)==8);.  
22c0: 20 20 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28    assert(sizeof(
22d0: 78 29 3d 3d 73 69 7a 65 6f 66 28 79 29 29 3b 0a  x)==sizeof(y));.
22e0: 20 20 20 20 6d 65 6d 63 70 79 28 26 79 2c 20 26      memcpy(&y, &
22f0: 78 2c 20 38 29 3b 0a 20 20 20 20 61 73 73 65 72  x, 8);.    asser
2300: 74 28 20 73 71 6c 69 74 65 33 49 73 4e 61 4e 28  t( sqlite3IsNaN(
2310: 79 29 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  y) );.  }.#endif
2320: 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f  .#endif..  /* Do
2330: 20 65 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a   extra initializ
2340: 61 74 69 6f 6e 20 73 74 65 70 73 20 72 65 71 75  ation steps requ
2350: 65 73 74 65 64 20 62 79 20 74 68 65 20 53 51 4c  ested by the SQL
2360: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
2370: 20 2a 2a 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   ** compile-time
2380: 20 6f 70 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69   option..  */.#i
2390: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52  fdef SQLITE_EXTR
23a0: 41 5f 49 4e 49 54 0a 20 20 69 66 28 20 72 63 3d  A_INIT.  if( rc=
23b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 73 71  =SQLITE_OK && sq
23c0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
23d0: 67 2e 69 73 49 6e 69 74 20 29 7b 0a 20 20 20 20  g.isInit ){.    
23e0: 69 6e 74 20 53 51 4c 49 54 45 5f 45 58 54 52 41  int SQLITE_EXTRA
23f0: 5f 49 4e 49 54 28 63 6f 6e 73 74 20 63 68 61 72  _INIT(const char
2400: 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  *);.    rc = SQL
2410: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28 30  ITE_EXTRA_INIT(0
2420: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  );.  }.#endif.. 
2430: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2440: 2a 0a 2a 2a 20 55 6e 64 6f 20 74 68 65 20 65 66  *.** Undo the ef
2450: 66 65 63 74 73 20 6f 66 20 73 71 6c 69 74 65 33  fects of sqlite3
2460: 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 2e 20 20  _initialize().  
2470: 4d 75 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c  Must not be call
2480: 65 64 20 77 68 69 6c 65 0a 2a 2a 20 74 68 65 72  ed while.** ther
2490: 65 20 61 72 65 20 6f 75 74 73 74 61 6e 64 69 6e  e are outstandin
24a0: 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  g database conne
24b0: 63 74 69 6f 6e 73 20 6f 72 20 6d 65 6d 6f 72 79  ctions or memory
24c0: 20 61 6c 6c 6f 63 61 74 69 6f 6e 73 20 6f 72 0a   allocations or.
24d0: 2a 2a 20 77 68 69 6c 65 20 61 6e 79 20 70 61 72  ** while any par
24e0: 74 20 6f 66 20 53 51 4c 69 74 65 20 69 73 20 6f  t of SQLite is o
24f0: 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 20  therwise in use 
2500: 69 6e 20 61 6e 79 20 74 68 72 65 61 64 2e 20 20  in any thread.  
2510: 54 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20  This.** routine 
2520: 69 73 20 6e 6f 74 20 74 68 72 65 61 64 73 61 66  is not threadsaf
2530: 65 2e 20 20 42 75 74 20 69 74 20 69 73 20 73 61  e.  But it is sa
2540: 66 65 20 74 6f 20 69 6e 76 6f 6b 65 20 74 68 69  fe to invoke thi
2550: 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6f 6e 20  s routine.** on 
2560: 77 68 65 6e 20 53 51 4c 69 74 65 20 69 73 20 61  when SQLite is a
2570: 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77 6e  lready shut down
2580: 2e 20 20 49 66 20 53 51 4c 69 74 65 20 69 73 20  .  If SQLite is 
2590: 61 6c 72 65 61 64 79 20 73 68 75 74 20 64 6f 77  already shut dow
25a0: 6e 0a 2a 2a 20 77 68 65 6e 20 74 68 69 73 20 72  n.** when this r
25b0: 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65  outine is invoke
25c0: 64 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  d, then this rou
25d0: 74 69 6e 65 20 69 73 20 61 20 68 61 72 6d 6c 65  tine is a harmle
25e0: 73 73 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 6e 74  ss no-op..*/.int
25f0: 20 73 71 6c 69 74 65 33 5f 73 68 75 74 64 6f 77   sqlite3_shutdow
2600: 6e 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 73  n(void){.  if( s
2610: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
2620: 69 67 2e 69 73 49 6e 69 74 20 29 7b 0a 23 69 66  ig.isInit ){.#if
2630: 64 65 66 20 53 51 4c 49 54 45 5f 45 58 54 52 41  def SQLITE_EXTRA
2640: 5f 53 48 55 54 44 4f 57 4e 0a 20 20 20 20 76 6f  _SHUTDOWN.    vo
2650: 69 64 20 53 51 4c 49 54 45 5f 45 58 54 52 41 5f  id SQLITE_EXTRA_
2660: 53 48 55 54 44 4f 57 4e 28 76 6f 69 64 29 3b 0a  SHUTDOWN(void);.
2670: 20 20 20 20 53 51 4c 49 54 45 5f 45 58 54 52 41      SQLITE_EXTRA
2680: 5f 53 48 55 54 44 4f 57 4e 28 29 3b 0a 23 65 6e  _SHUTDOWN();.#en
2690: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
26a0: 6f 73 5f 65 6e 64 28 29 3b 0a 20 20 20 20 73 71  os_end();.    sq
26b0: 6c 69 74 65 33 5f 72 65 73 65 74 5f 61 75 74 6f  lite3_reset_auto
26c0: 5f 65 78 74 65 6e 73 69 6f 6e 28 29 3b 0a 20 20  _extension();.  
26d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
26e0: 6f 6e 66 69 67 2e 69 73 49 6e 69 74 20 3d 20 30  onfig.isInit = 0
26f0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
2700: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2710: 69 73 50 43 61 63 68 65 49 6e 69 74 20 29 7b 0a  isPCacheInit ){.
2720: 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2730: 65 53 68 75 74 64 6f 77 6e 28 29 3b 0a 20 20 20  eShutdown();.   
2740: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2750: 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e 69  nfig.isPCacheIni
2760: 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  t = 0;.  }.  if(
2770: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2780: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
2790: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
27a0: 4d 61 6c 6c 6f 63 45 6e 64 28 29 3b 0a 20 20 20  MallocEnd();.   
27b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
27c0: 6e 66 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69  nfig.isMallocIni
27d0: 74 20 3d 20 30 3b 0a 0a 23 69 66 6e 64 65 66 20  t = 0;..#ifndef 
27e0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 48 55 54  SQLITE_OMIT_SHUT
27f0: 44 4f 57 4e 5f 44 49 52 45 43 54 4f 52 49 45 53  DOWN_DIRECTORIES
2800: 0a 20 20 20 20 2f 2a 20 54 68 65 20 68 65 61 70  .    /* The heap
2810: 20 73 75 62 73 79 73 74 65 6d 20 68 61 73 20 6e   subsystem has n
2820: 6f 77 20 62 65 65 6e 20 73 68 75 74 64 6f 77 6e  ow been shutdown
2830: 20 61 6e 64 20 74 68 65 73 65 20 76 61 6c 75 65   and these value
2840: 73 20 61 72 65 20 73 75 70 70 6f 73 65 64 0a 20  s are supposed. 
2850: 20 20 20 2a 2a 20 74 6f 20 62 65 20 4e 55 4c 4c     ** to be NULL
2860: 20 6f 72 20 70 6f 69 6e 74 20 74 6f 20 6d 65 6d   or point to mem
2870: 6f 72 79 20 74 68 61 74 20 77 61 73 20 6f 62 74  ory that was obt
2880: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
2890: 65 33 5f 6d 61 6c 6c 6f 63 28 29 2c 0a 20 20 20  e3_malloc(),.   
28a0: 20 2a 2a 20 77 68 69 63 68 20 77 6f 75 6c 64 20   ** which would 
28b0: 72 65 6c 79 20 6f 6e 20 74 68 61 74 20 68 65 61  rely on that hea
28c0: 70 20 73 75 62 73 79 73 74 65 6d 3b 20 74 68 65  p subsystem; the
28d0: 72 65 66 6f 72 65 2c 20 6d 61 6b 65 20 73 75 72  refore, make sur
28e0: 65 20 74 68 65 73 65 0a 20 20 20 20 2a 2a 20 76  e these.    ** v
28f0: 61 6c 75 65 73 20 63 61 6e 6e 6f 74 20 72 65 66  alues cannot ref
2900: 65 72 20 74 6f 20 68 65 61 70 20 6d 65 6d 6f 72  er to heap memor
2910: 79 20 74 68 61 74 20 77 61 73 20 6a 75 73 74 20  y that was just 
2920: 69 6e 76 61 6c 69 64 61 74 65 64 20 77 68 65 6e  invalidated when
2930: 20 74 68 65 0a 20 20 20 20 2a 2a 20 68 65 61 70   the.    ** heap
2940: 20 73 75 62 73 79 73 74 65 6d 20 77 61 73 20 73   subsystem was s
2950: 68 75 74 64 6f 77 6e 2e 20 20 54 68 69 73 20 69  hutdown.  This i
2960: 73 20 6f 6e 6c 79 20 64 6f 6e 65 20 69 66 20 74  s only done if t
2970: 68 65 20 63 75 72 72 65 6e 74 20 63 61 6c 6c 20  he current call 
2980: 74 6f 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  to.    ** this f
2990: 75 6e 63 74 69 6f 6e 20 72 65 73 75 6c 74 65 64  unction resulted
29a0: 20 69 6e 20 74 68 65 20 68 65 61 70 20 73 75 62   in the heap sub
29b0: 73 79 73 74 65 6d 20 61 63 74 75 61 6c 6c 79 20  system actually 
29c0: 62 65 69 6e 67 20 73 68 75 74 64 6f 77 6e 2e 0a  being shutdown..
29d0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74      */.    sqlit
29e0: 65 33 5f 64 61 74 61 5f 64 69 72 65 63 74 6f 72  e3_data_director
29f0: 79 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  y = 0;.    sqlit
2a00: 65 33 5f 74 65 6d 70 5f 64 69 72 65 63 74 6f 72  e3_temp_director
2a10: 79 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 20 20  y = 0;.#endif.  
2a20: 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47  }.  if( sqlite3G
2a30: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75  lobalConfig.isMu
2a40: 74 65 78 49 6e 69 74 20 29 7b 0a 20 20 20 20 73  texInit ){.    s
2a50: 71 6c 69 74 65 33 4d 75 74 65 78 45 6e 64 28 29  qlite3MutexEnd()
2a60: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
2a70: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 4d 75 74 65  balConfig.isMute
2a80: 78 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a 0a  xInit = 0;.  }..
2a90: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2aa0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
2ab0: 73 20 41 50 49 20 61 6c 6c 6f 77 73 20 61 70 70  s API allows app
2ac0: 6c 69 63 61 74 69 6f 6e 73 20 74 6f 20 6d 6f 64  lications to mod
2ad0: 69 66 79 20 74 68 65 20 67 6c 6f 62 61 6c 20 63  ify the global c
2ae0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6f 66 0a  onfiguration of.
2af0: 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  ** the SQLite li
2b00: 62 72 61 72 79 20 61 74 20 72 75 6e 2d 74 69 6d  brary at run-tim
2b10: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  e..**.** This ro
2b20: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c  utine should onl
2b30: 79 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  y be called when
2b40: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75   there are no ou
2b50: 74 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 64 61 74  tstanding.** dat
2b60: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
2b70: 73 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f  s or memory allo
2b80: 63 61 74 69 6f 6e 73 2e 20 20 54 68 69 73 20 72  cations.  This r
2b90: 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74 0a 2a 2a  outine is not.**
2ba0: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 46 61   threadsafe.  Fa
2bb0: 69 6c 75 72 65 20 74 6f 20 68 65 65 64 20 74 68  ilure to heed th
2bc0: 65 73 65 20 77 61 72 6e 69 6e 67 73 20 63 61 6e  ese warnings can
2bd0: 20 6c 65 61 64 20 74 6f 20 75 6e 70 72 65 64 69   lead to unpredi
2be0: 63 74 61 62 6c 65 0a 2a 2a 20 62 65 68 61 76 69  ctable.** behavi
2bf0: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
2c00: 65 33 5f 63 6f 6e 66 69 67 28 69 6e 74 20 6f 70  e3_config(int op
2c10: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
2c20: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d  t ap;.  int rc =
2c30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
2c40: 2a 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67  * sqlite3_config
2c50: 28 29 20 73 68 61 6c 6c 20 72 65 74 75 72 6e 20  () shall return 
2c60: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 69 66  SQLITE_MISUSE if
2c70: 20 69 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 77   it is invoked w
2c80: 68 69 6c 65 0a 20 20 2a 2a 20 74 68 65 20 53 51  hile.  ** the SQ
2c90: 4c 69 74 65 20 6c 69 62 72 61 72 79 20 69 73 20  Lite library is 
2ca0: 69 6e 20 75 73 65 2e 20 2a 2f 0a 20 20 69 66 28  in use. */.  if(
2cb0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2cc0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
2cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
2ce0: 53 45 5f 42 4b 50 54 3b 0a 0a 20 20 76 61 5f 73  SE_BKPT;..  va_s
2cf0: 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20  tart(ap, op);.  
2d00: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a 20  switch( op ){.. 
2d10: 20 20 20 2f 2a 20 4d 75 74 65 78 20 63 6f 6e 66     /* Mutex conf
2d20: 69 67 75 72 61 74 69 6f 6e 20 6f 70 74 69 6f 6e  iguration option
2d30: 73 20 61 72 65 20 6f 6e 6c 79 20 61 76 61 69 6c  s are only avail
2d40: 61 62 6c 65 20 69 6e 20 61 20 74 68 72 65 61 64  able in a thread
2d50: 73 61 66 65 0a 20 20 20 20 2a 2a 20 63 6f 6d 70  safe.    ** comp
2d60: 69 6c 65 2e 20 0a 20 20 20 20 2a 2f 0a 23 69 66  ile. .    */.#if
2d70: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2d80: 54 48 52 45 41 44 53 41 46 45 29 20 26 26 20 53  THREADSAFE) && S
2d90: 51 4c 49 54 45 5f 54 48 52 45 41 44 53 41 46 45  QLITE_THREADSAFE
2da0: 3e 30 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  >0.    case SQLI
2db0: 54 45 5f 43 4f 4e 46 49 47 5f 53 49 4e 47 4c 45  TE_CONFIG_SINGLE
2dc0: 54 48 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20  THREAD: {.      
2dd0: 2f 2a 20 44 69 73 61 62 6c 65 20 61 6c 6c 20 6d  /* Disable all m
2de0: 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20 20 20  utexing */.     
2df0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2e00: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2e10: 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
2e20: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2e30: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20  FullMutex = 0;. 
2e40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2e50: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2e60: 45 5f 43 4f 4e 46 49 47 5f 4d 55 4c 54 49 54 48  E_CONFIG_MULTITH
2e70: 52 45 41 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  READ: {.      /*
2e80: 20 44 69 73 61 62 6c 65 20 6d 75 74 65 78 69 6e   Disable mutexin
2e90: 67 20 6f 66 20 64 61 74 61 62 61 73 65 20 63 6f  g of database co
2ea0: 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 20  nnections */.   
2eb0: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 6d 75 74     /* Enable mut
2ec0: 65 78 69 6e 67 20 6f 66 20 63 6f 72 65 20 64 61  exing of core da
2ed0: 74 61 20 73 74 72 75 63 74 75 72 65 73 20 2a 2f  ta structures */
2ee0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2ef0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
2f00: 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Mutex = 1;.     
2f10: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2f20: 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 20  nfig.bFullMutex 
2f30: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
2f40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
2f50: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
2f60: 45 52 49 41 4c 49 5a 45 44 3a 20 7b 0a 20 20 20  ERIALIZED: {.   
2f70: 20 20 20 2f 2a 20 45 6e 61 62 6c 65 20 61 6c 6c     /* Enable all
2f80: 20 6d 75 74 65 78 69 6e 67 20 2a 2f 0a 20 20 20   mutexing */.   
2f90: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
2fa0: 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65  Config.bCoreMute
2fb0: 78 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  x = 1;.      sql
2fc0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2fd0: 2e 62 46 75 6c 6c 4d 75 74 65 78 20 3d 20 31 3b  .bFullMutex = 1;
2fe0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2ff0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c    }.    case SQL
3000: 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 55 54 45 58  ITE_CONFIG_MUTEX
3010: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65  : {.      /* Spe
3020: 63 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74  cify an alternat
3030: 69 76 65 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d  ive mutex implem
3040: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
3050: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3060: 6f 6e 66 69 67 2e 6d 75 74 65 78 20 3d 20 2a 76  onfig.mutex = *v
3070: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
3080: 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73 2a  3_mutex_methods*
3090: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
30a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
30b0: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
30c0: 4d 55 54 45 58 3a 20 7b 0a 20 20 20 20 20 20 2f  MUTEX: {.      /
30d0: 2a 20 52 65 74 72 69 65 76 65 20 74 68 65 20 63  * Retrieve the c
30e0: 75 72 72 65 6e 74 20 6d 75 74 65 78 20 69 6d 70  urrent mutex imp
30f0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20  lementation */. 
3100: 20 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c       *va_arg(ap,
3110: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6d   sqlite3_mutex_m
3120: 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69 74  ethods*) = sqlit
3130: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3140: 75 74 65 78 3b 0a 20 20 20 20 20 20 62 72 65 61  utex;.      brea
3150: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
3160: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
3170: 45 5f 43 4f 4e 46 49 47 5f 4d 41 4c 4c 4f 43 3a  E_CONFIG_MALLOC:
3180: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63   {.      /* Spec
3190: 69 66 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69  ify an alternati
31a0: 76 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c 65 6d  ve malloc implem
31b0: 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  entation */.    
31c0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
31d0: 6f 6e 66 69 67 2e 6d 20 3d 20 2a 76 61 5f 61 72  onfig.m = *va_ar
31e0: 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65  g(ap, sqlite3_me
31f0: 6d 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20  m_methods*);.   
3200: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3210: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3220: 43 4f 4e 46 49 47 5f 47 45 54 4d 41 4c 4c 4f 43  CONFIG_GETMALLOC
3230: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74  : {.      /* Ret
3240: 72 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e  rieve the curren
3250: 74 20 6d 61 6c 6c 6f 63 28 29 20 69 6d 70 6c 65  t malloc() imple
3260: 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  mentation */.   
3270: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
3280: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2e 78 4d 61  obalConfig.m.xMa
3290: 6c 6c 6f 63 3d 3d 30 20 29 20 73 71 6c 69 74 65  lloc==0 ) sqlite
32a0: 33 4d 65 6d 53 65 74 44 65 66 61 75 6c 74 28 29  3MemSetDefault()
32b0: 3b 0a 20 20 20 20 20 20 2a 76 61 5f 61 72 67 28  ;.      *va_arg(
32c0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 65 6d 5f  ap, sqlite3_mem_
32d0: 6d 65 74 68 6f 64 73 2a 29 20 3d 20 73 71 6c 69  methods*) = sqli
32e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
32f0: 6d 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  m;.      break;.
3300: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
3310: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4d 45 4d  QLITE_CONFIG_MEM
3320: 53 54 41 54 55 53 3a 20 7b 0a 20 20 20 20 20 20  STATUS: {.      
3330: 2f 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73  /* Enable or dis
3340: 61 62 6c 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20  able the malloc 
3350: 73 74 61 74 75 73 20 63 6f 6c 6c 65 63 74 69 6f  status collectio
3360: 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  n */.      sqlit
3370: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
3380: 4d 65 6d 73 74 61 74 20 3d 20 76 61 5f 61 72 67  Memstat = va_arg
3390: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
33a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
33b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
33c0: 4e 46 49 47 5f 53 43 52 41 54 43 48 3a 20 7b 0a  NFIG_SCRATCH: {.
33d0: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61        /* Designa
33e0: 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72 20  te a buffer for 
33f0: 73 63 72 61 74 63 68 20 6d 65 6d 6f 72 79 20 73  scratch memory s
3400: 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71  pace */.      sq
3410: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3420: 67 2e 70 53 63 72 61 74 63 68 20 3d 20 76 61 5f  g.pScratch = va_
3430: 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a  arg(ap, void*);.
3440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
3450: 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 53 63 72 61  balConfig.szScra
3460: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
3470: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c   int);.      sql
3480: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3490: 2e 6e 53 63 72 61 74 63 68 20 3d 20 76 61 5f 61  .nScratch = va_a
34a0: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
34b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
34c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
34d0: 43 4f 4e 46 49 47 5f 50 41 47 45 43 41 43 48 45  CONFIG_PAGECACHE
34e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 65 73  : {.      /* Des
34f0: 69 67 6e 61 74 65 20 61 20 62 75 66 66 65 72 20  ignate a buffer 
3500: 66 6f 72 20 70 61 67 65 20 63 61 63 68 65 20 6d  for page cache m
3510: 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a 20  emory space */. 
3520: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3530: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 20 3d  alConfig.pPage =
3540: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
3550: 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  *);.      sqlite
3560: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
3570: 50 61 67 65 20 3d 20 76 61 5f 61 72 67 28 61 70  Page = va_arg(ap
3580: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
3590: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
35a0: 67 2e 6e 50 61 67 65 20 3d 20 76 61 5f 61 72 67  g.nPage = va_arg
35b0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
35c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
35d0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
35e0: 4f 4e 46 49 47 5f 50 43 41 43 48 45 3a 20 7b 0a  ONFIG_PCACHE: {.
35f0: 20 20 20 20 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a        /* no-op *
3600: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
3610: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51     }.    case SQ
3620: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54 50  LITE_CONFIG_GETP
3630: 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20 2f  CACHE: {.      /
3640: 2a 20 6e 6f 77 20 61 6e 20 65 72 72 6f 72 20 2a  * now an error *
3650: 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  /.      rc = SQL
3660: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
3670: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
3680: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3690: 4f 4e 46 49 47 5f 50 43 41 43 48 45 32 3a 20 7b  ONFIG_PCACHE2: {
36a0: 0a 20 20 20 20 20 20 2f 2a 20 53 70 65 63 69 66  .      /* Specif
36b0: 79 20 61 6e 20 61 6c 74 65 72 6e 61 74 69 76 65  y an alternative
36c0: 20 70 61 67 65 20 63 61 63 68 65 20 69 6d 70 6c   page cache impl
36d0: 65 6d 65 6e 74 61 74 69 6f 6e 20 2a 2f 0a 20 20  ementation */.  
36e0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
36f0: 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32 20  lConfig.pcache2 
3700: 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71  = *va_arg(ap, sq
3710: 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d 65 74  lite3_pcache_met
3720: 68 6f 64 73 32 2a 29 3b 0a 20 20 20 20 20 20 62  hods2*);.      b
3730: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
3740: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3750: 49 47 5f 47 45 54 50 43 41 43 48 45 32 3a 20 7b  IG_GETPCACHE2: {
3760: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
3770: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
3780: 63 61 63 68 65 32 2e 78 49 6e 69 74 3d 3d 30 20  cache2.xInit==0 
3790: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
37a0: 65 33 50 43 61 63 68 65 53 65 74 44 65 66 61 75  e3PCacheSetDefau
37b0: 6c 74 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  lt();.      }.  
37c0: 20 20 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20      *va_arg(ap, 
37d0: 73 71 6c 69 74 65 33 5f 70 63 61 63 68 65 5f 6d  sqlite3_pcache_m
37e0: 65 74 68 6f 64 73 32 2a 29 20 3d 20 73 71 6c 69  ethods2*) = sqli
37f0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3800: 70 63 61 63 68 65 32 3b 0a 20 20 20 20 20 20 62  pcache2;.      b
3810: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66  reak;.    }..#if
3820: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
3830: 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 33 29 20  ENABLE_MEMSYS3) 
3840: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
3850: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  E_ENABLE_MEMSYS5
3860: 29 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ).    case SQLIT
3870: 45 5f 43 4f 4e 46 49 47 5f 48 45 41 50 3a 20 7b  E_CONFIG_HEAP: {
3880: 0a 20 20 20 20 20 20 2f 2a 20 44 65 73 69 67 6e  .      /* Design
3890: 61 74 65 20 61 20 62 75 66 66 65 72 20 66 6f 72  ate a buffer for
38a0: 20 68 65 61 70 20 6d 65 6d 6f 72 79 20 73 70 61   heap memory spa
38b0: 63 65 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  ce */.      sqli
38c0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
38d0: 70 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61  pHeap = va_arg(a
38e0: 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20  p, void*);.     
38f0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
3900: 6e 66 69 67 2e 6e 48 65 61 70 20 3d 20 76 61 5f  nfig.nHeap = va_
3910: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
3920: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3930: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
3940: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3950: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
3960: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3970: 6d 6e 52 65 71 3c 31 20 29 7b 0a 20 20 20 20 20  mnReq<1 ){.     
3980: 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
3990: 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20 31  Config.mnReq = 1
39a0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
39b0: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
39c0: 6f 6e 66 69 67 2e 6d 6e 52 65 71 3e 28 31 3c 3c  onfig.mnReq>(1<<
39d0: 31 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  12) ){.        /
39e0: 2a 20 63 61 70 20 6d 69 6e 20 72 65 71 75 65 73  * cap min reques
39f0: 74 20 73 69 7a 65 20 61 74 20 32 5e 31 32 20 2a  t size at 2^12 *
3a00: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
3a10: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e  3GlobalConfig.mn
3a20: 52 65 71 20 3d 20 28 31 3c 3c 31 32 29 3b 0a 20  Req = (1<<12);. 
3a30: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
3a40: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
3a50: 6f 6e 66 69 67 2e 70 48 65 61 70 3d 3d 30 20 29  onfig.pHeap==0 )
3a60: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
3a70: 74 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65 72  the heap pointer
3a80: 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 72   is NULL, then r
3a90: 65 73 74 6f 72 65 20 74 68 65 20 6d 61 6c 6c 6f  estore the mallo
3aa0: 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  c implementation
3ab0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b  .        ** back
3ac0: 20 74 6f 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72   to NULL pointer
3ad0: 73 20 74 6f 6f 2e 20 20 54 68 69 73 20 77 69 6c  s too.  This wil
3ae0: 6c 20 63 61 75 73 65 20 74 68 65 20 6d 61 6c 6c  l cause the mall
3af0: 6f 63 20 74 6f 20 67 6f 0a 20 20 20 20 20 20 20  oc to go.       
3b00: 20 2a 2a 20 62 61 63 6b 20 74 6f 20 69 74 73 20   ** back to its 
3b10: 64 65 66 61 75 6c 74 20 69 6d 70 6c 65 6d 65 6e  default implemen
3b20: 74 61 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69  tation when sqli
3b30: 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
3b40: 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72   is.        ** r
3b50: 75 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  un..        */. 
3b60: 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 73         memset(&s
3b70: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3b80: 69 67 2e 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ig.m, 0, sizeof(
3b90: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3ba0: 66 69 67 2e 6d 29 29 3b 0a 20 20 20 20 20 20 7d  fig.m));.      }
3bb0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
3bc0: 20 54 68 65 20 68 65 61 70 20 70 6f 69 6e 74 65   The heap pointe
3bd0: 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  r is not NULL, t
3be0: 68 65 6e 20 69 6e 73 74 61 6c 6c 20 6f 6e 65 20  hen install one 
3bf0: 6f 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  of the.        *
3c00: 2a 20 6d 65 6d 35 2e 63 2f 6d 65 6d 33 2e 63 20  * mem5.c/mem3.c 
3c10: 6d 65 74 68 6f 64 73 2e 20 49 66 20 6e 65 69 74  methods. If neit
3c20: 68 65 72 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  her ENABLE_MEMSY
3c30: 53 33 20 6e 6f 72 0a 20 20 20 20 20 20 20 20 2a  S3 nor.        *
3c40: 2a 20 45 4e 41 42 4c 45 5f 4d 45 4d 53 59 53 35  * ENABLE_MEMSYS5
3c50: 20 69 73 20 64 65 66 69 6e 65 64 2c 20 72 65 74   is defined, ret
3c60: 75 72 6e 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20  urn an error..  
3c70: 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65 66 20        */.#ifdef 
3c80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
3c90: 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20 73 71  MSYS3.        sq
3ca0: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3cb0: 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65  g.m = *sqlite3Me
3cc0: 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b 0a 23  mGetMemsys3();.#
3cd0: 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c  endif.#ifdef SQL
3ce0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 53 59  ITE_ENABLE_MEMSY
3cf0: 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  S5.        sqlit
3d00: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d  e3GlobalConfig.m
3d10: 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d 47 65   = *sqlite3MemGe
3d20: 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65 6e 64  tMemsys5();.#end
3d30: 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  if.      }.     
3d40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
3d50: 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65 20 53  ndif..    case S
3d60: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 4f  QLITE_CONFIG_LOO
3d70: 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20 20 20  KASIDE: {.      
3d80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3d90: 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 20  fig.szLookaside 
3da0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  = va_arg(ap, int
3db0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3dc0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f  GlobalConfig.nLo
3dd0: 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61 72 67  okaside = va_arg
3de0: 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  (ap, int);.     
3df0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3e00: 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f 72 64    .    /* Record
3e10: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
3e20: 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 63 74 69  e logger funccti
3e30: 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73 74  on and its first
3e40: 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 2a   argument..    *
3e50: 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 69 73  * The default is
3e60: 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67 20   NULL.  Logging 
3e70: 69 73 20 64 69 73 61 62 6c 65 64 20 69 66 20 74  is disabled if t
3e80: 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  he function poin
3e90: 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e 55  ter is.    ** NU
3ea0: 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  LL..    */.    c
3eb0: 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49  ase SQLITE_CONFI
3ec0: 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20 2f  G_LOG: {.      /
3ed0: 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20  * MSVC is picky 
3ee0: 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75  about pulling fu
3ef0: 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20  nc ptrs from va 
3f00: 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  lists..      ** 
3f10: 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d  http://support.m
3f20: 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f  icrosoft.com/kb/
3f30: 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73  47961.      ** s
3f40: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3f50: 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67  ig.xLog = va_arg
3f60: 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f 69  (ap, void(*)(voi
3f70: 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68 61  d*,int,const cha
3f80: 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20  r*));.      */. 
3f90: 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f 69       typedef voi
3fa0: 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76 6f  d(*LOGFUNC_t)(vo
3fb0: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
3fc0: 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ar*);.      sqli
3fd0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3fe0: 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61 70  xLog = va_arg(ap
3ff0: 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20 20  , LOGFUNC_t);.  
4000: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
4010: 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67 20  lConfig.pLogArg 
4020: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
4030: 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d*);.      break
4040: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
4050: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
4060: 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  URI: {.      sql
4070: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4080: 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f 61  .bOpenUri = va_a
4090: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
40a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
40b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
40c0: 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e 47  _CONFIG_COVERING
40d0: 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a 20  _INDEX_SCAN: {. 
40e0: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
40f0: 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69 73  alConfig.bUseCis
4100: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
4110: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
4120: 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53  .    }..#ifdef S
4130: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51 4c  QLITE_ENABLE_SQL
4140: 4c 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51 4c  LOG.    case SQL
4150: 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c 4f  ITE_CONFIG_SQLLO
4160: 47 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64  G: {.      typed
4170: 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47 46  ef void(*SQLLOGF
4180: 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73 71  UNC_t)(void*, sq
4190: 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68  lite3*, const ch
41a0: 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20  ar*, int);.     
41b0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
41c0: 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20 76  nfig.xSqllog = v
41d0: 61 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f 47  a_arg(ap, SQLLOG
41e0: 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20 73  FUNC_t);.      s
41f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
4200: 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d 20  ig.pSqllogArg = 
4210: 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 20  va_arg(ap, void 
4220: 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  *);.      break;
4230: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20  .    }.#endif.. 
4240: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
4250: 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 3a  ONFIG_MMAP_SIZE:
4260: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
4270: 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d 20  _int64 szMmap = 
4280: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
4290: 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20 20  e3_int64);.     
42a0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 6d   sqlite3_int64 m
42b0: 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28 61  xMmap = va_arg(a
42c0: 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  p, sqlite3_int64
42d0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78 4d  );.      if( mxM
42e0: 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70 3e  map<0 || mxMmap>
42f0: 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50 5f  SQLITE_MAX_MMAP_
4300: 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20 20  SIZE ){.        
4310: 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45 5f  mxMmap = SQLITE_
4320: 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20  MAX_MMAP_SIZE;. 
4330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
4340: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4350: 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61 70  .mxMmap = mxMmap
4360: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d 6d  ;.      if( szMm
4370: 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d 20  ap<0 ) szMmap = 
4380: 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 4d  SQLITE_DEFAULT_M
4390: 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20  MAP_SIZE;.      
43a0: 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d 61  if( szMmap>mxMma
43b0: 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d 6d  p) szMmap = mxMm
43c0: 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ap;.      sqlite
43d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a  3GlobalConfig.sz
43e0: 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a 20  Mmap = szMmap;. 
43f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4400: 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  }..    default: 
4410: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
4420: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
4430: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4440: 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a  }.  va_end(ap);.
4450: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
4460: 2f 2a 0a 2a 2a 20 53 65 74 20 75 70 20 74 68 65  /*.** Set up the
4470: 20 6c 6f 6f 6b 61 73 69 64 65 20 62 75 66 66 65   lookaside buffe
4480: 72 73 20 66 6f 72 20 61 20 64 61 74 61 62 61 73  rs for a databas
4490: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2a  e connection..**
44a0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
44b0: 4b 20 6f 6e 20 73 75 63 63 65 73 73 2e 20 20 0a  K on success.  .
44c0: 2a 2a 20 49 66 20 6c 6f 6f 6b 61 73 69 64 65 20  ** If lookaside 
44d0: 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
44e0: 65 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  e, return SQLITE
44f0: 5f 42 55 53 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  _BUSY..**.** The
4500: 20 73 7a 20 70 61 72 61 6d 65 74 65 72 20 69 73   sz parameter is
4510: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
4520: 79 74 65 73 20 69 6e 20 65 61 63 68 20 6c 6f 6f  ytes in each loo
4530: 6b 61 73 69 64 65 20 73 6c 6f 74 2e 0a 2a 2a 20  kaside slot..** 
4540: 54 68 65 20 63 6e 74 20 70 61 72 61 6d 65 74 65  The cnt paramete
4550: 72 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  r is the number 
4560: 6f 66 20 73 6c 6f 74 73 2e 20 20 49 66 20 70 53  of slots.  If pS
4570: 74 61 72 74 20 69 73 20 4e 55 4c 4c 20 74 68 65  tart is NULL the
4580: 0a 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68  .** space for th
4590: 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d 6f  e lookaside memo
45a0: 72 79 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66  ry is obtained f
45b0: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
45c0: 6f 63 28 29 2e 0a 2a 2a 20 49 66 20 70 53 74 61  oc()..** If pSta
45d0: 72 74 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  rt is not NULL t
45e0: 68 65 6e 20 69 74 20 69 73 20 73 7a 2a 63 6e 74  hen it is sz*cnt
45f0: 20 62 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   bytes of memory
4600: 20 74 6f 20 75 73 65 20 66 6f 72 0a 2a 2a 20 74   to use for.** t
4610: 68 65 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  he lookaside mem
4620: 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
4630: 6e 74 20 73 65 74 75 70 4c 6f 6f 6b 61 73 69 64  nt setupLookasid
4640: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 76  e(sqlite3 *db, v
4650: 6f 69 64 20 2a 70 42 75 66 2c 20 69 6e 74 20 73  oid *pBuf, int s
4660: 7a 2c 20 69 6e 74 20 63 6e 74 29 7b 0a 20 20 76  z, int cnt){.  v
4670: 6f 69 64 20 2a 70 53 74 61 72 74 3b 0a 20 20 69  oid *pStart;.  i
4680: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
4690: 2e 6e 4f 75 74 20 29 7b 0a 20 20 20 20 72 65 74  .nOut ){.    ret
46a0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b  urn SQLITE_BUSY;
46b0: 0a 20 20 7d 0a 20 20 2f 2a 20 46 72 65 65 20 61  .  }.  /* Free a
46c0: 6e 79 20 65 78 69 73 74 69 6e 67 20 6c 6f 6f 6b  ny existing look
46d0: 61 73 69 64 65 20 62 75 66 66 65 72 20 66 6f 72  aside buffer for
46e0: 20 74 68 69 73 20 68 61 6e 64 6c 65 20 62 65 66   this handle bef
46f0: 6f 72 65 0a 20 20 2a 2a 20 61 6c 6c 6f 63 61 74  ore.  ** allocat
4700: 69 6e 67 20 61 20 6e 65 77 20 6f 6e 65 20 73 6f  ing a new one so
4710: 20 77 65 20 64 6f 6e 27 74 20 68 61 76 65 20 74   we don't have t
4720: 6f 20 68 61 76 65 20 73 70 61 63 65 20 66 6f 72  o have space for
4730: 20 0a 20 20 2a 2a 20 62 6f 74 68 20 61 74 20 74   .  ** both at t
4740: 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20  he same time..  
4750: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f  */.  if( db->loo
4760: 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64  kaside.bMalloced
4770: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
4780: 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69  free(db->lookasi
4790: 64 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a  de.pStart);.  }.
47a0: 20 20 2f 2a 20 54 68 65 20 73 69 7a 65 20 6f 66    /* The size of
47b0: 20 61 20 6c 6f 6f 6b 61 73 69 64 65 20 73 6c 6f   a lookaside slo
47c0: 74 20 61 66 74 65 72 20 52 4f 55 4e 44 44 4f 57  t after ROUNDDOW
47d0: 4e 38 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c  N8 needs to be l
47e0: 61 72 67 65 72 0a 20 20 2a 2a 20 74 68 61 6e 20  arger.  ** than 
47f0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 62 65 20  a pointer to be 
4800: 75 73 65 66 75 6c 2e 0a 20 20 2a 2f 0a 20 20 73  useful..  */.  s
4810: 7a 20 3d 20 52 4f 55 4e 44 44 4f 57 4e 38 28 73  z = ROUNDDOWN8(s
4820: 7a 29 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33  z);  /* IMP: R-3
4830: 33 30 33 38 2d 30 39 33 38 32 20 2a 2f 0a 20 20  3038-09382 */.  
4840: 69 66 28 20 73 7a 3c 3d 28 69 6e 74 29 73 69 7a  if( sz<=(int)siz
4850: 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f  eof(LookasideSlo
4860: 74 2a 29 20 29 20 73 7a 20 3d 20 30 3b 0a 20 20  t*) ) sz = 0;.  
4870: 69 66 28 20 63 6e 74 3c 30 20 29 20 63 6e 74 20  if( cnt<0 ) cnt 
4880: 3d 20 30 3b 0a 20 20 69 66 28 20 73 7a 3d 3d 30  = 0;.  if( sz==0
4890: 20 7c 7c 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20   || cnt==0 ){.  
48a0: 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 70 53    sz = 0;.    pS
48b0: 74 61 72 74 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  tart = 0;.  }els
48c0: 65 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 7b  e if( pBuf==0 ){
48d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69  .    sqlite3Begi
48e0: 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
48f0: 0a 20 20 20 20 70 53 74 61 72 74 20 3d 20 73 71  .    pStart = sq
4900: 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 20 73 7a 2a  lite3Malloc( sz*
4910: 63 6e 74 20 29 3b 20 20 2f 2a 20 49 4d 50 3a 20  cnt );  /* IMP: 
4920: 52 2d 36 31 39 34 39 2d 33 35 37 32 37 20 2a 2f  R-61949-35727 */
4930: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
4940: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
4950: 20 20 20 69 66 28 20 70 53 74 61 72 74 20 29 20     if( pStart ) 
4960: 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  cnt = sqlite3Mal
4970: 6c 6f 63 53 69 7a 65 28 70 53 74 61 72 74 29 2f  locSize(pStart)/
4980: 73 7a 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sz;.  }else{.   
4990: 20 70 53 74 61 72 74 20 3d 20 70 42 75 66 3b 0a   pStart = pBuf;.
49a0: 20 20 7d 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73    }.  db->lookas
49b0: 69 64 65 2e 70 53 74 61 72 74 20 3d 20 70 53 74  ide.pStart = pSt
49c0: 61 72 74 3b 0a 20 20 64 62 2d 3e 6c 6f 6f 6b 61  art;.  db->looka
49d0: 73 69 64 65 2e 70 46 72 65 65 20 3d 20 30 3b 0a  side.pFree = 0;.
49e0: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
49f0: 73 7a 20 3d 20 28 75 31 36 29 73 7a 3b 0a 20 20  sz = (u16)sz;.  
4a00: 69 66 28 20 70 53 74 61 72 74 20 29 7b 0a 20 20  if( pStart ){.  
4a10: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 4c 6f 6f    int i;.    Loo
4a20: 6b 61 73 69 64 65 53 6c 6f 74 20 2a 70 3b 0a 20  kasideSlot *p;. 
4a30: 20 20 20 61 73 73 65 72 74 28 20 73 7a 20 3e 20     assert( sz > 
4a40: 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f 6f 6b  (int)sizeof(Look
4a50: 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 3b 0a 20  asideSlot*) );. 
4a60: 20 20 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64     p = (Lookasid
4a70: 65 53 6c 6f 74 2a 29 70 53 74 61 72 74 3b 0a 20  eSlot*)pStart;. 
4a80: 20 20 20 66 6f 72 28 69 3d 63 6e 74 2d 31 3b 20     for(i=cnt-1; 
4a90: 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20  i>=0; i--){.    
4aa0: 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 64 62 2d    p->pNext = db-
4ab0: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 46 72 65 65  >lookaside.pFree
4ac0: 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b  ;.      db->look
4ad0: 61 73 69 64 65 2e 70 46 72 65 65 20 3d 20 70 3b  aside.pFree = p;
4ae0: 0a 20 20 20 20 20 20 70 20 3d 20 28 4c 6f 6f 6b  .      p = (Look
4af0: 61 73 69 64 65 53 6c 6f 74 2a 29 26 28 28 75 38  asideSlot*)&((u8
4b00: 2a 29 70 29 5b 73 7a 5d 3b 0a 20 20 20 20 7d 0a  *)p)[sz];.    }.
4b10: 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64      db->lookasid
4b20: 65 2e 70 45 6e 64 20 3d 20 70 3b 0a 20 20 20 20  e.pEnd = p;.    
4b30: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 45  db->lookaside.bE
4b40: 6e 61 62 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  nabled = 1;.    
4b50: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d  db->lookaside.bM
4b60: 61 6c 6c 6f 63 65 64 20 3d 20 70 42 75 66 3d 3d  alloced = pBuf==
4b70: 30 20 3f 31 3a 30 3b 0a 20 20 7d 65 6c 73 65 7b  0 ?1:0;.  }else{
4b80: 0a 20 20 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  .    db->lookasi
4b90: 64 65 2e 70 45 6e 64 20 3d 20 30 3b 0a 20 20 20  de.pEnd = 0;.   
4ba0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
4bb0: 45 6e 61 62 6c 65 64 20 3d 20 30 3b 0a 20 20 20  Enabled = 0;.   
4bc0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62   db->lookaside.b
4bd0: 4d 61 6c 6c 6f 63 65 64 20 3d 20 30 3b 0a 20 20  Malloced = 0;.  
4be0: 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
4bf0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
4c00: 65 74 75 72 6e 20 74 68 65 20 6d 75 74 65 78 20  eturn the mutex 
4c10: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
4c20: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
4c30: 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 71 6c 69 74 65  ction..*/.sqlite
4c40: 33 5f 6d 75 74 65 78 20 2a 73 71 6c 69 74 65 33  3_mutex *sqlite3
4c50: 5f 64 62 5f 6d 75 74 65 78 28 73 71 6c 69 74 65  _db_mutex(sqlite
4c60: 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
4c70: 20 64 62 2d 3e 6d 75 74 65 78 3b 0a 7d 0a 0a 2f   db->mutex;.}../
4c80: 2a 0a 2a 2a 20 46 72 65 65 20 75 70 20 61 73 20  *.** Free up as 
4c90: 6d 75 63 68 20 6d 65 6d 6f 72 79 20 61 73 20 77  much memory as w
4ca0: 65 20 63 61 6e 20 66 72 6f 6d 20 74 68 65 20 67  e can from the g
4cb0: 69 76 65 6e 20 64 61 74 61 62 61 73 65 0a 2a 2a  iven database.**
4cc0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
4cd0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 72  int sqlite3_db_r
4ce0: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 73 71  elease_memory(sq
4cf0: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 6e  lite3 *db){.  in
4d00: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  t i;.  sqlite3_m
4d10: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
4d20: 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  utex);.  sqlite3
4d30: 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
4d40: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
4d50: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
4d60: 20 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20     Btree *pBt = 
4d70: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
4d80: 20 20 20 20 69 66 28 20 70 42 74 20 29 7b 0a 20      if( pBt ){. 
4d90: 20 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67       Pager *pPag
4da0: 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74 72 65  er = sqlite3Btre
4db0: 65 50 61 67 65 72 28 70 42 74 29 3b 0a 20 20 20  ePager(pBt);.   
4dc0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 53     sqlite3PagerS
4dd0: 68 72 69 6e 6b 28 70 50 61 67 65 72 29 3b 0a 20  hrink(pPager);. 
4de0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
4df0: 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c 28  e3BtreeLeaveAll(
4e00: 64 62 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  db);.  sqlite3_m
4e10: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
4e20: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
4e30: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
4e40: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f  .** Configuratio
4e50: 6e 20 73 65 74 74 69 6e 67 73 20 66 6f 72 20 61  n settings for a
4e60: 6e 20 69 6e 64 69 76 69 64 75 61 6c 20 64 61 74  n individual dat
4e70: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
4e80: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
4e90: 64 62 5f 63 6f 6e 66 69 67 28 73 71 6c 69 74 65  db_config(sqlite
4ea0: 33 20 2a 64 62 2c 20 69 6e 74 20 6f 70 2c 20 2e  3 *db, int op, .
4eb0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
4ec0: 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 76  p;.  int rc;.  v
4ed0: 61 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b  a_start(ap, op);
4ee0: 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b  .  switch( op ){
4ef0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
4f00: 5f 44 42 43 4f 4e 46 49 47 5f 4c 4f 4f 4b 41 53  _DBCONFIG_LOOKAS
4f10: 49 44 45 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69  IDE: {.      voi
4f20: 64 20 2a 70 42 75 66 20 3d 20 76 61 5f 61 72 67  d *pBuf = va_arg
4f30: 28 61 70 2c 20 76 6f 69 64 2a 29 3b 20 2f 2a 20  (ap, void*); /* 
4f40: 49 4d 50 3a 20 52 2d 32 36 38 33 35 2d 31 30 39  IMP: R-26835-109
4f50: 36 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  64 */.      int 
4f60: 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  sz = va_arg(ap, 
4f70: 69 6e 74 29 3b 20 20 20 20 20 20 20 2f 2a 20 49  int);       /* I
4f80: 4d 50 3a 20 52 2d 34 37 38 37 31 2d 32 35 39 39  MP: R-47871-2599
4f90: 34 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 63  4 */.      int c
4fa0: 6e 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  nt = va_arg(ap, 
4fb0: 69 6e 74 29 3b 20 20 20 20 20 20 2f 2a 20 49 4d  int);      /* IM
4fc0: 50 3a 20 52 2d 30 34 34 36 30 2d 35 33 33 38 36  P: R-04460-53386
4fd0: 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73   */.      rc = s
4fe0: 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62  etupLookaside(db
4ff0: 2c 20 70 42 75 66 2c 20 73 7a 2c 20 63 6e 74 29  , pBuf, sz, cnt)
5000: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5010: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
5020: 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  : {.      static
5030: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
5040: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 3b 20          int op; 
5050: 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70 63 6f       /* The opco
5060: 64 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 33  de */.        u3
5070: 32 20 6d 61 73 6b 3b 20 20 20 20 2f 2a 20 4d 61  2 mask;    /* Ma
5080: 73 6b 20 6f 66 20 74 68 65 20 62 69 74 20 69 6e  sk of the bit in
5090: 20 73 71 6c 69 74 65 33 2e 66 6c 61 67 73 20 74   sqlite3.flags t
50a0: 6f 20 73 65 74 2f 63 6c 65 61 72 20 2a 2f 0a 20  o set/clear */. 
50b0: 20 20 20 20 20 7d 20 61 46 6c 61 67 4f 70 5b 5d       } aFlagOp[]
50c0: 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 7b 20 53   = {.        { S
50d0: 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
50e0: 4e 41 42 4c 45 5f 46 4b 45 59 2c 20 20 20 20 53  NABLE_FKEY,    S
50f0: 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
5100: 73 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20  s    },.        
5110: 7b 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  { SQLITE_DBCONFI
5120: 47 5f 45 4e 41 42 4c 45 5f 54 52 49 47 47 45 52  G_ENABLE_TRIGGER
5130: 2c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c 65 54  , SQLITE_EnableT
5140: 72 69 67 67 65 72 20 20 7d 2c 0a 20 20 20 20 20  rigger  },.     
5150: 20 7d 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e   };.      unsign
5160: 65 64 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20  ed int i;.      
5170: 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
5180: 52 3b 20 2f 2a 20 49 4d 50 3a 20 52 2d 34 32 37  R; /* IMP: R-427
5190: 39 30 2d 32 33 33 37 32 20 2a 2f 0a 20 20 20 20  90-23372 */.    
51a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
51b0: 61 79 53 69 7a 65 28 61 46 6c 61 67 4f 70 29 3b  aySize(aFlagOp);
51c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
51d0: 66 28 20 61 46 6c 61 67 4f 70 5b 69 5d 2e 6f 70  f( aFlagOp[i].op
51e0: 3d 3d 6f 70 20 29 7b 0a 20 20 20 20 20 20 20 20  ==op ){.        
51f0: 20 20 69 6e 74 20 6f 6e 6f 66 66 20 3d 20 76 61    int onoff = va
5200: 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20  _arg(ap, int);. 
5210: 20 20 20 20 20 20 20 20 20 69 6e 74 20 2a 70 52           int *pR
5220: 65 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  es = va_arg(ap, 
5230: 69 6e 74 2a 29 3b 0a 20 20 20 20 20 20 20 20 20  int*);.         
5240: 20 69 6e 74 20 6f 6c 64 46 6c 61 67 73 20 3d 20   int oldFlags = 
5250: 64 62 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20 20  db->flags;.     
5260: 20 20 20 20 20 69 66 28 20 6f 6e 6f 66 66 3e 30       if( onoff>0
5270: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5280: 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 61 46 6c  db->flags |= aFl
5290: 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 3b 0a 20 20  agOp[i].mask;.  
52a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
52b0: 28 20 6f 6e 6f 66 66 3d 3d 30 20 29 7b 0a 20 20  ( onoff==0 ){.  
52c0: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
52d0: 61 67 73 20 26 3d 20 7e 61 46 6c 61 67 4f 70 5b  ags &= ~aFlagOp[
52e0: 69 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20  i].mask;.       
52f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
5300: 66 28 20 6f 6c 64 46 6c 61 67 73 21 3d 64 62 2d  f( oldFlags!=db-
5310: 3e 66 6c 61 67 73 20 29 7b 0a 20 20 20 20 20 20  >flags ){.      
5320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
5330: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
5340: 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 20  ments(db);.     
5350: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
5360: 20 69 66 28 20 70 52 65 73 20 29 7b 0a 20 20 20   if( pRes ){.   
5370: 20 20 20 20 20 20 20 20 20 2a 70 52 65 73 20 3d           *pRes =
5380: 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20 61 46   (db->flags & aF
5390: 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73 6b 29 21 3d  lagOp[i].mask)!=
53a0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  0;.          }. 
53b0: 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
53c0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
53d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
53e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
53f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5400: 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
5410: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5420: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5430: 72 75 65 20 69 66 20 74 68 65 20 62 75 66 66 65  rue if the buffe
5440: 72 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 63 6f 6e 74  r z[0..n-1] cont
5450: 61 69 6e 73 20 61 6c 6c 20 73 70 61 63 65 73 2e  ains all spaces.
5460: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
5470: 6c 6c 53 70 61 63 65 73 28 63 6f 6e 73 74 20 63  llSpaces(const c
5480: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
5490: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
54a0: 7a 5b 6e 2d 31 5d 3d 3d 27 20 27 20 29 7b 20 6e  z[n-1]==' ' ){ n
54b0: 2d 2d 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  --; }.  return n
54c0: 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  ==0;.}../*.** Th
54d0: 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75 6c  is is the defaul
54e0: 74 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63  t collating func
54f0: 74 69 6f 6e 20 6e 61 6d 65 64 20 22 42 49 4e 41  tion named "BINA
5500: 52 59 22 20 77 68 69 63 68 20 69 73 20 61 6c 77  RY" which is alw
5510: 61 79 73 0a 2a 2a 20 61 76 61 69 6c 61 62 6c 65  ays.** available
5520: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70  ..**.** If the p
5530: 61 64 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20  adFlag argument 
5540: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
5550: 20 73 70 61 63 65 20 70 61 64 64 69 6e 67 20 61   space padding a
5560: 74 20 74 68 65 20 65 6e 64 0a 2a 2a 20 6f 66 20  t the end.** of 
5570: 73 74 72 69 6e 67 73 20 69 73 20 69 67 6e 6f 72  strings is ignor
5580: 65 64 2e 20 20 54 68 69 73 20 69 6d 70 6c 65 6d  ed.  This implem
5590: 65 6e 74 73 20 74 68 65 20 52 54 52 49 4d 20 63  ents the RTRIM c
55a0: 6f 6c 6c 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  ollation..*/.sta
55b0: 74 69 63 20 69 6e 74 20 62 69 6e 43 6f 6c 6c 46  tic int binCollF
55c0: 75 6e 63 28 0a 20 20 76 6f 69 64 20 2a 70 61 64  unc(.  void *pad
55d0: 46 6c 61 67 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Flag,.  int nKey
55e0: 31 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  1, const void *p
55f0: 4b 65 79 31 2c 0a 20 20 69 6e 74 20 6e 4b 65 79  Key1,.  int nKey
5600: 32 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  2, const void *p
5610: 4b 65 79 32 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Key2.){.  int rc
5620: 2c 20 6e 3b 0a 20 20 6e 20 3d 20 6e 4b 65 79 31  , n;.  n = nKey1
5630: 3c 6e 4b 65 79 32 20 3f 20 6e 4b 65 79 31 20 3a  <nKey2 ? nKey1 :
5640: 20 6e 4b 65 79 32 3b 0a 20 20 72 63 20 3d 20 6d   nKey2;.  rc = m
5650: 65 6d 63 6d 70 28 70 4b 65 79 31 2c 20 70 4b 65  emcmp(pKey1, pKe
5660: 79 32 2c 20 6e 29 3b 0a 20 20 69 66 28 20 72 63  y2, n);.  if( rc
5670: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
5680: 61 64 46 6c 61 67 0a 20 20 20 20 20 26 26 20 61  adFlag.     && a
5690: 6c 6c 53 70 61 63 65 73 28 28 28 63 68 61 72 2a  llSpaces(((char*
56a0: 29 70 4b 65 79 31 29 2b 6e 2c 20 6e 4b 65 79 31  )pKey1)+n, nKey1
56b0: 2d 6e 29 0a 20 20 20 20 20 26 26 20 61 6c 6c 53  -n).     && allS
56c0: 70 61 63 65 73 28 28 28 63 68 61 72 2a 29 70 4b  paces(((char*)pK
56d0: 65 79 32 29 2b 6e 2c 20 6e 4b 65 79 32 2d 6e 29  ey2)+n, nKey2-n)
56e0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
56f0: 20 4c 65 61 76 65 20 72 63 20 75 6e 63 68 61 6e   Leave rc unchan
5700: 67 65 64 20 61 74 20 30 20 2a 2f 0a 20 20 20 20  ged at 0 */.    
5710: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
5720: 3d 20 6e 4b 65 79 31 20 2d 20 6e 4b 65 79 32 3b  = nKey1 - nKey2;
5730: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5740: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
5750: 20 41 6e 6f 74 68 65 72 20 62 75 69 6c 74 2d 69   Another built-i
5760: 6e 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  n collating sequ
5770: 65 6e 63 65 3a 20 4e 4f 43 41 53 45 2e 20 0a 2a  ence: NOCASE. .*
5780: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 6c 6c 61 74  *.** This collat
5790: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 69 73 20  ing sequence is 
57a0: 69 6e 74 65 6e 64 65 64 20 74 6f 20 62 65 20 75  intended to be u
57b0: 73 65 64 20 66 6f 72 20 22 63 61 73 65 20 69 6e  sed for "case in
57c0: 64 65 70 65 6e 64 65 6e 74 0a 2a 2a 20 63 6f 6d  dependent.** com
57d0: 70 61 72 69 73 6f 6e 22 2e 20 53 51 4c 69 74 65  parison". SQLite
57e0: 27 73 20 6b 6e 6f 77 6c 65 64 67 65 20 6f 66 20  's knowledge of 
57f0: 75 70 70 65 72 20 61 6e 64 20 6c 6f 77 65 72 20  upper and lower 
5800: 63 61 73 65 20 65 71 75 69 76 61 6c 65 6e 74 73  case equivalents
5810: 0a 2a 2a 20 65 78 74 65 6e 64 73 20 6f 6e 6c 79  .** extends only
5820: 20 74 6f 20 74 68 65 20 32 36 20 63 68 61 72 61   to the 26 chara
5830: 63 74 65 72 73 20 75 73 65 64 20 69 6e 20 74 68  cters used in th
5840: 65 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  e English langua
5850: 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65  ge..**.** At the
5860: 20 6d 6f 6d 65 6e 74 20 74 68 65 72 65 20 69 73   moment there is
5870: 20 6f 6e 6c 79 20 61 20 55 54 46 2d 38 20 69 6d   only a UTF-8 im
5880: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 0a 2a 2f  plementation..*/
5890: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 6f 63 61  .static int noca
58a0: 73 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 28  seCollatingFunc(
58b0: 0a 20 20 76 6f 69 64 20 2a 4e 6f 74 55 73 65 64  .  void *NotUsed
58c0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63  ,.  int nKey1, c
58d0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31  onst void *pKey1
58e0: 2c 0a 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63  ,.  int nKey2, c
58f0: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32  onst void *pKey2
5900: 0a 29 7b 0a 20 20 69 6e 74 20 72 20 3d 20 73 71  .){.  int r = sq
5910: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 0a 20  lite3StrNICmp(. 
5920: 20 20 20 20 20 28 63 6f 6e 73 74 20 63 68 61 72       (const char
5930: 20 2a 29 70 4b 65 79 31 2c 20 28 63 6f 6e 73 74   *)pKey1, (const
5940: 20 63 68 61 72 20 2a 29 70 4b 65 79 32 2c 20 28   char *)pKey2, (
5950: 6e 4b 65 79 31 3c 6e 4b 65 79 32 29 3f 6e 4b 65  nKey1<nKey2)?nKe
5960: 79 31 3a 6e 4b 65 79 32 29 3b 0a 20 20 55 4e 55  y1:nKey2);.  UNU
5970: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f  SED_PARAMETER(No
5980: 74 55 73 65 64 29 3b 0a 20 20 69 66 28 20 30 3d  tUsed);.  if( 0=
5990: 3d 72 20 29 7b 0a 20 20 20 20 72 20 3d 20 6e 4b  =r ){.    r = nK
59a0: 65 79 31 2d 6e 4b 65 79 32 3b 0a 20 20 7d 0a 20  ey1-nKey2;.  }. 
59b0: 20 72 65 74 75 72 6e 20 72 3b 0a 7d 0a 0a 2f 2a   return r;.}../*
59c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 52  .** Return the R
59d0: 4f 57 49 44 20 6f 66 20 74 68 65 20 6d 6f 73 74  OWID of the most
59e0: 20 72 65 63 65 6e 74 20 69 6e 73 65 72 74 0a 2a   recent insert.*
59f0: 2f 0a 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73  /.sqlite_int64 s
5a00: 71 6c 69 74 65 33 5f 6c 61 73 74 5f 69 6e 73 65  qlite3_last_inse
5a10: 72 74 5f 72 6f 77 69 64 28 73 71 6c 69 74 65 33  rt_rowid(sqlite3
5a20: 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20   *db){.  return 
5a30: 64 62 2d 3e 6c 61 73 74 52 6f 77 69 64 3b 0a 7d  db->lastRowid;.}
5a40: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5a50: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61  he number of cha
5a60: 6e 67 65 73 20 69 6e 20 74 68 65 20 6d 6f 73 74  nges in the most
5a70: 20 72 65 63 65 6e 74 20 63 61 6c 6c 20 74 6f 20   recent call to 
5a80: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 2e 0a  sqlite3_exec()..
5a90: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
5aa0: 68 61 6e 67 65 73 28 73 71 6c 69 74 65 33 20 2a  hanges(sqlite3 *
5ab0: 64 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 64 62  db){.  return db
5ac0: 2d 3e 6e 43 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a  ->nChange;.}../*
5ad0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
5ae0: 75 6d 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73  umber of changes
5af0: 20 73 69 6e 63 65 20 74 68 65 20 64 61 74 61 62   since the datab
5b00: 61 73 65 20 68 61 6e 64 6c 65 20 77 61 73 20 6f  ase handle was o
5b10: 70 65 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pened..*/.int sq
5b20: 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63 68 61 6e  lite3_total_chan
5b30: 67 65 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29  ges(sqlite3 *db)
5b40: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e  {.  return db->n
5b50: 54 6f 74 61 6c 43 68 61 6e 67 65 3b 0a 7d 0a 0a  TotalChange;.}..
5b60: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20  /*.** Close all 
5b70: 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 2e  open savepoints.
5b80: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6f   This function o
5b90: 6e 6c 79 20 6d 61 6e 69 70 75 6c 61 74 65 73 20  nly manipulates 
5ba0: 66 69 65 6c 64 73 20 6f 66 20 74 68 65 0a 2a 2a  fields of the.**
5bb0: 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
5bc0: 20 6f 62 6a 65 63 74 2c 20 69 74 20 64 6f 65 73   object, it does
5bd0: 20 6e 6f 74 20 63 6c 6f 73 65 20 61 6e 79 20 73   not close any s
5be0: 61 76 65 70 6f 69 6e 74 73 20 74 68 61 74 20 6d  avepoints that m
5bf0: 61 79 20 62 65 20 6f 70 65 6e 0a 2a 2a 20 61 74  ay be open.** at
5c00: 20 74 68 65 20 62 2d 74 72 65 65 2f 70 61 67 65   the b-tree/page
5c10: 72 20 6c 65 76 65 6c 2e 0a 2a 2f 0a 76 6f 69 64  r level..*/.void
5c20: 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76   sqlite3CloseSav
5c30: 65 70 6f 69 6e 74 73 28 73 71 6c 69 74 65 33 20  epoints(sqlite3 
5c40: 2a 64 62 29 7b 0a 20 20 77 68 69 6c 65 28 20 64  *db){.  while( d
5c50: 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 20 29 7b  b->pSavepoint ){
5c60: 0a 20 20 20 20 53 61 76 65 70 6f 69 6e 74 20 2a  .    Savepoint *
5c70: 70 54 6d 70 20 3d 20 64 62 2d 3e 70 53 61 76 65  pTmp = db->pSave
5c80: 70 6f 69 6e 74 3b 0a 20 20 20 20 64 62 2d 3e 70  point;.    db->p
5c90: 53 61 76 65 70 6f 69 6e 74 20 3d 20 70 54 6d 70  Savepoint = pTmp
5ca0: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 73 71 6c  ->pNext;.    sql
5cb0: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
5cc0: 54 6d 70 29 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  Tmp);.  }.  db->
5cd0: 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30 3b 0a  nSavepoint = 0;.
5ce0: 20 20 64 62 2d 3e 6e 53 74 61 74 65 6d 65 6e 74    db->nStatement
5cf0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 69 73 54 72   = 0;.  db->isTr
5d00: 61 6e 73 61 63 74 69 6f 6e 53 61 76 65 70 6f 69  ansactionSavepoi
5d10: 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
5d20: 20 49 6e 76 6f 6b 65 20 74 68 65 20 64 65 73 74   Invoke the dest
5d30: 72 75 63 74 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ructor function 
5d40: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
5d50: 46 75 6e 63 44 65 66 20 70 2c 20 69 66 20 61 6e  FuncDef p, if an
5d60: 79 2e 20 45 78 63 65 70 74 2c 0a 2a 2a 20 69 66  y. Except,.** if
5d70: 20 74 68 69 73 20 69 73 20 6e 6f 74 20 74 68 65   this is not the
5d80: 20 6c 61 73 74 20 63 6f 70 79 20 6f 66 20 74 68   last copy of th
5d90: 65 20 66 75 6e 63 74 69 6f 6e 2c 20 64 6f 20 6e  e function, do n
5da0: 6f 74 20 69 6e 76 6f 6b 65 20 69 74 2e 20 4d 75  ot invoke it. Mu
5db0: 6c 74 69 70 6c 65 0a 2a 2a 20 63 6f 70 69 65 73  ltiple.** copies
5dc0: 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 66 75 6e   of a single fun
5dd0: 63 74 69 6f 6e 20 61 72 65 20 63 72 65 61 74 65  ction are create
5de0: 64 20 77 68 65 6e 20 63 72 65 61 74 65 5f 66 75  d when create_fu
5df0: 6e 63 74 69 6f 6e 28 29 20 69 73 20 63 61 6c 6c  nction() is call
5e00: 65 64 0a 2a 2a 20 77 69 74 68 20 53 51 4c 49 54  ed.** with SQLIT
5e10: 45 5f 41 4e 59 20 61 73 20 74 68 65 20 65 6e 63  E_ANY as the enc
5e20: 6f 64 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  oding..*/.static
5e30: 20 76 6f 69 64 20 66 75 6e 63 74 69 6f 6e 44 65   void functionDe
5e40: 73 74 72 6f 79 28 73 71 6c 69 74 65 33 20 2a 64  stroy(sqlite3 *d
5e50: 62 2c 20 46 75 6e 63 44 65 66 20 2a 70 29 7b 0a  b, FuncDef *p){.
5e60: 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72    FuncDestructor
5e70: 20 2a 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20   *pDestructor = 
5e80: 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 3b 0a  p->pDestructor;.
5e90: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
5ea0: 72 20 29 7b 0a 20 20 20 20 70 44 65 73 74 72 75  r ){.    pDestru
5eb0: 63 74 6f 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ctor->nRef--;.  
5ec0: 20 20 69 66 28 20 70 44 65 73 74 72 75 63 74 6f    if( pDestructo
5ed0: 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  r->nRef==0 ){.  
5ee0: 20 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d      pDestructor-
5ef0: 3e 78 44 65 73 74 72 6f 79 28 70 44 65 73 74 72  >xDestroy(pDestr
5f00: 75 63 74 6f 72 2d 3e 70 55 73 65 72 44 61 74 61  uctor->pUserData
5f10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
5f20: 44 62 46 72 65 65 28 64 62 2c 20 70 44 65 73 74  DbFree(db, pDest
5f30: 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  ructor);.    }. 
5f40: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 63   }.}../*.** Disc
5f50: 6f 6e 6e 65 63 74 20 61 6c 6c 20 73 71 6c 69 74  onnect all sqlit
5f60: 65 33 5f 76 74 61 62 20 6f 62 6a 65 63 74 73 20  e3_vtab objects 
5f70: 74 68 61 74 20 62 65 6c 6f 6e 67 20 74 6f 20 64  that belong to d
5f80: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
5f90: 6f 6e 0a 2a 2a 20 64 62 2e 20 54 68 69 73 20 69  on.** db. This i
5fa0: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 64 62  s called when db
5fb0: 20 69 73 20 62 65 69 6e 67 20 63 6c 6f 73 65 64   is being closed
5fc0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5fd0: 20 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74   disconnectAllVt
5fe0: 61 62 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ab(sqlite3 *db){
5ff0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
6000: 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
6010: 45 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c  E.  int i;.  sql
6020: 69 74 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c  ite3BtreeEnterAl
6030: 6c 28 64 62 29 3b 0a 20 20 66 6f 72 28 69 3d 30  l(db);.  for(i=0
6040: 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b  ; i<db->nDb; i++
6050: 29 7b 0a 20 20 20 20 53 63 68 65 6d 61 20 2a 70  ){.    Schema *p
6060: 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61 44 62  Schema = db->aDb
6070: 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20 20 20  [i].pSchema;.   
6080: 20 69 66 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e   if( db->aDb[i].
6090: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
60a0: 20 48 61 73 68 45 6c 65 6d 20 2a 70 3b 0a 20 20   HashElem *p;.  
60b0: 20 20 20 20 66 6f 72 28 70 3d 73 71 6c 69 74 65      for(p=sqlite
60c0: 48 61 73 68 46 69 72 73 74 28 26 70 53 63 68 65  HashFirst(&pSche
60d0: 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b 20 70 3b  ma->tblHash); p;
60e0: 20 70 3d 73 71 6c 69 74 65 48 61 73 68 4e 65 78   p=sqliteHashNex
60f0: 74 28 70 29 29 7b 0a 20 20 20 20 20 20 20 20 54  t(p)){.        T
6100: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 28 54 61  able *pTab = (Ta
6110: 62 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68  ble *)sqliteHash
6120: 44 61 74 61 28 70 29 3b 0a 20 20 20 20 20 20 20  Data(p);.       
6130: 20 69 66 28 20 49 73 56 69 72 74 75 61 6c 28 70   if( IsVirtual(p
6140: 54 61 62 29 20 29 20 73 71 6c 69 74 65 33 56 74  Tab) ) sqlite3Vt
6150: 61 62 44 69 73 63 6f 6e 6e 65 63 74 28 64 62 2c  abDisconnect(db,
6160: 20 70 54 61 62 29 3b 0a 20 20 20 20 20 20 7d 0a   pTab);.      }.
6170: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
6180: 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
6190: 28 64 62 29 3b 0a 23 65 6c 73 65 0a 20 20 55 4e  (db);.#else.  UN
61a0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 64  USED_PARAMETER(d
61b0: 62 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  b);.#endif.}../*
61c0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
61d0: 69 66 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  if database conn
61e0: 65 63 74 69 6f 6e 20 64 62 20 68 61 73 20 75 6e  ection db has un
61f0: 66 69 6e 61 6c 69 7a 65 64 20 70 72 65 70 61 72  finalized prepar
6200: 65 64 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 73  ed.** statements
6210: 20 6f 72 20 75 6e 66 69 6e 69 73 68 65 64 20 73   or unfinished s
6220: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 6f 62  qlite3_backup ob
6230: 6a 65 63 74 73 2e 20 20 0a 2a 2f 0a 73 74 61 74  jects.  .*/.stat
6240: 69 63 20 69 6e 74 20 63 6f 6e 6e 65 63 74 69 6f  ic int connectio
6250: 6e 49 73 42 75 73 79 28 73 71 6c 69 74 65 33 20  nIsBusy(sqlite3 
6260: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 6a 3b 0a 20  *db){.  int j;. 
6270: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
6280: 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e  _mutex_held(db->
6290: 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20  mutex) );.  if( 
62a0: 64 62 2d 3e 70 56 64 62 65 20 29 20 72 65 74 75  db->pVdbe ) retu
62b0: 72 6e 20 31 3b 0a 20 20 66 6f 72 28 6a 3d 30 3b  rn 1;.  for(j=0;
62c0: 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29   j<db->nDb; j++)
62d0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 42 74  {.    Btree *pBt
62e0: 20 3d 20 64 62 2d 3e 61 44 62 5b 6a 5d 2e 70 42   = db->aDb[j].pB
62f0: 74 3b 0a 20 20 20 20 69 66 28 20 70 42 74 20 26  t;.    if( pBt &
6300: 26 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  & sqlite3BtreeIs
6310: 49 6e 42 61 63 6b 75 70 28 70 42 74 29 20 29 20  InBackup(pBt) ) 
6320: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
6330: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
6340: 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 65 78 69 73  ** Close an exis
6350: 74 69 6e 67 20 53 51 4c 69 74 65 20 64 61 74 61  ting SQLite data
6360: 62 61 73 65 0a 2a 2f 0a 73 74 61 74 69 63 20 69  base.*/.static i
6370: 6e 74 20 73 71 6c 69 74 65 33 43 6c 6f 73 65 28  nt sqlite3Close(
6380: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74  sqlite3 *db, int
6390: 20 66 6f 72 63 65 5a 6f 6d 62 69 65 29 7b 0a 20   forceZombie){. 
63a0: 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20 20 20   if( !db ){.    
63b0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
63c0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
63d0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
63e0: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
63f0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6400: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
6410: 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  }.  sqlite3_mute
6420: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
6430: 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72 63 65 20  x);..  /* Force 
6440: 78 44 69 73 63 6f 6e 6e 65 63 74 20 63 61 6c 6c  xDisconnect call
6450: 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74 75 61 6c  s on all virtual
6460: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 64 69 73   tables */.  dis
6470: 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 64  connectAllVtab(d
6480: 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 74  b);..  /* If a t
6490: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
64a0: 65 6e 2c 20 74 68 65 20 64 69 73 63 6f 6e 6e 65  en, the disconne
64b0: 63 74 41 6c 6c 56 74 61 62 28 29 20 63 61 6c 6c  ctAllVtab() call
64c0: 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77 69 6c 6c   above.  ** will
64d0: 20 6e 6f 74 20 68 61 76 65 20 63 61 6c 6c 65 64   not have called
64e0: 20 74 68 65 20 78 44 69 73 63 6f 6e 6e 65 63 74   the xDisconnect
64f0: 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20 61 6e 79  () method on any
6500: 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a 20 74 61   virtual.  ** ta
6510: 62 6c 65 73 20 69 6e 20 74 68 65 20 64 62 2d 3e  bles in the db->
6520: 61 56 54 72 61 6e 73 5b 5d 20 61 72 72 61 79 2e  aVTrans[] array.
6530: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
6540: 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c 62 61  qlite3VtabRollba
6550: 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c 6c 20 77  ck().  ** call w
6560: 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65 20 6e 65  ill do so. We ne
6570: 65 64 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ed to do this be
6580: 66 6f 72 65 20 74 68 65 20 63 68 65 63 6b 20 66  fore the check f
6590: 6f 72 20 61 63 74 69 76 65 0a 20 20 2a 2a 20 53  or active.  ** S
65a0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 62 65  QL statements be
65b0: 6c 6f 77 2c 20 61 73 20 74 68 65 20 76 2d 74 61  low, as the v-ta
65c0: 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  ble implementati
65d0: 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f 72 69 6e  on may be storin
65e0: 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70 72 65 70  g.  ** some prep
65f0: 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 73 20  ared statements 
6600: 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f  internally..  */
6610: 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f  .  sqlite3VtabRo
6620: 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a 20 20 2f  llback(db);..  /
6630: 2a 20 4c 65 67 61 63 79 20 62 65 68 61 76 69 6f  * Legacy behavio
6640: 72 20 28 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65  r (sqlite3_close
6650: 28 29 20 62 65 68 61 76 69 6f 72 29 20 69 73 20  () behavior) is 
6660: 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53  to return.  ** S
6670: 51 4c 49 54 45 5f 42 55 53 59 20 69 66 20 74 68  QLITE_BUSY if th
6680: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 61 6e  e connection can
6690: 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65 64 20 69   not be closed i
66a0: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2f  mmediately..  */
66b0: 0a 20 20 69 66 28 20 21 66 6f 72 63 65 5a 6f 6d  .  if( !forceZom
66c0: 62 69 65 20 26 26 20 63 6f 6e 6e 65 63 74 69 6f  bie && connectio
66d0: 6e 49 73 42 75 73 79 28 64 62 29 20 29 7b 0a 20  nIsBusy(db) ){. 
66e0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
66f0: 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
6700: 20 22 75 6e 61 62 6c 65 20 74 6f 20 63 6c 6f 73   "unable to clos
6710: 65 20 64 75 65 20 74 6f 20 75 6e 66 69 6e 61 6c  e due to unfinal
6720: 69 7a 65 64 20 22 0a 20 20 20 20 20 20 20 22 73  ized ".       "s
6730: 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66  tatements or unf
6740: 69 6e 69 73 68 65 64 20 62 61 63 6b 75 70 73 22  inished backups"
6750: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
6760: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
6770: 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74 75 72  utex);.    retur
6780: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
6790: 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54   }..#ifdef SQLIT
67a0: 45 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a  E_ENABLE_SQLLOG.
67b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
67c0: 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
67d0: 67 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6c 6f 73  g ){.    /* Clos
67e0: 69 6e 67 20 74 68 65 20 68 61 6e 64 6c 65 2e 20  ing the handle. 
67f0: 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72  Fourth parameter
6800: 20 69 73 20 70 61 73 73 65 64 20 74 68 65 20 76   is passed the v
6810: 61 6c 75 65 20 32 2e 20 2a 2f 0a 20 20 20 20 73  alue 2. */.    s
6820: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
6830: 69 67 2e 78 53 71 6c 6c 6f 67 28 73 71 6c 69 74  ig.xSqllog(sqlit
6840: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70  e3GlobalConfig.p
6850: 53 71 6c 6c 6f 67 41 72 67 2c 20 64 62 2c 20 30  SqllogArg, db, 0
6860: 2c 20 32 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 2);.  }.#endif
6870: 0a 0a 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74  ..  /* Convert t
6880: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 6e  he connection in
6890: 74 6f 20 61 20 7a 6f 6d 62 69 65 20 61 6e 64 20  to a zombie and 
68a0: 74 68 65 6e 20 63 6c 6f 73 65 20 69 74 2e 0a 20  then close it.. 
68b0: 20 2a 2f 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20   */.  db->magic 
68c0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 5a  = SQLITE_MAGIC_Z
68d0: 4f 4d 42 49 45 3b 0a 20 20 73 71 6c 69 74 65 33  OMBIE;.  sqlite3
68e0: 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f  LeaveMutexAndClo
68f0: 73 65 5a 6f 6d 62 69 65 28 64 62 29 3b 0a 20 20  seZombie(db);.  
6900: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
6910: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 77 6f 20 76  ;.}../*.** Two v
6920: 61 72 69 61 74 69 6f 6e 73 20 6f 6e 20 74 68 65  ariations on the
6930: 20 70 75 62 6c 69 63 20 69 6e 74 65 72 66 61 63   public interfac
6940: 65 20 66 6f 72 20 63 6c 6f 73 69 6e 67 20 61 20  e for closing a 
6950: 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e  database.** conn
6960: 65 63 74 69 6f 6e 2e 20 54 68 65 20 73 71 6c 69  ection. The sqli
6970: 74 65 33 5f 63 6c 6f 73 65 28 29 20 76 65 72 73  te3_close() vers
6980: 69 6f 6e 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ion returns SQLI
6990: 54 45 5f 42 55 53 59 20 61 6e 64 0a 2a 2a 20 6c  TE_BUSY and.** l
69a0: 65 61 76 65 73 20 74 68 65 20 63 6f 6e 6e 65 63  eaves the connec
69b0: 74 69 6f 6e 20 6f 70 74 69 6f 6e 20 69 66 20 74  tion option if t
69c0: 68 65 72 65 20 61 72 65 20 75 6e 66 69 6e 61 6c  here are unfinal
69d0: 69 7a 65 64 20 70 72 65 70 61 72 65 64 0a 2a 2a  ized prepared.**
69e0: 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 72 20 75   statements or u
69f0: 6e 66 69 6e 69 73 68 65 64 20 73 71 6c 69 74 65  nfinished sqlite
6a00: 33 5f 62 61 63 6b 75 70 73 2e 20 20 54 68 65 20  3_backups.  The 
6a10: 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76 32  sqlite3_close_v2
6a20: 28 29 0a 2a 2a 20 76 65 72 73 69 6f 6e 20 66 6f  ().** version fo
6a30: 72 63 65 73 20 74 68 65 20 63 6f 6e 6e 65 63 74  rces the connect
6a40: 69 6f 6e 20 74 6f 20 62 65 63 6f 6d 65 20 61 20  ion to become a 
6a50: 7a 6f 6d 62 69 65 20 69 66 20 74 68 65 72 65 20  zombie if there 
6a60: 61 72 65 0a 2a 2a 20 75 6e 63 6c 6f 73 65 64 20  are.** unclosed 
6a70: 72 65 73 6f 75 72 63 65 73 2c 20 61 6e 64 20 61  resources, and a
6a80: 72 72 61 6e 67 65 73 20 66 6f 72 20 64 65 61 6c  rranges for deal
6a90: 6c 6f 63 61 74 69 6f 6e 20 77 68 65 6e 20 74 68  location when th
6aa0: 65 20 6c 61 73 74 0a 2a 2a 20 70 72 65 70 61 72  e last.** prepar
6ab0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73  e statement or s
6ac0: 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 63 6c  qlite3_backup cl
6ad0: 6f 73 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oses..*/.int sql
6ae0: 69 74 65 33 5f 63 6c 6f 73 65 28 73 71 6c 69 74  ite3_close(sqlit
6af0: 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20  e3 *db){ return 
6b00: 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c  sqlite3Close(db,
6b10: 30 29 3b 20 7d 0a 69 6e 74 20 73 71 6c 69 74 65  0); }.int sqlite
6b20: 33 5f 63 6c 6f 73 65 5f 76 32 28 73 71 6c 69 74  3_close_v2(sqlit
6b30: 65 33 20 2a 64 62 29 7b 20 72 65 74 75 72 6e 20  e3 *db){ return 
6b40: 73 71 6c 69 74 65 33 43 6c 6f 73 65 28 64 62 2c  sqlite3Close(db,
6b50: 31 29 3b 20 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c  1); }.../*.** Cl
6b60: 6f 73 65 20 74 68 65 20 6d 75 74 65 78 20 6f 6e  ose the mutex on
6b70: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
6b80: 74 69 6f 6e 20 64 62 2e 0a 2a 2a 0a 2a 2a 20 46  tion db..**.** F
6b90: 75 72 74 68 65 72 6d 6f 72 65 2c 20 69 66 20 64  urthermore, if d
6ba0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6bb0: 6f 6e 20 64 62 20 69 73 20 61 20 7a 6f 6d 62 69  on db is a zombi
6bc0: 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  e (meaning that 
6bd0: 74 68 65 72 65 0a 2a 2a 20 68 61 73 20 62 65 65  there.** has bee
6be0: 6e 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  n a prior call t
6bf0: 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  o sqlite3_close(
6c00: 64 62 29 20 6f 72 20 73 71 6c 69 74 65 33 5f 63  db) or sqlite3_c
6c10: 6c 6f 73 65 5f 76 32 28 64 62 29 29 20 61 6e 64  lose_v2(db)) and
6c20: 0a 2a 2a 20 65 76 65 72 79 20 73 71 6c 69 74 65  .** every sqlite
6c30: 33 5f 73 74 6d 74 20 68 61 73 20 6e 6f 77 20 62  3_stmt has now b
6c40: 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 61 6e  een finalized an
6c50: 64 20 65 76 65 72 79 20 73 71 6c 69 74 65 33 5f  d every sqlite3_
6c60: 62 61 63 6b 75 70 20 68 61 73 0a 2a 2a 20 66 69  backup has.** fi
6c70: 6e 69 73 68 65 64 2c 20 74 68 65 6e 20 66 72 65  nished, then fre
6c80: 65 20 61 6c 6c 20 72 65 73 6f 75 72 63 65 73 2e  e all resources.
6c90: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
6ca0: 4c 65 61 76 65 4d 75 74 65 78 41 6e 64 43 6c 6f  LeaveMutexAndClo
6cb0: 73 65 5a 6f 6d 62 69 65 28 73 71 6c 69 74 65 33  seZombie(sqlite3
6cc0: 20 2a 64 62 29 7b 0a 20 20 48 61 73 68 45 6c 65   *db){.  HashEle
6cd0: 6d 20 2a 69 3b 20 20 20 20 20 20 20 20 20 20 20  m *i;           
6ce0: 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
6cf0: 20 74 61 62 6c 65 20 69 74 65 72 61 74 6f 72 20   table iterator 
6d00: 2a 2f 0a 20 20 69 6e 74 20 6a 3b 0a 0a 20 20 2f  */.  int j;..  /
6d10: 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6f  * If there are o
6d20: 75 74 73 74 61 6e 64 69 6e 67 20 73 71 6c 69 74  utstanding sqlit
6d30: 65 33 5f 73 74 6d 74 20 6f 72 20 73 71 6c 69 74  e3_stmt or sqlit
6d40: 65 33 5f 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  e3_backup object
6d50: 73 0a 20 20 2a 2a 20 6f 72 20 69 66 20 74 68 65  s.  ** or if the
6d60: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73 20   connection has 
6d70: 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 63 6c 6f  not yet been clo
6d80: 73 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f 63  sed by sqlite3_c
6d90: 6c 6f 73 65 5f 76 32 28 29 2c 0a 20 20 2a 2a 20  lose_v2(),.  ** 
6da0: 74 68 65 6e 20 6a 75 73 74 20 6c 65 61 76 65 20  then just leave 
6db0: 74 68 65 20 6d 75 74 65 78 20 61 6e 64 20 72 65  the mutex and re
6dc0: 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  turn..  */.  if(
6dd0: 20 64 62 2d 3e 6d 61 67 69 63 21 3d 53 51 4c 49   db->magic!=SQLI
6de0: 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 20  TE_MAGIC_ZOMBIE 
6df0: 7c 7c 20 63 6f 6e 6e 65 63 74 69 6f 6e 49 73 42  || connectionIsB
6e00: 75 73 79 28 64 62 29 20 29 7b 0a 20 20 20 20 73  usy(db) ){.    s
6e10: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
6e20: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
6e30: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a     return;.  }..
6e40: 20 20 2f 2a 20 49 66 20 77 65 20 72 65 61 63 68    /* If we reach
6e50: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 69 74 20   this point, it 
6e60: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 64  means that the d
6e70: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
6e80: 6f 6e 20 68 61 73 0a 20 20 2a 2a 20 63 6c 6f 73  on has.  ** clos
6e90: 65 64 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 73  ed all sqlite3_s
6ea0: 74 6d 74 20 61 6e 64 20 73 71 6c 69 74 65 33 5f  tmt and sqlite3_
6eb0: 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 61  backup objects a
6ec0: 6e 64 20 68 61 73 20 62 65 65 6e 0a 20 20 2a 2a  nd has been.  **
6ed0: 20 70 61 73 73 65 64 20 74 6f 20 73 71 6c 69 74   passed to sqlit
6ee0: 65 33 5f 63 6c 6f 73 65 20 28 6d 65 61 6e 69 6e  e3_close (meanin
6ef0: 67 20 74 68 61 74 20 69 74 20 69 73 20 61 20 7a  g that it is a z
6f00: 6f 6d 62 69 65 29 2e 20 20 54 68 65 72 65 66 6f  ombie).  Therefo
6f10: 72 65 2c 0a 20 20 2a 2a 20 67 6f 20 61 68 65 61  re,.  ** go ahea
6f20: 64 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 72  d and free all r
6f30: 65 73 6f 75 72 63 65 73 2e 0a 20 20 2a 2f 0a 0a  esources..  */..
6f40: 20 20 2f 2a 20 49 66 20 61 20 74 72 61 6e 73 61    /* If a transa
6f50: 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 2c 20 72  ction is open, r
6f60: 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 54 68 69  oll it back. Thi
6f70: 73 20 61 6c 73 6f 20 65 6e 73 75 72 65 73 20 74  s also ensures t
6f80: 68 61 74 20 69 66 0a 20 20 2a 2a 20 61 6e 79 20  hat if.  ** any 
6f90: 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 73  database schemas
6fa0: 20 68 61 76 65 20 62 65 65 6e 20 6d 6f 64 69 66   have been modif
6fb0: 69 65 64 20 62 79 20 61 6e 20 75 6e 63 6f 6d 6d  ied by an uncomm
6fc0: 69 74 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  itted transactio
6fd0: 6e 0a 20 20 2a 2a 20 74 68 65 79 20 61 72 65 20  n.  ** they are 
6fe0: 72 65 73 65 74 2e 20 41 6e 64 20 74 68 61 74 20  reset. And that 
6ff0: 74 68 65 20 72 65 71 75 69 72 65 64 20 62 2d 74  the required b-t
7000: 72 65 65 20 6d 75 74 65 78 20 69 73 20 68 65 6c  ree mutex is hel
7010: 64 20 74 6f 20 6d 61 6b 65 0a 20 20 2a 2a 20 74  d to make.  ** t
7020: 68 65 20 70 61 67 65 72 20 72 6f 6c 6c 62 61 63  he pager rollbac
7030: 6b 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73  k and schema res
7040: 65 74 20 61 6e 20 61 74 6f 6d 69 63 20 6f 70 65  et an atomic ope
7050: 72 61 74 69 6f 6e 2e 20 2a 2f 0a 20 20 73 71 6c  ration. */.  sql
7060: 69 74 65 33 52 6f 6c 6c 62 61 63 6b 41 6c 6c 28  ite3RollbackAll(
7070: 64 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 0a  db, SQLITE_OK);.
7080: 0a 20 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 6f  .  /* Free any o
7090: 75 74 73 74 61 6e 64 69 6e 67 20 53 61 76 65 70  utstanding Savep
70a0: 6f 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 2e  oint structures.
70b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 43 6c 6f   */.  sqlite3Clo
70c0: 73 65 53 61 76 65 70 6f 69 6e 74 73 28 64 62 29  seSavepoints(db)
70d0: 3b 0a 0a 20 20 2f 2a 20 43 6c 6f 73 65 20 61 6c  ;..  /* Close al
70e0: 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  l database conne
70f0: 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 66 6f 72 28  ctions */.  for(
7100: 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44 62 3b 20  j=0; j<db->nDb; 
7110: 6a 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74  j++){.    struct
7120: 20 44 62 20 2a 70 44 62 20 3d 20 26 64 62 2d 3e   Db *pDb = &db->
7130: 61 44 62 5b 6a 5d 3b 0a 20 20 20 20 69 66 28 20  aDb[j];.    if( 
7140: 70 44 62 2d 3e 70 42 74 20 29 7b 0a 20 20 20 20  pDb->pBt ){.    
7150: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 43 6c    sqlite3BtreeCl
7160: 6f 73 65 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20  ose(pDb->pBt);. 
7170: 20 20 20 20 20 70 44 62 2d 3e 70 42 74 20 3d 20       pDb->pBt = 
7180: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 21 3d  0;.      if( j!=
7190: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  1 ){.        pDb
71a0: 2d 3e 70 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20  ->pSchema = 0;. 
71b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
71c0: 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20  .  /* Clear the 
71d0: 54 45 4d 50 20 73 63 68 65 6d 61 20 73 65 70 61  TEMP schema sepa
71e0: 72 61 74 65 6c 79 20 61 6e 64 20 6c 61 73 74 20  rately and last 
71f0: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 61 44 62  */.  if( db->aDb
7200: 5b 31 5d 2e 70 53 63 68 65 6d 61 20 29 7b 0a 20  [1].pSchema ){. 
7210: 20 20 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61     sqlite3Schema
7220: 43 6c 65 61 72 28 64 62 2d 3e 61 44 62 5b 31 5d  Clear(db->aDb[1]
7230: 2e 70 53 63 68 65 6d 61 29 3b 0a 20 20 7d 0a 20  .pSchema);.  }. 
7240: 20 73 71 6c 69 74 65 33 56 74 61 62 55 6e 6c 6f   sqlite3VtabUnlo
7250: 63 6b 4c 69 73 74 28 64 62 29 3b 0a 0a 20 20 2f  ckList(db);..  /
7260: 2a 20 46 72 65 65 20 75 70 20 74 68 65 20 61 72  * Free up the ar
7270: 72 61 79 20 6f 66 20 61 75 78 69 6c 69 61 72 79  ray of auxiliary
7280: 20 64 61 74 61 62 61 73 65 73 20 2a 2f 0a 20 20   databases */.  
7290: 73 71 6c 69 74 65 33 43 6f 6c 6c 61 70 73 65 44  sqlite3CollapseD
72a0: 61 74 61 62 61 73 65 41 72 72 61 79 28 64 62 29  atabaseArray(db)
72b0: 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e  ;.  assert( db->
72c0: 6e 44 62 3c 3d 32 20 29 3b 0a 20 20 61 73 73 65  nDb<=2 );.  asse
72d0: 72 74 28 20 64 62 2d 3e 61 44 62 3d 3d 64 62 2d  rt( db->aDb==db-
72e0: 3e 61 44 62 53 74 61 74 69 63 20 29 3b 0a 0a 20  >aDbStatic );.. 
72f0: 20 2f 2a 20 54 65 6c 6c 20 74 68 65 20 63 6f 64   /* Tell the cod
7300: 65 20 69 6e 20 6e 6f 74 69 66 79 2e 63 20 74 68  e in notify.c th
7310: 61 74 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  at the connectio
7320: 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 68 6f 6c 64  n no longer hold
7330: 73 20 61 6e 79 0a 20 20 2a 2a 20 6c 6f 63 6b 73  s any.  ** locks
7340: 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 72 65   and does not re
7350: 71 75 69 72 65 20 61 6e 79 20 66 75 72 74 68 65  quire any furthe
7360: 72 20 75 6e 6c 6f 63 6b 2d 6e 6f 74 69 66 79 20  r unlock-notify 
7370: 63 61 6c 6c 62 61 63 6b 73 2e 0a 20 20 2a 2f 0a  callbacks..  */.
7380: 20 20 73 71 6c 69 74 65 33 43 6f 6e 6e 65 63 74    sqlite3Connect
7390: 69 6f 6e 43 6c 6f 73 65 64 28 64 62 29 3b 0a 0a  ionClosed(db);..
73a0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 41 72 72    for(j=0; j<Arr
73b0: 61 79 53 69 7a 65 28 64 62 2d 3e 61 46 75 6e 63  aySize(db->aFunc
73c0: 2e 61 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 46  .a); j++){.    F
73d0: 75 6e 63 44 65 66 20 2a 70 4e 65 78 74 2c 20 2a  uncDef *pNext, *
73e0: 70 48 61 73 68 2c 20 2a 70 3b 0a 20 20 20 20 66  pHash, *p;.    f
73f0: 6f 72 28 70 3d 64 62 2d 3e 61 46 75 6e 63 2e 61  or(p=db->aFunc.a
7400: 5b 6a 5d 3b 20 70 3b 20 70 3d 70 48 61 73 68 29  [j]; p; p=pHash)
7410: 7b 0a 20 20 20 20 20 20 70 48 61 73 68 20 3d 20  {.      pHash = 
7420: 70 2d 3e 70 48 61 73 68 3b 0a 20 20 20 20 20 20  p->pHash;.      
7430: 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20 20  while( p ){.    
7440: 20 20 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74      functionDest
7450: 72 6f 79 28 64 62 2c 20 70 29 3b 0a 20 20 20 20  roy(db, p);.    
7460: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 2d 3e 70      pNext = p->p
7470: 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20 73 71  Next;.        sq
7480: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7490: 70 29 3b 0a 20 20 20 20 20 20 20 20 70 20 3d 20  p);.        p = 
74a0: 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
74b0: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 69     }.  }.  for(i
74c0: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
74d0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29 3b  (&db->aCollSeq);
74e0: 20 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68   i; i=sqliteHash
74f0: 4e 65 78 74 28 69 29 29 7b 0a 20 20 20 20 43 6f  Next(i)){.    Co
7500: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 28  llSeq *pColl = (
7510: 43 6f 6c 6c 53 65 71 20 2a 29 73 71 6c 69 74 65  CollSeq *)sqlite
7520: 48 61 73 68 44 61 74 61 28 69 29 3b 0a 20 20 20  HashData(i);.   
7530: 20 2f 2a 20 49 6e 76 6f 6b 65 20 61 6e 79 20 64   /* Invoke any d
7540: 65 73 74 72 75 63 74 6f 72 73 20 72 65 67 69 73  estructors regis
7550: 74 65 72 65 64 20 66 6f 72 20 63 6f 6c 6c 61 74  tered for collat
7560: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 75 73 65  ion sequence use
7570: 72 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20 20 66  r data. */.    f
7580: 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b  or(j=0; j<3; j++
7590: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 43 6f  ){.      if( pCo
75a0: 6c 6c 5b 6a 5d 2e 78 44 65 6c 20 29 7b 0a 20 20  ll[j].xDel ){.  
75b0: 20 20 20 20 20 20 70 43 6f 6c 6c 5b 6a 5d 2e 78        pColl[j].x
75c0: 44 65 6c 28 70 43 6f 6c 6c 5b 6a 5d 2e 70 55 73  Del(pColl[j].pUs
75d0: 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  er);.      }.   
75e0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62   }.    sqlite3Db
75f0: 46 72 65 65 28 64 62 2c 20 70 43 6f 6c 6c 29 3b  Free(db, pColl);
7600: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48 61  .  }.  sqlite3Ha
7610: 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 43 6f  shClear(&db->aCo
7620: 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66 20  llSeq);.#ifndef 
7630: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
7640: 55 41 4c 54 41 42 4c 45 0a 20 20 66 6f 72 28 69  UALTABLE.  for(i
7650: 3d 73 71 6c 69 74 65 48 61 73 68 46 69 72 73 74  =sqliteHashFirst
7660: 28 26 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 20  (&db->aModule); 
7670: 69 3b 20 69 3d 73 71 6c 69 74 65 48 61 73 68 4e  i; i=sqliteHashN
7680: 65 78 74 28 69 29 29 7b 0a 20 20 20 20 4d 6f 64  ext(i)){.    Mod
7690: 75 6c 65 20 2a 70 4d 6f 64 20 3d 20 28 4d 6f 64  ule *pMod = (Mod
76a0: 75 6c 65 20 2a 29 73 71 6c 69 74 65 48 61 73 68  ule *)sqliteHash
76b0: 44 61 74 61 28 69 29 3b 0a 20 20 20 20 69 66 28  Data(i);.    if(
76c0: 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f 79 20   pMod->xDestroy 
76d0: 29 7b 0a 20 20 20 20 20 20 70 4d 6f 64 2d 3e 78  ){.      pMod->x
76e0: 44 65 73 74 72 6f 79 28 70 4d 6f 64 2d 3e 70 41  Destroy(pMod->pA
76f0: 75 78 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ux);.    }.    s
7700: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7710: 20 70 4d 6f 64 29 3b 0a 20 20 7d 0a 20 20 73 71   pMod);.  }.  sq
7720: 6c 69 74 65 33 48 61 73 68 43 6c 65 61 72 28 26  lite3HashClear(&
7730: 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65  db->aModule);.#e
7740: 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33 45  ndif..  sqlite3E
7750: 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
7760: 4f 4b 2c 20 30 29 3b 20 2f 2a 20 44 65 61 6c 6c  OK, 0); /* Deall
7770: 6f 63 61 74 65 73 20 61 6e 79 20 63 61 63 68 65  ocates any cache
7780: 64 20 65 72 72 6f 72 20 73 74 72 69 6e 67 73 2e  d error strings.
7790: 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 70 45   */.  if( db->pE
77a0: 72 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  rr ){.    sqlite
77b0: 33 56 61 6c 75 65 46 72 65 65 28 64 62 2d 3e 70  3ValueFree(db->p
77c0: 45 72 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Err);.  }.  sqli
77d0: 74 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f  te3CloseExtensio
77e0: 6e 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d  ns(db);..  db->m
77f0: 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
7800: 47 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a  GIC_ERROR;..  /*
7810: 20 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61   The temp-databa
7820: 73 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c  se schema is all
7830: 6f 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74  ocated different
7840: 6c 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65  ly from the othe
7850: 72 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62  r schema.  ** ob
7860: 6a 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c  jects (using sql
7870: 69 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65  iteMalloc() dire
7880: 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66  ctly, instead of
7890: 20 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68   sqlite3BtreeSch
78a0: 65 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20  ema())..  ** So 
78b0: 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66  it needs to be f
78c0: 72 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a  reed here. Todo:
78d0: 20 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68   Why not roll th
78e0: 65 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e  e temp schema in
78f0: 74 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65  to.  ** the same
7900: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
7910: 61 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  as the one that 
7920: 61 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61  allocates the da
7930: 74 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72  tabase .  ** str
7940: 75 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73  ucture?.  */.  s
7950: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
7960: 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
7970: 65 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ema);.  sqlite3_
7980: 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
7990: 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61  mutex);.  db->ma
79a0: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
79b0: 49 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c  IC_CLOSED;.  sql
79c0: 69 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28  ite3_mutex_free(
79d0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73  db->mutex);.  as
79e0: 73 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73  sert( db->lookas
79f0: 69 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20  ide.nOut==0 );  
7a00: 2f 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f  /* Fails on a lo
7a10: 6f 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c  okaside memory l
7a20: 65 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d  eak */.  if( db-
7a30: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c  >lookaside.bMall
7a40: 6f 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69  oced ){.    sqli
7a50: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f  te3_free(db->loo
7a60: 6b 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a  kaside.pStart);.
7a70: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
7a80: 65 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ee(db);.}../*.**
7a90: 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61   Rollback all da
7aa0: 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49  tabase files.  I
7ab0: 66 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f  f tripCode is no
7ac0: 74 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65  t SQLITE_OK, the
7ad0: 6e 0a 2a 2a 20 61 6e 79 20 6f 70 65 6e 20 63 75  n.** any open cu
7ae0: 72 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69  rsors are invali
7af0: 64 61 74 65 64 20 28 22 74 72 69 70 70 65 64 22  dated ("tripped"
7b00: 20 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70 69   - as in "trippi
7b10: 6e 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20  ng a circuit.** 
7b20: 62 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61  breaker") and ma
7b30: 64 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69  de to return tri
7b40: 70 43 6f 64 65 20 69 66 20 74 68 65 72 65 20 61  pCode if there a
7b50: 72 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a  re any further.*
7b60: 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73  * attempts to us
7b70: 65 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a  e that cursor..*
7b80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f  /.void sqlite3Ro
7b90: 6c 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65  llbackAll(sqlite
7ba0: 33 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43  3 *db, int tripC
7bb0: 6f 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ode){.  int i;. 
7bc0: 20 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30   int inTrans = 0
7bd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ;.  assert( sqli
7be0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
7bf0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73  b->mutex) );.  s
7c00: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
7c10: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a  nMalloc();..  /*
7c20: 20 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72   Obtain all b-tr
7c30: 65 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f 72  ee mutexes befor
7c40: 65 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c  e making any cal
7c50: 6c 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62  ls to BtreeRollb
7c60: 61 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69  ack(). .  ** Thi
7c70: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69  s is important i
7c80: 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73  n case the trans
7c90: 61 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c  action being rol
7ca0: 6c 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20 2a  led back has.  *
7cb0: 2a 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64  * modified the d
7cc0: 61 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20  atabase schema. 
7cd0: 49 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75  If the b-tree mu
7ce0: 74 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74 61  texes are not ta
7cf0: 6b 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74  ken.  ** here, t
7d00: 68 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61 72  hen another shar
7d10: 65 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63 74  ed-cache connect
7d20: 69 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b 20  ion might sneak 
7d30: 69 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20  in between.  ** 
7d40: 74 68 65 20 64 61 74 61 62 61 73 65 20 72 6f 6c  the database rol
7d50: 6c 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61  lback and schema
7d60: 20 72 65 73 65 74 2c 20 77 68 69 63 68 20 63 61   reset, which ca
7d70: 6e 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20 20  n cause false.  
7d80: 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72 65  ** corruption re
7d90: 70 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63 61  ports in some ca
7da0: 73 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74  ses.  */.  sqlit
7db0: 65 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28  e3BtreeEnterAll(
7dc0: 64 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b  db);..  for(i=0;
7dd0: 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29   i<db->nDb; i++)
7de0: 7b 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d  {.    Btree *p =
7df0: 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b   db->aDb[i].pBt;
7e00: 0a 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20  .    if( p ){.  
7e10: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42      if( sqlite3B
7e20: 74 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29  treeIsInTrans(p)
7e30: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72   ){.        inTr
7e40: 61 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ans = 1;.      }
7e50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74  .      sqlite3Bt
7e60: 72 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74  reeRollback(p, t
7e70: 72 69 70 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  ripCode);.    }.
7e80: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61    }.  sqlite3Vta
7e90: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20  bRollback(db);. 
7ea0: 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
7eb0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66  nMalloc();..  if
7ec0: 28 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c  ( (db->flags&SQL
7ed0: 49 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65  ITE_InternChange
7ee0: 73 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69  s)!=0 && db->ini
7ef0: 74 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20  t.busy==0 ){.   
7f00: 20 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72   sqlite3ExpirePr
7f10: 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73  eparedStatements
7f20: 28 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  (db);.    sqlite
7f30: 33 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73  3ResetAllSchemas
7f40: 4f 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29  OfConnection(db)
7f50: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
7f60: 74 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29  treeLeaveAll(db)
7f70: 3b 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65  ;..  /* Any defe
7f80: 72 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20  rred constraint 
7f90: 76 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20  violations have 
7fa0: 6e 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  now been resolve
7fb0: 64 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66  d. */.  db->nDef
7fc0: 65 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20  erredCons = 0;. 
7fd0: 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d   db->nDeferredIm
7fe0: 6d 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d  mCons = 0;.  db-
7ff0: 3e 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54  >flags &= ~SQLIT
8000: 45 5f 44 65 66 65 72 46 4b 73 3b 0a 0a 20 20 2f  E_DeferFKs;..  /
8010: 2a 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65  * If one has bee
8020: 6e 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e  n configured, in
8030: 76 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63  voke the rollbac
8040: 6b 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20  k-hook callback 
8050: 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f  */.  if( db->xRo
8060: 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26  llbackCallback &
8070: 26 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64  & (inTrans || !d
8080: 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29  b->autoCommit) )
8090: 7b 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62  {.    db->xRollb
80a0: 61 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e  ackCallback(db->
80b0: 70 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20  pRollbackArg);. 
80c0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75   }.}../*.** Retu
80d0: 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69  rn a static stri
80e0: 6e 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ng containing th
80f0: 65 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e  e name correspon
8100: 64 69 6e 67 20 74 6f 20 74 68 65 20 65 72 72 6f  ding to the erro
8110: 72 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63 69 66  r code.** specif
8120: 69 65 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ied in the argum
8130: 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ent..*/.#if defi
8140: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
8150: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
8160: 49 54 45 5f 54 45 53 54 29 20 7c 7c 20 5c 0a 20  ITE_TEST) || \. 
8170: 20 20 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54     defined(SQLIT
8180: 45 5f 44 45 42 55 47 5f 4f 53 5f 54 52 41 43 45  E_DEBUG_OS_TRACE
8190: 29 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  ).const char *sq
81a0: 6c 69 74 65 33 45 72 72 4e 61 6d 65 28 69 6e 74  lite3ErrName(int
81b0: 20 72 63 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68   rc){.  const ch
81c0: 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20  ar *zName = 0;. 
81d0: 20 69 6e 74 20 69 2c 20 6f 72 69 67 52 63 20 3d   int i, origRc =
81e0: 20 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   rc;.  for(i=0; 
81f0: 69 3c 32 20 26 26 20 7a 4e 61 6d 65 3d 3d 30 3b  i<2 && zName==0;
8200: 20 69 2b 2b 2c 20 72 63 20 26 3d 20 30 78 66 66   i++, rc &= 0xff
8210: 29 7b 0a 20 20 20 20 73 77 69 74 63 68 28 20 72  ){.    switch( r
8220: 63 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  c ){.      case 
8230: 53 51 4c 49 54 45 5f 4f 4b 3a 20 20 20 20 20 20  SQLITE_OK:      
8240: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
8250: 20 3d 20 22 53 51 4c 49 54 45 5f 4f 4b 22 3b 20   = "SQLITE_OK"; 
8260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
8270: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8280: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3a 20 20   SQLITE_ERROR:  
8290: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
82a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 45 52 52 4f  e = "SQLITE_ERRO
82b0: 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  R";             
82c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
82d0: 65 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41  e SQLITE_INTERNA
82e0: 4c 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  L:           zNa
82f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4e 54  me = "SQLITE_INT
8300: 45 52 4e 41 4c 22 3b 20 20 20 20 20 20 20 20 20  ERNAL";         
8310: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8320: 73 65 20 53 51 4c 49 54 45 5f 50 45 52 4d 3a 20  se SQLITE_PERM: 
8330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
8340: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 50 45  ame = "SQLITE_PE
8350: 52 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  RM";            
8360: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8370: 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54  ase SQLITE_ABORT
8380: 3a 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 41  Name = "SQLITE_A
83a0: 42 4f 52 54 22 3b 20 20 20 20 20 20 20 20 20 20  BORT";          
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 41 42 4f 52  case SQLITE_ABOR
83d0: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20 20 20 20  T_ROLLBACK:     
83e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
83f0: 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b 22 3b  ABORT_ROLLBACK";
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 42 55 53   case SQLITE_BUS
8420: 59 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:              
8430: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8440: 5f 42 55 53 59 22 3b 20 20 20 20 20 20 20 20 20  _BUSY";         
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 42 55    case SQLITE_BU
8470: 53 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 20 20  SY_RECOVERY:    
8480: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8490: 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52 59 22  E_BUSY_RECOVERY"
84a0: 3b 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 42     case SQLITE_B
84c0: 55 53 59 5f 53 4e 41 50 53 48 4f 54 3a 20 20 20  USY_SNAPSHOT:   
84d0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
84e0: 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48 4f 54  TE_BUSY_SNAPSHOT
84f0: 22 3b 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: 4c 4f 43 4b 45 44 3a 20 20 20 20 20 20 20 20 20  LOCKED:         
8520: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8530: 49 54 45 5f 4c 4f 43 4b 45 44 22 3b 20 20 20 20  ITE_LOCKED";    
8540: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8550: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8560: 5f 4c 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41  _LOCKED_SHAREDCA
8570: 43 48 45 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  CHE: zName = "SQ
8580: 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48 41 52  LITE_LOCKED_SHAR
8590: 45 44 43 41 43 48 45 22 3b 62 72 65 61 6b 3b 0a  EDCACHE";break;.
85a0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
85b0: 45 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20  E_NOMEM:        
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 4e 4f 4d 45 4d 22 3b 20 20 20  QLITE_NOMEM";   
85e0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
85f0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8600: 54 45 5f 52 45 41 44 4f 4e 4c 59 3a 20 20 20 20  TE_READONLY:    
8610: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8620: 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 22  SQLITE_READONLY"
8630: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          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 52 45 41 44 4f 4e 4c 59 5f 52 45 43  ITE_READONLY_REC
8660: 4f 56 45 52 59 3a 20 20 7a 4e 61 6d 65 20 3d 20  OVERY:  zName = 
8670: 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59  "SQLITE_READONLY
8680: 5f 52 45 43 4f 56 45 52 59 22 3b 20 62 72 65 61  _RECOVERY"; 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 52 45 41 44 4f 4e 4c 59 5f 43 41  LITE_READONLY_CA
86b0: 4e 54 4c 4f 43 4b 3a 20 20 7a 4e 61 6d 65 20 3d  NTLOCK:  zName =
86c0: 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c   "SQLITE_READONL
86d0: 59 5f 43 41 4e 54 4c 4f 43 4b 22 3b 20 62 72 65  Y_CANTLOCK"; 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 52 45 41 44 4f 4e 4c 59 5f 52  QLITE_READONLY_R
8700: 4f 4c 4c 42 41 43 4b 3a 20 20 7a 4e 61 6d 65 20  OLLBACK:  zName 
8710: 3d 20 22 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  = "SQLITE_READON
8720: 4c 59 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72  LY_ROLLBACK"; 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 49 4e 54 45 52 52 55 50 54  SQLITE_INTERRUPT
8750: 3a 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 49 4e 54 45 52   = "SQLITE_INTER
8770: 52 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 62  RUPT";         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 49 4f 45 52 52 3a 20 20   SQLITE_IOERR:  
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
87b0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
87c0: 52 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  R";             
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 49 4f 45 52 52 5f 52  e SQLITE_IOERR_R
87f0: 45 41 44 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  EAD:         zNa
8800: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8810: 52 52 5f 52 45 41 44 22 3b 20 20 20 20 20 20 20  RR_READ";       
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 49 4f 45 52 52 5f  se SQLITE_IOERR_
8840: 53 48 4f 52 54 5f 52 45 41 44 3a 20 20 20 7a 4e  SHORT_READ:   zN
8850: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8860: 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 22 3b  ERR_SHORT_READ";
8870: 20 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 49 4f 45 52 52  ase SQLITE_IOERR
8890: 5f 57 52 49 54 45 3a 20 20 20 20 20 20 20 20 7a  _WRITE:        z
88a0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
88b0: 4f 45 52 52 5f 57 52 49 54 45 22 3b 20 20 20 20  OERR_WRITE";    
88c0: 20 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 4f 45 52  case SQLITE_IOER
88e0: 52 5f 46 53 59 4e 43 3a 20 20 20 20 20 20 20 20  R_FSYNC:        
88f0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8900: 49 4f 45 52 52 5f 46 53 59 4e 43 22 3b 20 20 20  IOERR_FSYNC";   
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 5f 44 49 52 5f 46 53 59 4e 43 3a 20 20 20  RR_DIR_FSYNC:   
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 5f 44 49 52 5f 46 53 59 4e 43  _IOERR_DIR_FSYNC
8960: 22 3b 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 54 52 55 4e 43 41 54 45 3a 20 20 20  ERR_TRUNCATE:   
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 54 52 55 4e 43 41 54 45  E_IOERR_TRUNCATE
89b0: 22 3b 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 46 53 54 41 54 3a 20 20 20 20 20  OERR_FSTAT:     
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 46 53 54 41 54 22 3b  TE_IOERR_FSTAT";
8a00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         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 55 4e 4c 4f 43 4b 3a 20 20 20  IOERR_UNLOCK:   
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 55 4e 4c 4f 43 4b  ITE_IOERR_UNLOCK
8a50: 22 3b 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 52 44 4c 4f 43 4b 3a 20 20  _IOERR_RDLOCK:  
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 52 44 4c 4f 43  LITE_IOERR_RDLOC
8aa0: 4b 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  K";      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 45 4c 45 54 45 3a 20  E_IOERR_DELETE: 
8ad0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8ae0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45  QLITE_IOERR_DELE
8af0: 54 45 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  TE";      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 42 4c 4f 43 4b 45 44  TE_IOERR_BLOCKED
8b20: 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  :      zName = "
8b30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
8b40: 43 4b 45 44 22 3b 20 20 20 20 20 62 72 65 61 6b  CKED";     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 4e 4f 4d 45 4d 3a  ITE_IOERR_NOMEM:
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 4e 4f  "SQLITE_IOERR_NO
8b90: 4d 45 4d 22 3b 20 20 20 20 20 20 20 62 72 65 61  MEM";       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 41 43 43 45 53  LITE_IOERR_ACCES
8bc0: 53 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  S:       zName =
8bd0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 41   "SQLITE_IOERR_A
8be0: 43 43 45 53 53 22 3b 20 20 20 20 20 20 62 72 65  CCESS";      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 43 48 45 43  QLITE_IOERR_CHEC
8c10: 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b 3a 0a 20  KRESERVEDLOCK:. 
8c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
8c40: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8c50: 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52 56  OERR_CHECKRESERV
8c60: 45 44 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a  EDLOCK"; break;.
8c70: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8c80: 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b 3a 20 20 20  E_IOERR_LOCK:   
8c90: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8ca0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f 43 4b  QLITE_IOERR_LOCK
8cb0: 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ";        break;
8cc0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8cd0: 54 45 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 3a 20  TE_IOERR_CLOSE: 
8ce0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8cf0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4c 4f  SQLITE_IOERR_CLO
8d00: 53 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  SE";       break
8d10: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8d20: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c  ITE_IOERR_DIR_CL
8d30: 4f 53 45 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  OSE:    zName = 
8d40: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  "SQLITE_IOERR_DI
8d50: 52 5f 43 4c 4f 53 45 22 3b 20 20 20 62 72 65 61  R_CLOSE";   brea
8d60: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8d70: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50  LITE_IOERR_SHMOP
8d80: 45 4e 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  EN:      zName =
8d90: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
8da0: 48 4d 4f 50 45 4e 22 3b 20 20 20 20 20 62 72 65  HMOPEN";     bre
8db0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8dc0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53  QLITE_IOERR_SHMS
8dd0: 49 5a 45 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20  IZE:      zName 
8de0: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8df0: 53 48 4d 53 49 5a 45 22 3b 20 20 20 20 20 62 72  SHMSIZE";     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 53 48 4d  SQLITE_IOERR_SHM
8e20: 4c 4f 43 4b 3a 20 20 20 20 20 20 7a 4e 61 6d 65  LOCK:      zName
8e30: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8e40: 5f 53 48 4d 4c 4f 43 4b 22 3b 20 20 20 20 20 62  _SHMLOCK";     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 53 48   SQLITE_IOERR_SH
8e70: 4d 4d 41 50 3a 20 20 20 20 20 20 20 7a 4e 61 6d  MMAP:       zNam
8e80: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8e90: 52 5f 53 48 4d 4d 41 50 22 3b 20 20 20 20 20 20  R_SHMMAP";      
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 53  e SQLITE_IOERR_S
8ec0: 45 45 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  EEK:         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 53 45 45 4b 22 3b 20 20 20 20 20 20 20  RR_SEEK";       
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: 44 45 4c 45 54 45 5f 4e 4f 45 4e 54 3a 20 7a 4e  DELETE_NOENT: 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 44 45 4c 45 54 45 5f 4e 4f 45 4e 54  ERR_DELETE_NOENT
8f40: 22 3b 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 4d 4d 41 50 3a 20 20 20 20 20 20 20 20 20 7a  _MMAP:         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 4d 4d 41 50 22 3b 20 20 20 20 20  OERR_MMAP";     
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 47 45 54 54 45 4d 50 50 41 54 48 3a 20 20  R_GETTEMPPATH:  
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 47 45 54 54 45 4d 50 50 41 54  IOERR_GETTEMPPAT
8fe0: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  H"; break;.     
8ff0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 52   case SQLITE_COR
9000: 52 55 50 54 3a 20 20 20 20 20 20 20 20 20 20 20  RUPT:           
9010: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9020: 5f 43 4f 52 52 55 50 54 22 3b 20 20 20 20 20 20  _CORRUPT";      
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 43 4f    case SQLITE_CO
9050: 52 52 55 50 54 5f 56 54 41 42 3a 20 20 20 20 20  RRUPT_VTAB:     
9060: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9070: 45 5f 43 4f 52 52 55 50 54 5f 56 54 41 42 22 3b  E_CORRUPT_VTAB";
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 4e     case SQLITE_N
90a0: 4f 54 46 4f 55 4e 44 3a 20 20 20 20 20 20 20 20  OTFOUND:        
90b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
90c0: 54 45 5f 4e 4f 54 46 4f 55 4e 44 22 3b 20 20 20  TE_NOTFOUND";   
90d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
90e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
90f0: 46 55 4c 4c 3a 20 20 20 20 20 20 20 20 20 20 20  FULL:           
9100: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9110: 49 54 45 5f 46 55 4c 4c 22 3b 20 20 20 20 20 20  ITE_FULL";      
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 43 41 4e 54 4f 50 45 4e 3a 20 20 20 20 20 20  _CANTOPEN:      
9150: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9160: 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 22 3b 20  LITE_CANTOPEN"; 
9170: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9180: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9190: 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d  E_CANTOPEN_NOTEM
91a0: 50 44 49 52 3a 20 7a 4e 61 6d 65 20 3d 20 22 53  PDIR: zName = "S
91b0: 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 4e  QLITE_CANTOPEN_N
91c0: 4f 54 45 4d 50 44 49 52 22 3b 62 72 65 61 6b 3b  OTEMPDIR";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 41 4e 54 4f 50 45 4e 5f 49 53 44 49  TE_CANTOPEN_ISDI
91f0: 52 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  R:     zName = "
9200: 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f  SQLITE_CANTOPEN_
9210: 49 53 44 49 52 22 3b 20 20 20 20 62 72 65 61 6b  ISDIR";    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 41 4e 54 4f 50 45 4e 5f 46 55 4c  ITE_CANTOPEN_FUL
9240: 4c 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20  LPATH:  zName = 
9250: 22 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  "SQLITE_CANTOPEN
9260: 5f 46 55 4c 4c 50 41 54 48 22 3b 20 62 72 65 61  _FULLPATH"; 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 50 52 4f 54 4f 43 4f 4c 3a 20 20  LITE_PROTOCOL:  
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 50 52 4f 54 4f 43 4f   "SQLITE_PROTOCO
92b0: 4c 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  L";          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 45 4d 50 54 59 3a 20 20 20 20  QLITE_EMPTY:    
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 45 4d 50 54 59 22  = "SQLITE_EMPTY"
9300: 3b 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 53 43 48 45 4d 41 3a 20 20  SQLITE_SCHEMA:  
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 53 43 48 45 4d   = "SQLITE_SCHEM
9350: 41 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62  A";            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 54 4f 4f 42 49 47 3a 20   SQLITE_TOOBIG: 
9380: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9390: 65 20 3d 20 22 53 51 4c 49 54 45 5f 54 4f 4f 42  e = "SQLITE_TOOB
93a0: 49 47 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  IG";            
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 4f 4e 53 54 52 41  e SQLITE_CONSTRA
93d0: 49 4e 54 3a 20 20 20 20 20 20 20 20 20 7a 4e 61  INT:         zNa
93e0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
93f0: 53 54 52 41 49 4e 54 22 3b 20 20 20 20 20 20 20  STRAINT";       
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 4f 4e 53 54 52  se SQLITE_CONSTR
9420: 41 49 4e 54 5f 55 4e 49 51 55 45 3a 20 20 7a 4e  AINT_UNIQUE:  zN
9430: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
9440: 4e 53 54 52 41 49 4e 54 5f 55 4e 49 51 55 45 22  NSTRAINT_UNIQUE"
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 4f 4e 53 54  ase SQLITE_CONST
9470: 52 41 49 4e 54 5f 54 52 49 47 47 45 52 3a 20 7a  RAINT_TRIGGER: z
9480: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9490: 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49 47 47 45  ONSTRAINT_TRIGGE
94a0: 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  R";break;.      
94b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
94c0: 54 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45  TRAINT_FOREIGNKE
94d0: 59 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  Y:.             
94e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
94f0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9500: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 4f  TE_CONSTRAINT_FO
9510: 52 45 49 47 4e 4b 45 59 22 3b 20 20 20 62 72 65  REIGNKEY";   bre
9520: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9530: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9540: 5f 43 48 45 43 4b 3a 20 20 20 7a 4e 61 6d 65 20  _CHECK:   zName 
9550: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
9560: 41 49 4e 54 5f 43 48 45 43 4b 22 3b 20 20 62 72  AINT_CHECK";  br
9570: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9580: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9590: 54 5f 50 52 49 4d 41 52 59 4b 45 59 3a 0a 20 20  T_PRIMARYKEY:.  
95a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
95c0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
95d0: 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52 59  NSTRAINT_PRIMARY
95e0: 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20  KEY";   break;. 
95f0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9600: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e  _CONSTRAINT_NOTN
9610: 55 4c 4c 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51  ULL: zName = "SQ
9620: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9630: 4e 4f 54 4e 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a  NOTNULL";break;.
9640: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9650: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d  E_CONSTRAINT_COM
9660: 4d 49 54 48 4f 4f 4b 3a 0a 20 20 20 20 20 20 20  MITHOOK:.       
9670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9680: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9690: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
96a0: 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b  INT_COMMITHOOK";
96b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
96c0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53  case SQLITE_CONS
96d0: 54 52 41 49 4e 54 5f 56 54 41 42 3a 20 20 20 20  TRAINT_VTAB:    
96e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
96f0: 43 4f 4e 53 54 52 41 49 4e 54 5f 56 54 41 42 22  CONSTRAINT_VTAB"
9700: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
9710: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
9720: 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e  STRAINT_FUNCTION
9730: 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :.              
9740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9750: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9760: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46 55 4e  E_CONSTRAINT_FUN
9770: 43 54 49 4f 4e 22 3b 20 20 20 20 20 62 72 65 61  CTION";     brea
9780: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9790: 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20  LITE_MISMATCH:  
97a0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
97b0: 20 22 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43   "SQLITE_MISMATC
97c0: 48 22 3b 20 20 20 20 20 20 20 20 20 20 62 72 65  H";          bre
97d0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
97e0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 3a 20 20 20  QLITE_MISUSE:   
97f0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9800: 3d 20 22 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  = "SQLITE_MISUSE
9810: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
9820: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9830: 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20  SQLITE_NOLFS:   
9840: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9850: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   = "SQLITE_NOLFS
9860: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
9870: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9880: 20 53 51 4c 49 54 45 5f 41 55 54 48 3a 20 20 20   SQLITE_AUTH:   
9890: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
98a0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 41 55 54 48  e = "SQLITE_AUTH
98b0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
98c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
98d0: 65 20 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a  e SQLITE_FORMAT:
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
98f0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52  me = "SQLITE_FOR
9900: 4d 41 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  MAT";           
9910: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9920: 73 65 20 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a  se SQLITE_RANGE:
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
9940: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 41  ame = "SQLITE_RA
9950: 4e 47 45 22 3b 20 20 20 20 20 20 20 20 20 20 20  NGE";           
9960: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9970: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44  ase SQLITE_NOTAD
9980: 42 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  B:             z
9990: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
99a0: 4f 54 41 44 42 22 3b 20 20 20 20 20 20 20 20 20  OTADB";         
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 52 4f 57 3a  case SQLITE_ROW:
99d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99e0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
99f0: 52 4f 57 22 3b 20 20 20 20 20 20 20 20 20 20 20  ROW";           
9a00: 20 20 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 4e 4f 54   case SQLITE_NOT
9a20: 49 43 45 3a 20 20 20 20 20 20 20 20 20 20 20 20  ICE:            
9a30: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9a40: 5f 4e 4f 54 49 43 45 22 3b 20 20 20 20 20 20 20  _NOTICE";       
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 4e 4f    case SQLITE_NO
9a70: 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c  TICE_RECOVER_WAL
9a80: 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54  : zName = "SQLIT
9a90: 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52  E_NOTICE_RECOVER
9aa0: 5f 57 41 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20  _WAL";break;.   
9ab0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4e     case SQLITE_N
9ac0: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f  OTICE_RECOVER_RO
9ad0: 4c 4c 42 41 43 4b 3a 0a 20 20 20 20 20 20 20 20  LLBACK:.        
9ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9af0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9b00: 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52  "SQLITE_NOTICE_R
9b10: 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22  ECOVER_ROLLBACK"
9b20: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
9b30: 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49  ase SQLITE_WARNI
9b40: 4e 47 3a 20 20 20 20 20 20 20 20 20 20 20 20 7a  NG:            z
9b50: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57  Name = "SQLITE_W
9b60: 41 52 4e 49 4e 47 22 3b 20 20 20 20 20 20 20 20  ARNING";        
9b70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9b80: 63 61 73 65 20 53 51 4c 49 54 45 5f 57 41 52 4e  case SQLITE_WARN
9b90: 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20  ING_AUTOINDEX:  
9ba0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9bb0: 57 41 52 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45  WARNING_AUTOINDE
9bc0: 58 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  X"; break;.     
9bd0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e   case SQLITE_DON
9be0: 45 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E:              
9bf0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9c00: 5f 44 4f 4e 45 22 3b 20 20 20 20 20 20 20 20 20  _DONE";         
9c10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9c20: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d  }.  }.  if( zNam
9c30: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  e==0 ){.    stat
9c40: 69 63 20 63 68 61 72 20 7a 42 75 66 5b 35 30 5d  ic char zBuf[50]
9c50: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  ;.    sqlite3_sn
9c60: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42  printf(sizeof(zB
9c70: 75 66 29 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49  uf), zBuf, "SQLI
9c80: 54 45 5f 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c  TE_UNKNOWN(%d)",
9c90: 20 6f 72 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e   origRc);.    zN
9ca0: 61 6d 65 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a  ame = zBuf;.  }.
9cb0: 20 20 72 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a    return zName;.
9cc0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
9cd0: 52 65 74 75 72 6e 20 61 20 73 74 61 74 69 63 20  Return a static 
9ce0: 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
9cf0: 72 69 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f  ribes the kind o
9d00: 66 20 65 72 72 6f 72 20 73 70 65 63 69 66 69 65  f error specifie
9d10: 64 20 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75  d in the.** argu
9d20: 6d 65 6e 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  ment..*/.const c
9d30: 68 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 53  har *sqlite3ErrS
9d40: 74 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 73 74  tr(int rc){.  st
9d50: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 2a  atic const char*
9d60: 20 63 6f 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20   const aMsg[] = 
9d70: 7b 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  {.    /* SQLITE_
9d80: 4f 4b 20 20 20 20 20 20 20 20 20 20 2a 2f 20 22  OK          */ "
9d90: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20  not an error",. 
9da0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52     /* SQLITE_ERR
9db0: 4f 52 20 20 20 20 20 20 20 2a 2f 20 22 53 51 4c  OR       */ "SQL
9dc0: 20 6c 6f 67 69 63 20 65 72 72 6f 72 20 6f 72 20   logic error or 
9dd0: 6d 69 73 73 69 6e 67 20 64 61 74 61 62 61 73 65  missing database
9de0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
9df0: 5f 49 4e 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20  _INTERNAL    */ 
9e00: 30 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  0,.    /* SQLITE
9e10: 5f 50 45 52 4d 20 20 20 20 20 20 20 20 2a 2f 20  _PERM        */ 
9e20: 22 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69  "access permissi
9e30: 6f 6e 20 64 65 6e 69 65 64 22 2c 0a 20 20 20 20  on denied",.    
9e40: 2f 2a 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 20  /* SQLITE_ABORT 
9e50: 20 20 20 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61        */ "callba
9e60: 63 6b 20 72 65 71 75 65 73 74 65 64 20 71 75 65  ck requested que
9e70: 72 79 20 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f  ry abort",.    /
9e80: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 20 20  * SQLITE_BUSY   
9e90: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
9ea0: 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20  e is locked",.  
9eb0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b    /* SQLITE_LOCK
9ec0: 45 44 20 20 20 20 20 20 2a 2f 20 22 64 61 74 61  ED      */ "data
9ed0: 62 61 73 65 20 74 61 62 6c 65 20 69 73 20 6c 6f  base table is lo
9ee0: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
9ef0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20  LITE_NOMEM      
9f00: 20 2a 2f 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f   */ "out of memo
9f10: 72 79 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ry",.    /* SQLI
9f20: 54 45 5f 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a  TE_READONLY    *
9f30: 2f 20 22 61 74 74 65 6d 70 74 20 74 6f 20 77 72  / "attempt to wr
9f40: 69 74 65 20 61 20 72 65 61 64 6f 6e 6c 79 20 64  ite a readonly d
9f50: 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a  atabase",.    /*
9f60: 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50   SQLITE_INTERRUP
9f70: 54 20 20 20 2a 2f 20 22 69 6e 74 65 72 72 75 70  T   */ "interrup
9f80: 74 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ted",.    /* SQL
9f90: 49 54 45 5f 49 4f 45 52 52 20 20 20 20 20 20 20  ITE_IOERR       
9fa0: 2a 2f 20 22 64 69 73 6b 20 49 2f 4f 20 65 72 72  */ "disk I/O err
9fb0: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
9fc0: 54 45 5f 43 4f 52 52 55 50 54 20 20 20 20 20 2a  TE_CORRUPT     *
9fd0: 2f 20 22 64 61 74 61 62 61 73 65 20 64 69 73 6b  / "database disk
9fe0: 20 69 6d 61 67 65 20 69 73 20 6d 61 6c 66 6f 72   image is malfor
9ff0: 6d 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  med",.    /* SQL
a000: 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20  ITE_NOTFOUND    
a010: 2a 2f 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72  */ "unknown oper
a020: 61 74 69 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53  ation",.    /* S
a030: 51 4c 49 54 45 5f 46 55 4c 4c 20 20 20 20 20 20  QLITE_FULL      
a040: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 6f    */ "database o
a050: 72 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c  r disk is full",
a060: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43  .    /* SQLITE_C
a070: 41 4e 54 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75  ANTOPEN    */ "u
a080: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61  nable to open da
a090: 74 61 62 61 73 65 20 66 69 6c 65 22 2c 0a 20 20  tabase file",.  
a0a0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54    /* SQLITE_PROT
a0b0: 4f 43 4f 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b  OCOL    */ "lock
a0c0: 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20  ing protocol",. 
a0d0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50     /* SQLITE_EMP
a0e0: 54 59 20 20 20 20 20 20 20 2a 2f 20 22 74 61 62  TY       */ "tab
a0f0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64  le contains no d
a100: 61 74 61 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  ata",.    /* SQL
a110: 49 54 45 5f 53 43 48 45 4d 41 20 20 20 20 20 20  ITE_SCHEMA      
a120: 2a 2f 20 22 64 61 74 61 62 61 73 65 20 73 63 68  */ "database sch
a130: 65 6d 61 20 68 61 73 20 63 68 61 6e 67 65 64 22  ema has changed"
a140: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a150: 54 4f 4f 42 49 47 20 20 20 20 20 20 2a 2f 20 22  TOOBIG      */ "
a160: 73 74 72 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74  string or blob t
a170: 6f 6f 20 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20  oo big",.    /* 
a180: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
a190: 54 20 20 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e  T  */ "constrain
a1a0: 74 20 66 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f  t failed",.    /
a1b0: 2a 20 53 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43  * SQLITE_MISMATC
a1c0: 48 20 20 20 20 2a 2f 20 22 64 61 74 61 74 79 70  H    */ "datatyp
a1d0: 65 20 6d 69 73 6d 61 74 63 68 22 2c 0a 20 20 20  e mismatch",.   
a1e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53   /* SQLITE_MISUS
a1f0: 45 20 20 20 20 20 20 2a 2f 20 22 6c 69 62 72 61  E      */ "libra
a200: 72 79 20 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65  ry routine calle
a210: 64 20 6f 75 74 20 6f 66 20 73 65 71 75 65 6e 63  d out of sequenc
a220: 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  e",.    /* SQLIT
a230: 45 5f 4e 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f  E_NOLFS       */
a240: 20 22 6c 61 72 67 65 20 66 69 6c 65 20 73 75 70   "large file sup
a250: 70 6f 72 74 20 69 73 20 64 69 73 61 62 6c 65 64  port is disabled
a260: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a270: 5f 41 55 54 48 20 20 20 20 20 20 20 20 2a 2f 20  _AUTH        */ 
a280: 22 61 75 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64  "authorization d
a290: 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  enied",.    /* S
a2a0: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 20 20 20 20  QLITE_FORMAT    
a2b0: 20 20 2a 2f 20 22 61 75 78 69 6c 69 61 72 79 20    */ "auxiliary 
a2c0: 64 61 74 61 62 61 73 65 20 66 6f 72 6d 61 74 20  database format 
a2d0: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
a2e0: 51 4c 49 54 45 5f 52 41 4e 47 45 20 20 20 20 20  QLITE_RANGE     
a2f0: 20 20 2a 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f    */ "bind or co
a300: 6c 75 6d 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f  lumn index out o
a310: 66 20 72 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a  f range",.    /*
a320: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20   SQLITE_NOTADB  
a330: 20 20 20 20 2a 2f 20 22 66 69 6c 65 20 69 73 20      */ "file is 
a340: 65 6e 63 72 79 70 74 65 64 20 6f 72 20 69 73 20  encrypted or is 
a350: 6e 6f 74 20 61 20 64 61 74 61 62 61 73 65 22 2c  not a database",
a360: 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68  .  };.  const ch
a370: 61 72 20 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e  ar *zErr = "unkn
a380: 6f 77 6e 20 65 72 72 6f 72 22 3b 0a 20 20 73 77  own error";.  sw
a390: 69 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20  itch( rc ){.    
a3a0: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 42 4f 52  case SQLITE_ABOR
a3b0: 54 5f 52 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20  T_ROLLBACK: {.  
a3c0: 20 20 20 20 7a 45 72 72 20 3d 20 22 61 62 6f 72      zErr = "abor
a3d0: 74 20 64 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43  t due to ROLLBAC
a3e0: 4b 22 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  K";.      break;
a3f0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
a400: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 26  lt: {.      rc &
a410: 3d 20 30 78 66 66 3b 0a 20 20 20 20 20 20 69 66  = 0xff;.      if
a420: 28 20 41 4c 57 41 59 53 28 72 63 3e 3d 30 29 20  ( ALWAYS(rc>=0) 
a430: 26 26 20 72 63 3c 41 72 72 61 79 53 69 7a 65 28  && rc<ArraySize(
a440: 61 4d 73 67 29 20 26 26 20 61 4d 73 67 5b 72 63  aMsg) && aMsg[rc
a450: 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ]!=0 ){.        
a460: 7a 45 72 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b  zErr = aMsg[rc];
a470: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
a480: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
a490: 20 20 72 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d    return zErr;.}
a4a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
a4b0: 74 69 6e 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20  tine implements 
a4c0: 61 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  a busy callback 
a4d0: 74 68 61 74 20 73 6c 65 65 70 73 20 61 6e 64 20  that sleeps and 
a4e0: 74 72 69 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75  tries.** again u
a4f0: 6e 74 69 6c 20 61 20 74 69 6d 65 6f 75 74 20 76  ntil a timeout v
a500: 61 6c 75 65 20 69 73 20 72 65 61 63 68 65 64 2e  alue is reached.
a510: 20 20 54 68 65 20 74 69 6d 65 6f 75 74 20 76 61    The timeout va
a520: 6c 75 65 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74  lue is.** an int
a530: 65 67 65 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d  eger number of m
a540: 69 6c 6c 69 73 65 63 6f 6e 64 73 20 70 61 73 73  illiseconds pass
a550: 65 64 20 69 6e 20 61 73 20 74 68 65 20 66 69 72  ed in as the fir
a560: 73 74 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a  st.** argument..
a570: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71  */.static int sq
a580: 6c 69 74 65 44 65 66 61 75 6c 74 42 75 73 79 43  liteDefaultBusyC
a590: 61 6c 6c 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a  allback(. void *
a5a0: 70 74 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ptr,            
a5b0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
a5c0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e  onnection */. in
a5d0: 74 20 63 6f 75 6e 74 20 20 20 20 20 20 20 20 20  t count         
a5e0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
a5f0: 20 6f 66 20 74 69 6d 65 73 20 74 61 62 6c 65 20   of times table 
a600: 68 61 73 20 62 65 65 6e 20 62 75 73 79 20 2a 2f  has been busy */
a610: 0a 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f  .){.#if SQLITE_O
a620: 53 5f 57 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65  S_WIN || (define
a630: 64 28 48 41 56 45 5f 55 53 4c 45 45 50 29 20 26  d(HAVE_USLEEP) &
a640: 26 20 48 41 56 45 5f 55 53 4c 45 45 50 29 0a 20  & HAVE_USLEEP). 
a650: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
a660: 20 64 65 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20   delays[] =.    
a670: 20 7b 20 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20   { 1, 2, 5, 10, 
a680: 31 35 2c 20 32 30 2c 20 32 35 2c 20 32 35 2c 20  15, 20, 25, 25, 
a690: 20 32 35 2c 20 20 35 30 2c 20 20 35 30 2c 20 31   25,  50,  50, 1
a6a0: 30 30 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63  00 };.  static c
a6b0: 6f 6e 73 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d  onst u8 totals[]
a6c0: 20 3d 0a 20 20 20 20 20 7b 20 30 2c 20 31 2c 20   =.     { 0, 1, 
a6d0: 33 2c 20 20 38 2c 20 31 38 2c 20 33 33 2c 20 35  3,  8, 18, 33, 5
a6e0: 33 2c 20 37 38 2c 20 31 30 33 2c 20 31 32 38 2c  3, 78, 103, 128,
a6f0: 20 31 37 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64   178, 228 };.# d
a700: 65 66 69 6e 65 20 4e 44 45 4c 41 59 20 41 72 72  efine NDELAY Arr
a710: 61 79 53 69 7a 65 28 64 65 6c 61 79 73 29 0a 20  aySize(delays). 
a720: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
a730: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
a740: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 64   int timeout = d
a750: 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a  b->busyTimeout;.
a760: 20 20 69 6e 74 20 64 65 6c 61 79 2c 20 70 72 69    int delay, pri
a770: 6f 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 63  or;..  assert( c
a780: 6f 75 6e 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28  ount>=0 );.  if(
a790: 20 63 6f 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20   count < NDELAY 
a7a0: 29 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64  ){.    delay = d
a7b0: 65 6c 61 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20  elays[count];.  
a7c0: 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73    prior = totals
a7d0: 5b 63 6f 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65  [count];.  }else
a7e0: 7b 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65  {.    delay = de
a7f0: 6c 61 79 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a  lays[NDELAY-1];.
a800: 20 20 20 20 70 72 69 6f 72 20 3d 20 74 6f 74 61      prior = tota
a810: 6c 73 5b 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64  ls[NDELAY-1] + d
a820: 65 6c 61 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45  elay*(count-(NDE
a830: 4c 41 59 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69  LAY-1));.  }.  i
a840: 66 28 20 70 72 69 6f 72 20 2b 20 64 65 6c 61 79  f( prior + delay
a850: 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20   > timeout ){.  
a860: 20 20 64 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75    delay = timeou
a870: 74 20 2d 20 70 72 69 6f 72 3b 0a 20 20 20 20 69  t - prior;.    i
a880: 66 28 20 64 65 6c 61 79 3c 3d 30 20 29 20 72 65  f( delay<=0 ) re
a890: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71  turn 0;.  }.  sq
a8a0: 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 64 62 2d  lite3OsSleep(db-
a8b0: 3e 70 56 66 73 2c 20 64 65 6c 61 79 2a 31 30 30  >pVfs, delay*100
a8c0: 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  0);.  return 1;.
a8d0: 23 65 6c 73 65 0a 20 20 73 71 6c 69 74 65 33 20  #else.  sqlite3 
a8e0: 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33 20 2a  *db = (sqlite3 *
a8f0: 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65  )ptr;.  int time
a900: 6f 75 74 20 3d 20 28 28 73 71 6c 69 74 65 33 20  out = ((sqlite3 
a910: 2a 29 70 74 72 29 2d 3e 62 75 73 79 54 69 6d 65  *)ptr)->busyTime
a920: 6f 75 74 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e  out;.  if( (coun
a930: 74 2b 31 29 2a 31 30 30 30 20 3e 20 74 69 6d 65  t+1)*1000 > time
a940: 6f 75 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72  out ){.    retur
a950: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
a960: 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56  e3OsSleep(db->pV
a970: 66 73 2c 20 31 30 30 30 30 30 30 29 3b 0a 20 20  fs, 1000000);.  
a980: 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66  return 1;.#endif
a990: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65  .}../*.** Invoke
a9a0: 20 74 68 65 20 67 69 76 65 6e 20 62 75 73 79 20   the given busy 
a9b0: 68 61 6e 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54  handler..**.** T
a9c0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
a9d0: 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20 6f 70  alled when an op
a9e0: 65 72 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 77  eration failed w
a9f0: 69 74 68 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49  ith a lock..** I
aa00: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  f this routine r
aa10: 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  eturns non-zero,
aa20: 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 74   the lock is ret
aa30: 72 69 65 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20  ried.  If it.** 
aa40: 72 65 74 75 72 6e 73 20 30 2c 20 74 68 65 20 6f  returns 0, the o
aa50: 70 65 72 61 74 69 6f 6e 20 61 62 6f 72 74 73 20  peration aborts 
aa60: 77 69 74 68 20 61 6e 20 53 51 4c 49 54 45 5f 42  with an SQLITE_B
aa70: 55 53 59 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e  USY error..*/.in
aa80: 74 20 73 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42  t sqlite3InvokeB
aa90: 75 73 79 48 61 6e 64 6c 65 72 28 42 75 73 79 48  usyHandler(BusyH
aaa0: 61 6e 64 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e  andler *p){.  in
aab0: 74 20 72 63 3b 0a 20 20 69 66 28 20 4e 45 56 45  t rc;.  if( NEVE
aac0: 52 28 70 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46  R(p==0) || p->xF
aad0: 75 6e 63 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75  unc==0 || p->nBu
aae0: 73 79 3c 30 20 29 20 72 65 74 75 72 6e 20 30 3b  sy<0 ) return 0;
aaf0: 0a 20 20 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63  .  rc = p->xFunc
ab00: 28 70 2d 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75  (p->pArg, p->nBu
ab10: 73 79 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30  sy);.  if( rc==0
ab20: 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79   ){.    p->nBusy
ab30: 20 3d 20 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = -1;.  }else{.
ab40: 20 20 20 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a      p->nBusy++;.
ab50: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
ab60: 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20   .}../*.** This 
ab70: 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68 65  routine sets the
ab80: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 66   busy callback f
ab90: 6f 72 20 61 6e 20 53 71 6c 69 74 65 20 64 61 74  or an Sqlite dat
aba0: 61 62 61 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20  abase to the.** 
abb0: 67 69 76 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66  given callback f
abc0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
abd0: 20 67 69 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e   given argument.
abe0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
abf0: 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20  busy_handler(.  
ac00: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 69  sqlite3 *db,.  i
ac10: 6e 74 20 28 2a 78 42 75 73 79 29 28 76 6f 69 64  nt (*xBusy)(void
ac20: 2a 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a  *,int),.  void *
ac30: 70 41 72 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65  pArg.){.  sqlite
ac40: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
ac50: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
ac60: 62 75 73 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e  busyHandler.xFun
ac70: 63 20 3d 20 78 42 75 73 79 3b 0a 20 20 64 62 2d  c = xBusy;.  db-
ac80: 3e 62 75 73 79 48 61 6e 64 6c 65 72 2e 70 41 72  >busyHandler.pAr
ac90: 67 20 3d 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e  g = pArg;.  db->
aca0: 62 75 73 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73  busyHandler.nBus
acb0: 79 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73  y = 0;.  db->bus
acc0: 79 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20  yTimeout = 0;.  
acd0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
ace0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
acf0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ad00: 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  OK;.}..#ifndef S
ad10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52  QLITE_OMIT_PROGR
ad20: 45 53 53 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a  ESS_CALLBACK./*.
ad30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
ad40: 73 65 74 73 20 74 68 65 20 70 72 6f 67 72 65 73  sets the progres
ad50: 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61  s callback for a
ad60: 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61 73  n Sqlite databas
ad70: 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65  e to the.** give
ad80: 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  n callback funct
ad90: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69 76  ion with the giv
ada0: 65 6e 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  en argument. The
adb0: 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62 61   progress callba
adc0: 63 6b 20 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e  ck will.** be in
add0: 76 6f 6b 65 64 20 65 76 65 72 79 20 6e 4f 70 73  voked every nOps
ade0: 20 6f 70 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69   opcodes..*/.voi
adf0: 64 20 73 71 6c 69 74 65 33 5f 70 72 6f 67 72 65  d sqlite3_progre
ae00: 73 73 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71  ss_handler(.  sq
ae10: 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e  lite3 *db, .  in
ae20: 74 20 6e 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a  t nOps,.  int (*
ae30: 78 50 72 6f 67 72 65 73 73 29 28 76 6f 69 64 2a  xProgress)(void*
ae40: 29 2c 20 0a 20 20 76 6f 69 64 20 2a 70 41 72 67  ), .  void *pArg
ae50: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  .){.  sqlite3_mu
ae60: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
ae70: 74 65 78 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73  tex);.  if( nOps
ae80: 3e 30 20 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50  >0 ){.    db->xP
ae90: 72 6f 67 72 65 73 73 20 3d 20 78 50 72 6f 67 72  rogress = xProgr
aea0: 65 73 73 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72  ess;.    db->nPr
aeb0: 6f 67 72 65 73 73 4f 70 73 20 3d 20 28 75 6e 73  ogressOps = (uns
aec0: 69 67 6e 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20  igned)nOps;.    
aed0: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
aee0: 20 3d 20 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65   = pArg;.  }else
aef0: 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67 72  {.    db->xProgr
af00: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d  ess = 0;.    db-
af10: 3e 6e 50 72 6f 67 72 65 73 73 4f 70 73 20 3d 20  >nProgressOps = 
af20: 30 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72 6f 67  0;.    db->pProg
af30: 72 65 73 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d  ressArg = 0;.  }
af40: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
af50: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
af60: 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a  );.}.#endif.../*
af70: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
af80: 20 69 6e 73 74 61 6c 6c 73 20 61 20 64 65 66 61   installs a defa
af90: 75 6c 74 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ult busy handler
afa0: 20 74 68 61 74 20 77 61 69 74 73 20 66 6f 72 20   that waits for 
afb0: 74 68 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64  the.** specified
afc0: 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69   number of milli
afd0: 73 65 63 6f 6e 64 73 20 62 65 66 6f 72 65 20 72  seconds before r
afe0: 65 74 75 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69  eturning 0..*/.i
aff0: 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f  nt sqlite3_busy_
b000: 74 69 6d 65 6f 75 74 28 73 71 6c 69 74 65 33 20  timeout(sqlite3 
b010: 2a 64 62 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20  *db, int ms){.  
b020: 69 66 28 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20  if( ms>0 ){.    
b030: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
b040: 64 6c 65 72 28 64 62 2c 20 73 71 6c 69 74 65 44  dler(db, sqliteD
b050: 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61  efaultBusyCallba
b060: 63 6b 2c 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a  ck, (void*)db);.
b070: 20 20 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65      db->busyTime
b080: 6f 75 74 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73  out = ms;.  }els
b090: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  e{.    sqlite3_b
b0a0: 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20  usy_handler(db, 
b0b0: 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  0, 0);.  }.  ret
b0c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
b0d0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e  ../*.** Cause an
b0e0: 79 20 70 65 6e 64 69 6e 67 20 6f 70 65 72 61 74  y pending operat
b0f0: 69 6f 6e 20 74 6f 20 73 74 6f 70 20 61 74 20 69  ion to stop at i
b100: 74 73 20 65 61 72 6c 69 65 73 74 20 6f 70 70 6f  ts earliest oppo
b110: 72 74 75 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64  rtunity..*/.void
b120: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
b130: 70 74 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  pt(sqlite3 *db){
b140: 0a 20 20 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65  .  db->u1.isInte
b150: 72 72 75 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a  rrupted = 1;.}..
b160: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
b170: 74 69 6f 6e 20 69 73 20 65 78 61 63 74 6c 79 20  tion is exactly 
b180: 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
b190: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
b1a0: 69 6f 6e 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a  ion(), except.**
b1b0: 20 74 68 61 74 20 69 74 20 69 73 20 64 65 73 69   that it is desi
b1c0: 67 6e 65 64 20 74 6f 20 62 65 20 63 61 6c 6c 65  gned to be calle
b1d0: 64 20 62 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f  d by internal co
b1e0: 64 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e  de. The differen
b1f0: 63 65 20 69 73 0a 2a 2a 20 74 68 61 74 20 69 66  ce is.** that if
b200: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
b210: 73 20 69 6e 20 73 71 6c 69 74 65 33 5f 63 72 65  s in sqlite3_cre
b220: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
b230: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a  an error code.**
b240: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
b250: 20 74 68 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65   the mallocFaile
b260: 64 20 66 6c 61 67 20 63 6c 65 61 72 65 64 2e 20  d flag cleared. 
b270: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  .*/.int sqlite3C
b280: 72 65 61 74 65 46 75 6e 63 28 0a 20 20 73 71 6c  reateFunc(.  sql
b290: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
b2a0: 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f  t char *zFunctio
b2b0: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
b2c0: 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20  g,.  int enc,.  
b2d0: 76 6f 69 64 20 2a 70 55 73 65 72 44 61 74 61 2c  void *pUserData,
b2e0: 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63 29  .  void (*xFunc)
b2f0: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
b300: 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61  *,int,sqlite3_va
b310: 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  lue **),.  void 
b320: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
b330: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
b340: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c  lite3_value **),
b350: 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c  .  void (*xFinal
b360: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
b370: 74 2a 29 2c 0a 20 20 46 75 6e 63 44 65 73 74 72  t*),.  FuncDestr
b380: 75 63 74 6f 72 20 2a 70 44 65 73 74 72 75 63 74  uctor *pDestruct
b390: 6f 72 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  or.){.  FuncDef 
b3a0: 2a 70 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b  *p;.  int nName;
b3b0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
b3c0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
b3d0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69  b->mutex) );.  i
b3e0: 66 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  f( zFunctionName
b3f0: 3d 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46  ==0 ||.      (xF
b400: 75 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c  unc && (xFinal |
b410: 7c 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20  | xStep)) || .  
b420: 20 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28      (!xFunc && (
b430: 78 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70  xFinal && !xStep
b440: 29 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46  )) ||.      (!xF
b450: 75 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20  unc && (!xFinal 
b460: 26 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20  && xStep)) ||.  
b470: 20 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20      (nArg<-1 || 
b480: 6e 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f  nArg>SQLITE_MAX_
b490: 46 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c  FUNCTION_ARG) ||
b4a0: 0a 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61  .      (255<(nNa
b4b0: 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  me = sqlite3Strl
b4c0: 65 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e  en30( zFunctionN
b4d0: 61 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65  ame))) ){.    re
b4e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
b4f0: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 0a  SE_BKPT;.  }.  .
b500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b510: 4d 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49  MIT_UTF16.  /* I
b520: 66 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69  f SQLITE_UTF16 i
b530: 73 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74  s specified as t
b540: 68 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65  he encoding type
b550: 2c 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73  , transform this
b560: 0a 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20  .  ** to one of 
b570: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f  SQLITE_UTF16LE o
b580: 72 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  r SQLITE_UTF16BE
b590: 20 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20   using the.  ** 
b5a0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49  SQLITE_UTF16NATI
b5b0: 56 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45  VE macro. SQLITE
b5c0: 5f 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73  _UTF16 is not us
b5d0: 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ed internally.. 
b5e0: 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49   **.  ** If SQLI
b5f0: 54 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66  TE_ANY is specif
b600: 69 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76  ied, add three v
b610: 65 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66  ersions of the f
b620: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20  unction.  ** to 
b630: 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a  the hash table..
b640: 20 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d    */.  if( enc==
b650: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a  SQLITE_UTF16 ){.
b660: 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45      enc = SQLITE
b670: 5f 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20  _UTF16NATIVE;.  
b680: 7d 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53  }else if( enc==S
b690: 51 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20  QLITE_ANY ){.   
b6a0: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20   int rc;.    rc 
b6b0: 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46  = sqlite3CreateF
b6c0: 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f  unc(db, zFunctio
b6d0: 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c  nName, nArg, SQL
b6e0: 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
b6f0: 20 20 20 70 55 73 65 72 44 61 74 61 2c 20 78 46     pUserData, xF
b700: 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e  unc, xStep, xFin
b710: 61 6c 2c 20 70 44 65 73 74 72 75 63 74 6f 72 29  al, pDestructor)
b720: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
b730: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
b740: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65   rc = sqlite3Cre
b750: 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e  ateFunc(db, zFun
b760: 63 74 69 6f 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  ctionName, nArg,
b770: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 2c   SQLITE_UTF16LE,
b780: 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65 72  .          pUser
b790: 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74  Data, xFunc, xSt
b7a0: 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73  ep, xFinal, pDes
b7b0: 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d 0a  tructor);.    }.
b7c0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
b7d0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
b7e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
b7f0: 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45      enc = SQLITE
b800: 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23 65  _UTF16BE;.  }.#e
b810: 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c 49  lse.  enc = SQLI
b820: 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66 0a  TE_UTF8;.#endif.
b830: 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66    .  /* Check if
b840: 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75 6e   an existing fun
b850: 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 6f  ction is being o
b860: 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65 6c  verridden or del
b870: 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20 2a  eted. If so,.  *
b880: 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  * and there are 
b890: 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65 6e  active VMs, then
b8a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
b8b0: 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74 69  USY. If a functi
b8c0: 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67  on.  ** is being
b8d0: 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c 65   overridden/dele
b8e0: 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61 72  ted but there ar
b8f0: 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c  e no active VMs,
b900: 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a 20   allow the.  ** 
b910: 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f 6e  operation to con
b920: 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c 69  tinue but invali
b930: 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d 70  date all precomp
b940: 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73 2e  iled statements.
b950: 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c 69  .  */.  p = sqli
b960: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
b970: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
b980: 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  e, nName, nArg, 
b990: 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20 69  (u8)enc, 0);.  i
b9a0: 66 28 20 70 20 26 26 20 70 2d 3e 69 50 72 65 66  f( p && p->iPref
b9b0: 45 6e 63 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e  Enc==enc && p->n
b9c0: 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20  Arg==nArg ){.   
b9d0: 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
b9e0: 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71  tive ){.      sq
b9f0: 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
ba00: 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20 20  QLITE_BUSY, .   
ba10: 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f 20       "unable to 
ba20: 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75 73  delete/modify us
ba30: 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65 20  er-function due 
ba40: 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
ba50: 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61 73  ents");.      as
ba60: 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f  sert( !db->mallo
ba70: 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 20  cFailed );.     
ba80: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
ba90: 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  USY;.    }else{.
baa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
bab0: 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74 65  irePreparedState
bac0: 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20 7d  ments(db);.    }
bad0: 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c 69  .  }..  p = sqli
bae0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
baf0: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
bb00: 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  e, nName, nArg, 
bb10: 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20 61  (u8)enc, 1);.  a
bb20: 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e 6d  ssert(p || db->m
bb30: 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20 20  allocFailed);.  
bb40: 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72 65  if( !p ){.    re
bb50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
bb60: 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  M;.  }..  /* If 
bb70: 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f 6e  an older version
bb80: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
bb90: 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75 72   with a configur
bba0: 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69 73  ed destructor is
bbb0: 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70 6c  .  ** being repl
bbc0: 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65 20  aced invoke the 
bbd0: 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63 74  destructor funct
bbe0: 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20 66  ion here. */.  f
bbf0: 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64  unctionDestroy(d
bc00: 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70 44  b, p);..  if( pD
bc10: 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
bc20: 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52   pDestructor->nR
bc30: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 70  ef++;.  }.  p->p
bc40: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44 65  Destructor = pDe
bc50: 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e 66  structor;.  p->f
bc60: 6c 61 67 73 20 3d 20 30 3b 0a 20 20 70 2d 3e 78  lags = 0;.  p->x
bc70: 46 75 6e 63 20 3d 20 78 46 75 6e 63 3b 0a 20 20  Func = xFunc;.  
bc80: 70 2d 3e 78 53 74 65 70 20 3d 20 78 53 74 65 70  p->xStep = xStep
bc90: 3b 0a 20 20 70 2d 3e 78 46 69 6e 61 6c 69 7a 65  ;.  p->xFinalize
bca0: 20 3d 20 78 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e   = xFinal;.  p->
bcb0: 70 55 73 65 72 44 61 74 61 20 3d 20 70 55 73 65  pUserData = pUse
bcc0: 72 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 41 72 67  rData;.  p->nArg
bcd0: 20 3d 20 28 75 31 36 29 6e 41 72 67 3b 0a 20 20   = (u16)nArg;.  
bce0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
bcf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
bd00: 65 20 6e 65 77 20 75 73 65 72 20 66 75 6e 63 74  e new user funct
bd10: 69 6f 6e 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ions..*/.int sql
bd20: 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63  ite3_create_func
bd30: 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20  tion(.  sqlite3 
bd40: 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  *db,.  const cha
bd50: 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e 74 20  r *zFunc,.  int 
bd60: 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e 63 2c  nArg,.  int enc,
bd70: 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20 76 6f  .  void *p,.  vo
bd80: 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69  id (*xFunc)(sqli
bd90: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
bda0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
bdb0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74  *),.  void (*xSt
bdc0: 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  ep)(sqlite3_cont
bdd0: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
bde0: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
bdf0: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
be00: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
be10: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
be20: 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
be30: 6f 6e 5f 76 32 28 64 62 2c 20 7a 46 75 6e 63 2c  on_v2(db, zFunc,
be40: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
be50: 46 75 6e 63 2c 20 78 53 74 65 70 2c 0a 20 20 20  Func, xStep,.   
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be80: 20 78 46 69 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a   xFinal, 0);.}..
be90: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
bea0: 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 0a  te_function_v2(.
beb0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
bec0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75   const char *zFu
bed0: 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  nc,.  int nArg,.
bee0: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
bef0: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
bf00: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
bf10: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
bf20: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
bf30: 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71  void (*xStep)(sq
bf40: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
bf50: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
bf60: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
bf70: 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63  Final)(sqlite3_c
bf80: 6f 6e 74 65 78 74 2a 29 2c 0a 20 20 76 6f 69 64  ontext*),.  void
bf90: 20 28 2a 78 44 65 73 74 72 6f 79 29 28 76 6f 69   (*xDestroy)(voi
bfa0: 64 20 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  d *).){.  int rc
bfb0: 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
bfc0: 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74 6f  .  FuncDestructo
bfd0: 72 20 2a 70 41 72 67 20 3d 20 30 3b 0a 20 20 73  r *pArg = 0;.  s
bfe0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
bff0: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
c000: 20 69 66 28 20 78 44 65 73 74 72 6f 79 20 29 7b   if( xDestroy ){
c010: 0a 20 20 20 20 70 41 72 67 20 3d 20 28 46 75 6e  .    pArg = (Fun
c020: 63 44 65 73 74 72 75 63 74 6f 72 20 2a 29 73 71  cDestructor *)sq
c030: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72  lite3DbMallocZer
c040: 6f 28 64 62 2c 20 73 69 7a 65 6f 66 28 46 75 6e  o(db, sizeof(Fun
c050: 63 44 65 73 74 72 75 63 74 6f 72 29 29 3b 0a 20  cDestructor));. 
c060: 20 20 20 69 66 28 20 21 70 41 72 67 20 29 7b 0a     if( !pArg ){.
c070: 20 20 20 20 20 20 78 44 65 73 74 72 6f 79 28 70        xDestroy(p
c080: 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 75  );.      goto ou
c090: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 41 72  t;.    }.    pAr
c0a0: 67 2d 3e 78 44 65 73 74 72 6f 79 20 3d 20 78 44  g->xDestroy = xD
c0b0: 65 73 74 72 6f 79 3b 0a 20 20 20 20 70 41 72 67  estroy;.    pArg
c0c0: 2d 3e 70 55 73 65 72 44 61 74 61 20 3d 20 70 3b  ->pUserData = p;
c0d0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
c0e0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(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 20 78 46 69 6e 61 6c 2c 20 70 41 72  tep, xFinal, pAr
c120: 67 29 3b 0a 20 20 69 66 28 20 70 41 72 67 20 26  g);.  if( pArg &
c130: 26 20 70 41 72 67 2d 3e 6e 52 65 66 3d 3d 30 20  & pArg->nRef==0 
c140: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  ){.    assert( r
c150: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
c160: 20 20 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b      xDestroy(p);
c170: 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
c180: 65 65 28 64 62 2c 20 70 41 72 67 29 3b 0a 20 20  ee(db, pArg);.  
c190: 7d 0a 0a 20 6f 75 74 3a 0a 20 20 72 63 20 3d 20  }.. out:.  rc = 
c1a0: 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 64  sqlite3ApiExit(d
c1b0: 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74 65  b, rc);.  sqlite
c1c0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
c1d0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
c1e0: 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65  rn rc;.}..#ifnde
c1f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  f SQLITE_OMIT_UT
c200: 46 31 36 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  F16.int sqlite3_
c210: 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 31  create_function1
c220: 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  6(.  sqlite3 *db
c230: 2c 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ,.  const void *
c240: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20  zFunctionName,. 
c250: 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74   int nArg,.  int
c260: 20 65 54 65 78 74 52 65 70 2c 0a 20 20 76 6f 69   eTextRep,.  voi
c270: 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78  d *p,.  void (*x
c280: 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f  Func)(sqlite3_co
c290: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
c2a0: 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76  e3_value**),.  v
c2b0: 6f 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c  oid (*xStep)(sql
c2c0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e  ite3_context*,in
c2d0: 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 2a  t,sqlite3_value*
c2e0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
c2f0: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
c300: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 69 6e 74 20  text*).){.  int 
c310: 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6e  rc;.  char *zFun
c320: 63 38 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c8;.  sqlite3_mu
c330: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
c340: 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20  tex);.  assert( 
c350: 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  !db->mallocFaile
c360: 64 20 29 3b 0a 20 20 7a 46 75 6e 63 38 20 3d 20  d );.  zFunc8 = 
c370: 73 71 6c 69 74 65 33 55 74 66 31 36 74 6f 38 28  sqlite3Utf16to8(
c380: 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d  db, zFunctionNam
c390: 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 55 54  e, -1, SQLITE_UT
c3a0: 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20 72 63  F16NATIVE);.  rc
c3b0: 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74 65   = sqlite3Create
c3c0: 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 38 2c  Func(db, zFunc8,
c3d0: 20 6e 41 72 67 2c 20 65 54 65 78 74 52 65 70 2c   nArg, eTextRep,
c3e0: 20 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70   p, xFunc, xStep
c3f0: 2c 20 78 46 69 6e 61 6c 2c 30 29 3b 0a 20 20 73  , xFinal,0);.  s
c400: 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c  qlite3DbFree(db,
c410: 20 7a 46 75 6e 63 38 29 3b 0a 20 20 72 63 20 3d   zFunc8);.  rc =
c420: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
c430: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
c440: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
c450: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
c460: 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66  urn rc;.}.#endif
c470: 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65 63 6c 61 72 65  .../*.** Declare
c480: 20 74 68 61 74 20 61 20 66 75 6e 63 74 69 6f 6e   that a function
c490: 20 68 61 73 20 62 65 65 6e 20 6f 76 65 72 6c 6f   has been overlo
c4a0: 61 64 65 64 20 62 79 20 61 20 76 69 72 74 75 61  aded by a virtua
c4b0: 6c 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  l table..**.** I
c4c0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61  f the function a
c4d0: 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 61 73  lready exists as
c4e0: 20 61 20 72 65 67 75 6c 61 72 20 67 6c 6f 62 61   a regular globa
c4f0: 6c 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e  l function, then
c500: 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65  .** this routine
c510: 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 49 66   is a no-op.  If
c520: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
c530: 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
c540: 65 6e 20 63 72 65 61 74 65 0a 2a 2a 20 61 20 6e  en create.** a n
c550: 65 77 20 6f 6e 65 20 74 68 61 74 20 61 6c 77 61  ew one that alwa
c560: 79 73 20 74 68 72 6f 77 73 20 61 20 72 75 6e 2d  ys throws a run-
c570: 74 69 6d 65 20 65 72 72 6f 72 2e 20 20 0a 2a 2a  time error.  .**
c580: 0a 2a 2a 20 57 68 65 6e 20 76 69 72 74 75 61 6c  .** When virtual
c590: 20 74 61 62 6c 65 73 20 69 6e 74 65 6e 64 20 74   tables intend t
c5a0: 6f 20 70 72 6f 76 69 64 65 20 61 6e 20 6f 76 65  o provide an ove
c5b0: 72 6c 6f 61 64 65 64 20 66 75 6e 63 74 69 6f 6e  rloaded function
c5c0: 2c 20 74 68 65 79 0a 2a 2a 20 73 68 6f 75 6c 64  , they.** should
c5d0: 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   call this routi
c5e0: 6e 65 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ne to make sure 
c5f0: 74 68 65 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74  the global funct
c600: 69 6f 6e 20 65 78 69 73 74 73 2e 0a 2a 2a 20 41  ion exists..** A
c610: 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e   global function
c620: 20 6d 75 73 74 20 65 78 69 73 74 20 69 6e 20 6f   must exist in o
c630: 72 64 65 72 20 66 6f 72 20 6e 61 6d 65 20 72 65  rder for name re
c640: 73 6f 6c 75 74 69 6f 6e 20 74 6f 20 77 6f 72 6b  solution to work
c650: 0a 2a 2a 20 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f  .** properly..*/
c660: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 76 65  .int sqlite3_ove
c670: 72 6c 6f 61 64 5f 66 75 6e 63 74 69 6f 6e 28 0a  rload_function(.
c680: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20    sqlite3 *db,. 
c690: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
c6a0: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 0a 29  me,.  int nArg.)
c6b0: 7b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20  {.  int nName = 
c6c0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
c6d0: 7a 4e 61 6d 65 29 3b 0a 20 20 69 6e 74 20 72 63  zName);.  int rc
c6e0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c6f0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
c700: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
c710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 6e    if( sqlite3Fin
c720: 64 46 75 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 4e  dFunction(db, zN
c730: 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67  ame, nName, nArg
c740: 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
c750: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
c760: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
c770: 6e 63 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41  nc(db, zName, nA
c780: 72 67 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  rg, SQLITE_UTF8,
c790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c7a0: 20 20 20 20 20 20 20 20 20 20 20 20 30 2c 20 73              0, s
c7b0: 71 6c 69 74 65 33 49 6e 76 61 6c 69 64 46 75 6e  qlite3InvalidFun
c7c0: 63 74 69 6f 6e 2c 20 30 2c 20 30 2c 20 30 29 3b  ction, 0, 0, 0);
c7d0: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
c7e0: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
c7f0: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
c800: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
c810: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
c820: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
c830: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 0a  LITE_OMIT_TRACE.
c840: 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
c850: 20 74 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 2e   trace function.
c860: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
c870: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
c880: 65 67 69 73 74 65 72 65 64 20 74 72 61 63 65 0a  egistered trace.
c890: 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  ** is returned. 
c8a0: 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74   .**.** A NULL t
c8b0: 72 61 63 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65  race function me
c8c0: 61 6e 73 20 74 68 61 74 20 6e 6f 20 74 72 61 63  ans that no trac
c8d0: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
c8e0: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
c8f0: 74 72 61 63 65 20 69 73 20 61 20 70 6f 69 6e 74  trace is a point
c900: 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69 6f 6e  er to a function
c910: 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b 65 64   that is invoked
c920: 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
c930: 20 65 61 63 68 0a 2a 2a 20 53 51 4c 20 73 74 61   each.** SQL sta
c940: 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20  tement..*/.void 
c950: 2a 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 73  *sqlite3_trace(s
c960: 71 6c 69 74 65 33 20 2a 64 62 2c 20 76 6f 69 64  qlite3 *db, void
c970: 20 28 2a 78 54 72 61 63 65 29 28 76 6f 69 64 2a   (*xTrace)(void*
c980: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 2c 20 76  ,const char*), v
c990: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 76 6f  oid *pArg){.  vo
c9a0: 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69  id *pOld;.  sqli
c9b0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
c9c0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f  db->mutex);.  pO
c9d0: 6c 64 20 3d 20 64 62 2d 3e 70 54 72 61 63 65 41  ld = db->pTraceA
c9e0: 72 67 3b 0a 20 20 64 62 2d 3e 78 54 72 61 63 65  rg;.  db->xTrace
c9f0: 20 3d 20 78 54 72 61 63 65 3b 0a 20 20 64 62 2d   = xTrace;.  db-
ca00: 3e 70 54 72 61 63 65 41 72 67 20 3d 20 70 41 72  >pTraceArg = pAr
ca10: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
ca20: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
ca30: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
ca40: 6c 64 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69  ld;.}./*.** Regi
ca50: 73 74 65 72 20 61 20 70 72 6f 66 69 6c 65 20 66  ster a profile f
ca60: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
ca70: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
ca80: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
ca90: 64 20 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 66 75  d .** profile fu
caa0: 6e 63 74 69 6f 6e 20 69 73 20 72 65 74 75 72 6e  nction is return
cab0: 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55  ed.  .**.** A NU
cac0: 4c 4c 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74  LL profile funct
cad0: 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74 20 6e  ion means that n
cae0: 6f 20 70 72 6f 66 69 6c 69 6e 67 20 69 73 20 65  o profiling is e
caf0: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
cb00: 4e 55 4c 4c 0a 2a 2a 20 70 72 6f 66 69 6c 65 20  NULL.** profile 
cb10: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
cb20: 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  a function that 
cb30: 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68  is invoked at th
cb40: 65 20 63 6f 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a  e conclusion of.
cb50: 2a 2a 20 65 61 63 68 20 53 51 4c 20 73 74 61 74  ** each SQL stat
cb60: 65 6d 65 6e 74 20 74 68 61 74 20 69 73 20 72 75  ement that is ru
cb70: 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  n..*/.void *sqli
cb80: 74 65 33 5f 70 72 6f 66 69 6c 65 28 0a 20 20 73  te3_profile(.  s
cb90: 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 76 6f  qlite3 *db,.  vo
cba0: 69 64 20 28 2a 78 50 72 6f 66 69 6c 65 29 28 76  id (*xProfile)(v
cbb0: 6f 69 64 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  oid*,const char*
cbc0: 2c 73 71 6c 69 74 65 5f 75 69 6e 74 36 34 29 2c  ,sqlite_uint64),
cbd0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
cbe0: 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20  .  void *pOld;. 
cbf0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
cc00: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
cc10: 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 50  .  pOld = db->pP
cc20: 72 6f 66 69 6c 65 41 72 67 3b 0a 20 20 64 62 2d  rofileArg;.  db-
cc30: 3e 78 50 72 6f 66 69 6c 65 20 3d 20 78 50 72 6f  >xProfile = xPro
cc40: 66 69 6c 65 3b 0a 20 20 64 62 2d 3e 70 50 72 6f  file;.  db->pPro
cc50: 66 69 6c 65 41 72 67 20 3d 20 70 41 72 67 3b 0a  fileArg = pArg;.
cc60: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
cc70: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
cc80: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b  ;.  return pOld;
cc90: 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
cca0: 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 20 2a  ITE_OMIT_TRACE *
ccb0: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
ccc0: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  r a function to 
ccd0: 62 65 20 69 6e 76 6f 6b 65 64 20 77 68 65 6e 20  be invoked when 
cce0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  a transaction co
ccf0: 6d 6d 69 74 73 2e 0a 2a 2a 20 49 66 20 74 68 65  mmits..** If the
cd00: 20 69 6e 76 6f 6b 65 64 20 66 75 6e 63 74 69 6f   invoked functio
cd10: 6e 20 72 65 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65  n returns non-ze
cd20: 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6d  ro, then the com
cd30: 6d 69 74 20 62 65 63 6f 6d 65 73 20 61 0a 2a 2a  mit becomes a.**
cd40: 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f   rollback..*/.vo
cd50: 69 64 20 2a 73 71 6c 69 74 65 33 5f 63 6f 6d 6d  id *sqlite3_comm
cd60: 69 74 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74  it_hook(.  sqlit
cd70: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
cd80: 20 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74       /* Attach t
cd90: 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20  he hook to this 
cda0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e  database */.  in
cdb0: 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  t (*xCallback)(v
cdc0: 6f 69 64 2a 29 2c 20 20 2f 2a 20 46 75 6e 63 74  oid*),  /* Funct
cdd0: 69 6f 6e 20 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e  ion to invoke on
cde0: 20 65 61 63 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a   each commit */.
cdf0: 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20    void *pArg    
ce00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
ce10: 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66  rgument to the f
ce20: 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20  unction */.){.  
ce30: 76 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71  void *pOld;.  sq
ce40: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
ce50: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
ce60: 70 4f 6c 64 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d  pOld = db->pComm
ce70: 69 74 41 72 67 3b 0a 20 20 64 62 2d 3e 78 43 6f  itArg;.  db->xCo
ce80: 6d 6d 69 74 43 61 6c 6c 62 61 63 6b 20 3d 20 78  mmitCallback = x
ce90: 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e  Callback;.  db->
cea0: 70 43 6f 6d 6d 69 74 41 72 67 20 3d 20 70 41 72  pCommitArg = pAr
ceb0: 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
cec0: 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
ced0: 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4f  ex);.  return pO
cee0: 6c 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  ld;.}../*.** Reg
cef0: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
cf00: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
cf10: 61 63 68 20 74 69 6d 65 20 61 20 72 6f 77 20 69  ach time a row i
cf20: 73 20 75 70 64 61 74 65 64 2c 0a 2a 2a 20 69 6e  s updated,.** in
cf30: 73 65 72 74 65 64 20 6f 72 20 64 65 6c 65 74 65  serted or delete
cf40: 64 20 75 73 69 6e 67 20 74 68 69 73 20 64 61 74  d using this dat
cf50: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
cf60: 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
cf70: 65 33 5f 75 70 64 61 74 65 5f 68 6f 6f 6b 28 0a  e3_update_hook(.
cf80: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
cfa0: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
cfb0: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
cfc0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
cfd0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74  lback)(void*,int
cfe0: 2c 63 68 61 72 20 63 6f 6e 73 74 20 2a 2c 63 68  ,char const *,ch
cff0: 61 72 20 63 6f 6e 73 74 20 2a 2c 73 71 6c 69 74  ar const *,sqlit
d000: 65 5f 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64  e_int64),.  void
d010: 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20 20   *pArg          
d020: 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e        /* Argumen
d030: 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f  t to the functio
d040: 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a  n */.){.  void *
d050: 70 52 65 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pRet;.  sqlite3_
d060: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
d070: 6d 75 74 65 78 29 3b 0a 20 20 70 52 65 74 20 3d  mutex);.  pRet =
d080: 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67 3b   db->pUpdateArg;
d090: 0a 20 20 64 62 2d 3e 78 55 70 64 61 74 65 43 61  .  db->xUpdateCa
d0a0: 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61  llback = xCallba
d0b0: 63 6b 3b 0a 20 20 64 62 2d 3e 70 55 70 64 61 74  ck;.  db->pUpdat
d0c0: 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73  eArg = pArg;.  s
d0d0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
d0e0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
d0f0: 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a   return pRet;.}.
d100: 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20  ./*.** Register 
d110: 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65  a callback to be
d120: 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69   invoked each ti
d130: 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  me a transaction
d140: 20 69 73 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61   is rolled.** ba
d150: 63 6b 20 62 79 20 74 68 69 73 20 64 61 74 61 62  ck by this datab
d160: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a  ase connection..
d170: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
d180: 5f 72 6f 6c 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a  _rollback_hook(.
d190: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
d1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
d1b0: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
d1c0: 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  o this database 
d1d0: 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 61 6c  */.  void (*xCal
d1e0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 2f  lback)(void*), /
d1f0: 2a 20 43 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  * Callback funct
d200: 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
d210: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
d220: 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74     /* Argument t
d230: 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  o the function *
d240: 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65  /.){.  void *pRe
d250: 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  t;.  sqlite3_mut
d260: 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
d270: 65 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62  ex);.  pRet = db
d280: 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a  ->pRollbackArg;.
d290: 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43    db->xRollbackC
d2a0: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
d2b0: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c  ack;.  db->pRoll
d2c0: 62 61 63 6b 41 72 67 20 3d 20 70 41 72 67 3b 0a  backArg = pArg;.
d2d0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
d2e0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
d2f0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b  ;.  return pRet;
d300: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
d310: 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a  TE_OMIT_WAL./*.*
d320: 2a 20 54 68 65 20 73 71 6c 69 74 65 33 5f 77 61  * The sqlite3_wa
d330: 6c 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63  l_hook() callbac
d340: 6b 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20  k registered by 
d350: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75 74 6f  sqlite3_wal_auto
d360: 63 68 65 63 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a  checkpoint()..**
d370: 20 49 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f   Invoke sqlite3_
d380: 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 20 69  wal_checkpoint i
d390: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
d3a0: 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c 6f  frames in the lo
d3b0: 67 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65  g file.** is gre
d3c0: 61 74 65 72 20 74 68 61 6e 20 73 71 6c 69 74 65  ater than sqlite
d3d0: 33 2e 70 57 61 6c 41 72 67 20 63 61 73 74 20 74  3.pWalArg cast t
d3e0: 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 28 74 68  o an integer (th
d3f0: 65 20 76 61 6c 75 65 20 63 6f 6e 66 69 67 75 72  e value configur
d400: 65 64 20 62 79 0a 2a 2a 20 77 61 6c 5f 61 75 74  ed by.** wal_aut
d410: 6f 63 68 65 63 6b 70 6f 69 6e 74 28 29 29 2e 0a  ocheckpoint())..
d420: 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 57  */ .int sqlite3W
d430: 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 28 0a 20  alDefaultHook(. 
d440: 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61   void *pClientDa
d450: 74 61 2c 20 20 20 20 20 2f 2a 20 41 72 67 75 6d  ta,     /* Argum
d460: 65 6e 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ent */.  sqlite3
d470: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
d480: 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  /* Connection */
d490: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
d4a0: 44 62 2c 20 20 20 20 20 20 20 2f 2a 20 44 61 74  Db,       /* Dat
d4b0: 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 6e  abase */.  int n
d4c0: 46 72 61 6d 65 20 20 20 20 20 20 20 20 20 20 20  Frame           
d4d0: 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 57 41 4c    /* Size of WAL
d4e0: 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 6e 46 72   */.){.  if( nFr
d4f0: 61 6d 65 3e 3d 53 51 4c 49 54 45 5f 50 54 52 5f  ame>=SQLITE_PTR_
d500: 54 4f 5f 49 4e 54 28 70 43 6c 69 65 6e 74 44 61  TO_INT(pClientDa
d510: 74 61 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ta) ){.    sqlit
d520: 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c  e3BeginBenignMal
d530: 6c 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  loc();.    sqlit
d540: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
d550: 74 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20  t(db, zDb);.    
d560: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
d570: 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 7d 0a 20 20  Malloc();.  }.  
d580: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
d590: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
d5a0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f  LITE_OMIT_WAL */
d5b0: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
d5c0: 65 20 61 6e 20 73 71 6c 69 74 65 33 5f 77 61 6c  e an sqlite3_wal
d5d0: 5f 68 6f 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b  _hook() callback
d5e0: 20 74 6f 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c   to automaticall
d5f0: 79 20 63 68 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20  y checkpoint.** 
d600: 61 20 64 61 74 61 62 61 73 65 20 61 66 74 65 72  a database after
d610: 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72   committing a tr
d620: 61 6e 73 61 63 74 69 6f 6e 20 69 66 20 74 68 65  ansaction if the
d630: 72 65 20 61 72 65 20 6e 46 72 61 6d 65 20 6f 72  re are nFrame or
d640: 0a 2a 2a 20 6d 6f 72 65 20 66 72 61 6d 65 73 20  .** more frames 
d650: 69 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 2e  in the log file.
d660: 20 50 61 73 73 69 6e 67 20 7a 65 72 6f 20 6f 72   Passing zero or
d670: 20 61 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75   a negative valu
d680: 65 20 61 73 20 74 68 65 0a 2a 2a 20 6e 46 72 61  e as the.** nFra
d690: 6d 65 20 70 61 72 61 6d 65 74 65 72 20 64 69 73  me parameter dis
d6a0: 61 62 6c 65 73 20 61 75 74 6f 6d 61 74 69 63 20  ables automatic 
d6b0: 63 68 65 63 6b 70 6f 69 6e 74 73 20 65 6e 74 69  checkpoints enti
d6c0: 72 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rely..**.** The 
d6d0: 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74 65  callback registe
d6e0: 72 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  red by this func
d6f0: 74 69 6f 6e 20 72 65 70 6c 61 63 65 73 20 61 6e  tion replaces an
d700: 79 20 65 78 69 73 74 69 6e 67 20 63 61 6c 6c 62  y existing callb
d710: 61 63 6b 0a 2a 2a 20 72 65 67 69 73 74 65 72 65  ack.** registere
d720: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f  d using sqlite3_
d730: 77 61 6c 5f 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65  wal_hook(). Like
d740: 77 69 73 65 2c 20 72 65 67 69 73 74 65 72 69 6e  wise, registerin
d750: 67 20 61 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  g a callback.** 
d760: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61  using sqlite3_wa
d770: 6c 5f 68 6f 6f 6b 28 29 20 64 69 73 61 62 6c 65  l_hook() disable
d780: 73 20 74 68 65 20 61 75 74 6f 6d 61 74 69 63 20  s the automatic 
d790: 63 68 65 63 6b 70 6f 69 6e 74 20 6d 65 63 68 61  checkpoint mecha
d7a0: 6e 69 73 6d 0a 2a 2a 20 63 6f 6e 66 69 67 75 72  nism.** configur
d7b0: 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
d7c0: 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ion..*/.int sqli
d7d0: 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
d7e0: 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20 2a  kpoint(sqlite3 *
d7f0: 64 62 2c 20 69 6e 74 20 6e 46 72 61 6d 65 29 7b  db, int nFrame){
d800: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
d810: 4d 49 54 5f 57 41 4c 0a 20 20 55 4e 55 53 45 44  MIT_WAL.  UNUSED
d820: 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a  _PARAMETER(db);.
d830: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
d840: 45 52 28 6e 46 72 61 6d 65 29 3b 0a 23 65 6c 73  ER(nFrame);.#els
d850: 65 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e 30  e.  if( nFrame>0
d860: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
d870: 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 73 71 6c  wal_hook(db, sql
d880: 69 74 65 33 57 61 6c 44 65 66 61 75 6c 74 48 6f  ite3WalDefaultHo
d890: 6f 6b 2c 20 53 51 4c 49 54 45 5f 49 4e 54 5f 54  ok, SQLITE_INT_T
d8a0: 4f 5f 50 54 52 28 6e 46 72 61 6d 65 29 29 3b 0a  O_PTR(nFrame));.
d8b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
d8c0: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62  ite3_wal_hook(db
d8d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e  , 0, 0);.  }.#en
d8e0: 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  dif.  return SQL
d8f0: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
d900: 20 52 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c   Register a call
d910: 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b  back to be invok
d920: 65 64 20 65 61 63 68 20 74 69 6d 65 20 61 20 74  ed each time a t
d930: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 77 72  ransaction is wr
d940: 69 74 74 65 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68  itten.** into th
d950: 65 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c 6f  e write-ahead-lo
d960: 67 20 62 79 20 74 68 69 73 20 64 61 74 61 62 61  g by this databa
d970: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a  se connection..*
d980: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
d990: 77 61 6c 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69  wal_hook(.  sqli
d9a0: 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20  te3 *db,        
d9b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
d9c0: 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20 74  ttach the hook t
d9d0: 6f 20 74 68 69 73 20 64 62 20 68 61 6e 64 6c 65  o this db handle
d9e0: 20 2a 2f 0a 20 20 69 6e 74 28 2a 78 43 61 6c 6c   */.  int(*xCall
d9f0: 62 61 63 6b 29 28 76 6f 69 64 20 2a 2c 20 73 71  back)(void *, sq
da00: 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63 68  lite3*, const ch
da10: 61 72 2a 2c 20 69 6e 74 29 2c 0a 20 20 76 6f 69  ar*, int),.  voi
da20: 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20 20  d *pArg         
da30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
da40: 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 70  First argument p
da50: 61 73 73 65 64 20 74 6f 20 78 43 61 6c 6c 62 61  assed to xCallba
da60: 63 6b 28 29 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64  ck() */.){.#ifnd
da70: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
da80: 41 4c 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b  AL.  void *pRet;
da90: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
daa0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
dab0: 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e  );.  pRet = db->
dac0: 70 57 61 6c 41 72 67 3b 0a 20 20 64 62 2d 3e 78  pWalArg;.  db->x
dad0: 57 61 6c 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43  WalCallback = xC
dae0: 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70  allback;.  db->p
daf0: 57 61 6c 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  WalArg = pArg;. 
db00: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
db10: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
db20: 0a 20 20 72 65 74 75 72 6e 20 70 52 65 74 3b 0a  .  return pRet;.
db30: 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 30  #else.  return 0
db40: 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  ;.#endif.}../*.*
db50: 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20 64 61 74  * Checkpoint dat
db60: 61 62 61 73 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e  abase zDb..*/.in
db70: 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68  t sqlite3_wal_ch
db80: 65 63 6b 70 6f 69 6e 74 5f 76 32 28 0a 20 20 73  eckpoint_v2(.  s
db90: 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
dba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dbb0: 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e 64 6c  * Database handl
dbc0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
dbd0: 72 20 2a 7a 44 62 2c 20 20 20 20 20 20 20 20 20  r *zDb,         
dbe0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
dbf0: 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  f attached datab
dc00: 61 73 65 20 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f  ase (or NULL) */
dc10: 0a 20 20 69 6e 74 20 65 4d 6f 64 65 2c 20 20 20  .  int eMode,   
dc20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc30: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45     /* SQLITE_CHE
dc40: 43 4b 50 4f 49 4e 54 5f 2a 20 76 61 6c 75 65 20  CKPOINT_* value 
dc50: 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c  */.  int *pnLog,
dc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dc70: 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53 69 7a       /* OUT: Siz
dc80: 65 20 6f 66 20 57 41 4c 20 6c 6f 67 20 69 6e 20  e of WAL log in 
dc90: 66 72 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20  frames */.  int 
dca0: 2a 70 6e 43 6b 70 74 20 20 20 20 20 20 20 20 20  *pnCkpt         
dcb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
dcc0: 55 54 3a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72  UT: Total number
dcd0: 20 6f 66 20 66 72 61 6d 65 73 20 63 68 65 63 6b   of frames check
dce0: 70 6f 69 6e 74 65 64 20 2a 2f 0a 29 7b 0a 23 69  pointed */.){.#i
dcf0: 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
dd00: 5f 57 41 4c 0a 20 20 72 65 74 75 72 6e 20 53 51  _WAL.  return SQ
dd10: 4c 49 54 45 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20  LITE_OK;.#else. 
dd20: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
dd30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd40: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
dd50: 2a 2f 0a 20 20 69 6e 74 20 69 44 62 20 3d 20 53  */.  int iDb = S
dd60: 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
dd70: 45 44 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 2e  ED;  /* sqlite3.
dd80: 61 44 62 5b 5d 20 69 6e 64 65 78 20 6f 66 20 64  aDb[] index of d
dd90: 62 20 74 6f 20 63 68 65 63 6b 70 6f 69 6e 74 20  b to checkpoint 
dda0: 2a 2f 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  */..  /* Initial
ddb0: 69 7a 65 20 74 68 65 20 6f 75 74 70 75 74 20 76  ize the output v
ddc0: 61 72 69 61 62 6c 65 73 20 74 6f 20 2d 31 20 69  ariables to -1 i
ddd0: 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20  n case an error 
dde0: 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 69 66 28  occurs. */.  if(
ddf0: 20 70 6e 4c 6f 67 20 29 20 2a 70 6e 4c 6f 67 20   pnLog ) *pnLog 
de00: 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 6e 43 6b  = -1;.  if( pnCk
de10: 70 74 20 29 20 2a 70 6e 43 6b 70 74 20 3d 20 2d  pt ) *pnCkpt = -
de20: 31 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 53 51  1;..  assert( SQ
de30: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
de40: 46 55 4c 4c 3e 53 51 4c 49 54 45 5f 43 48 45 43  FULL>SQLITE_CHEC
de50: 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 20 29  KPOINT_PASSIVE )
de60: 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
de70: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55  TE_CHECKPOINT_FU
de80: 4c 4c 3c 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  LL<SQLITE_CHECKP
de90: 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a  OINT_RESTART );.
dea0: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
deb0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53  _CHECKPOINT_PASS
dec0: 49 56 45 2b 32 3d 3d 53 51 4c 49 54 45 5f 43 48  IVE+2==SQLITE_CH
ded0: 45 43 4b 50 4f 49 4e 54 5f 52 45 53 54 41 52 54  ECKPOINT_RESTART
dee0: 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3c   );.  if( eMode<
def0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e  SQLITE_CHECKPOIN
df00: 54 5f 50 41 53 53 49 56 45 20 7c 7c 20 65 4d 6f  T_PASSIVE || eMo
df10: 64 65 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  de>SQLITE_CHECKP
df20: 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 7b 0a  OINT_RESTART ){.
df30: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
df40: 45 5f 4d 49 53 55 53 45 3b 0a 20 20 7d 0a 0a 20  E_MISUSE;.  }.. 
df50: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
df60: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
df70: 0a 20 20 69 66 28 20 7a 44 62 20 26 26 20 7a 44  .  if( zDb && zD
df80: 62 5b 30 5d 20 29 7b 0a 20 20 20 20 69 44 62 20  b[0] ){.    iDb 
df90: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 44 62 4e  = sqlite3FindDbN
dfa0: 61 6d 65 28 64 62 2c 20 7a 44 62 29 3b 0a 20 20  ame(db, zDb);.  
dfb0: 7d 0a 20 20 69 66 28 20 69 44 62 3c 30 20 29 7b  }.  if( iDb<0 ){
dfc0: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
dfd0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 73 71 6c 69  _ERROR;.    sqli
dfe0: 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
dff0: 49 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e  ITE_ERROR, "unkn
e000: 6f 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73  own database: %s
e010: 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65  ", zDb);.  }else
e020: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
e030: 65 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  e3Checkpoint(db,
e040: 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c   iDb, eMode, pnL
e050: 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20  og, pnCkpt);.   
e060: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
e070: 2c 20 72 63 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  , rc, 0);.  }.  
e080: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
e090: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
e0a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
e0b0: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
e0c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
e0d0: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  if.}.../*.** Che
e0e0: 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65  ckpoint database
e0f0: 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20   zDb. If zDb is 
e100: 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20  NULL, or if the 
e110: 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74  buffer zDb point
e120: 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73  s.** to contains
e130: 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73   a zero-length s
e140: 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63  tring, all attac
e150: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72  hed databases ar
e160: 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  e .** checkpoint
e170: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
e180: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
e190: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  t(sqlite3 *db, c
e1a0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
e1b0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
e1c0: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
e1d0: 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c  _v2(db, zDb, SQL
e1e0: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
e1f0: 41 53 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a 7d  ASSIVE, 0, 0);.}
e200: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e210: 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
e220: 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  Run a checkpoint
e230: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   on database iDb
e240: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
e250: 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44  p if database iD
e260: 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72  b is.** not curr
e270: 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41  ently open in WA
e280: 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  L mode..**.** If
e290: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
e2a0: 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  s open on the da
e2b0: 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65  tabase being che
e2c0: 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20  ckpointed, this 
e2d0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
e2e0: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  urns SQLITE_LOCK
e2f0: 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f  ED and a checkpo
e300: 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  int is not attem
e310: 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  pted. If .** an 
e320: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
e330: 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  le running the c
e340: 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51  heckpoint, an SQ
e350: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
e360: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
e370: 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (i.e. SQLITE_IOE
e380: 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  RR). Otherwise, 
e390: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
e3a0: 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61   The mutex on da
e3b0: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
e3c0: 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
e3d0: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  by the caller. T
e3e0: 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f  he mutex.** asso
e3f0: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
e400: 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20  specific b-tree 
e410: 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74  being checkpoint
e420: 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a  ed is taken by.*
e430: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
e440: 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70  while the checkp
e450: 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e  oint is running.
e460: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73  .**.** If iDb is
e470: 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d   passed SQLITE_M
e480: 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65  AX_ATTACHED, the
e490: 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
e4a0: 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20  atabases are.** 
e4b0: 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66  checkpointed. If
e4c0: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
e4d0: 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72  ountered it is r
e4e0: 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74  eturned immediat
e4f0: 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65  ely -.** no atte
e500: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
e510: 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65  heckpoint any re
e520: 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65  maining database
e530: 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  s..**.** Paramet
e540: 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20  er eMode is one 
e550: 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  of SQLITE_CHECKP
e560: 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55  OINT_PASSIVE, FU
e570: 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a  LL or RESTART..*
e580: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
e590: 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
e5a0: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  *db, int iDb, in
e5b0: 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e  t eMode, int *pn
e5c0: 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74  Log, int *pnCkpt
e5d0: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
e5e0: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
e5f0: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
e600: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ode */.  int i; 
e610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e620: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
e630: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
e640: 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73  ugh attached dbs
e650: 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20   */.  int bBusy 
e660: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
e670: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
e680: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73   SQLITE_BUSY has
e690: 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
e6a0: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
e6b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
e6c0: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
e6d0: 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f  .  assert( !pnLo
e6e0: 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20  g || *pnLog==-1 
e6f0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e  );.  assert( !pn
e700: 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d  Ckpt || *pnCkpt=
e710: 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  =-1 );..  for(i=
e720: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20  0; i<db->nDb && 
e730: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
e740: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d  ++){.    if( i==
e750: 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49  iDb || iDb==SQLI
e760: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
e770: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
e780: 6c 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70  lite3BtreeCheckp
e790: 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  oint(db->aDb[i].
e7a0: 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  pBt, eMode, pnLo
e7b0: 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
e7c0: 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20    pnLog = 0;.   
e7d0: 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20     pnCkpt = 0;. 
e7e0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
e7f0: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
e800: 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20      bBusy = 1;. 
e810: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
e820: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
e830: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
e840: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
e850: 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51  K && bBusy) ? SQ
e860: 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a  LITE_BUSY : rc;.
e870: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
e880: 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
e890: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
e8a0: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65  ion returns true
e8b0: 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20   if main-memory 
e8c0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69  should be used i
e8d0: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74  nstead of.** a t
e8e0: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f  emporary file fo
e8f0: 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65  r transient page
e900: 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74  r files and stat
e910: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a  ement journals..
e920: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
e930: 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  urned depends on
e940: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62   the value of db
e950: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75  ->temp_store (ru
e960: 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74  ntime.** paramet
e970: 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  er) and the comp
e980: 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f  ile time value o
e990: 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
e9a0: 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ORE. The.** foll
e9b0: 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
e9c0: 72 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69  ribes the relati
e9d0: 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74  onship between t
e9e0: 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a  hese two values.
e9f0: 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ** and this func
ea00: 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c  tions return val
ea10: 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49  ue..**.**   SQLI
ea20: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20  TE_TEMP_STORE   
ea30: 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65    db->temp_store
ea40: 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66       Location of
ea50: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
ea60: 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ase.**   -------
ea70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
ea80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
ea90: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
eaa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
eab0: 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
eac0: 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
ead0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
eae0: 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
eaf0: 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   0).**   1      
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb20: 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
eb30: 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
eb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb50: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
eb60: 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
eb70: 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31  return 1).**   1
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb90: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
eba0: 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
ebb0: 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
ebc0: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
ebd0: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
ebe0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
ebf0: 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
ec00: 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
ec10: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
ec20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
ec30: 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
ec40: 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  1).**   2       
ec50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
ec60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ec70: 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
ec80: 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20  rn 1).**   3    
ec90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eca0: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
ecb0: 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
ecc0: 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20  eturn 1).*/.int 
ecd0: 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
ece0: 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65  ory(const sqlite
ecf0: 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49  3 *db){.#if SQLI
ed00: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31  TE_TEMP_STORE==1
ed10: 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e  .  return ( db->
ed20: 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b  temp_store==2 );
ed30: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
ed40: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32  TE_TEMP_STORE==2
ed50: 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e  .  return ( db->
ed60: 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b  temp_store!=1 );
ed70: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
ed80: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33  TE_TEMP_STORE==3
ed90: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
eda0: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
edb0: 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53  EMP_STORE<1 || S
edc0: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
edd0: 3e 33 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  >3.  return 0;.#
ede0: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
edf0: 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f  eturn UTF-8 enco
ee00: 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  ded English lang
ee10: 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
ee20: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
ee30: 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f  ent.** error..*/
ee40: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
ee50: 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69  ite3_errmsg(sqli
ee60: 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73  te3 *db){.  cons
ee70: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28  t char *z;.  if(
ee80: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
ee90: 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
eea0: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  (SQLITE_NOMEM);.
eeb0: 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
eec0: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
eed0: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
eee0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
eef0: 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53  rrStr(SQLITE_MIS
ef00: 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20  USE_BKPT);.  }. 
ef10: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
ef20: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
ef30: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
ef40: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a  cFailed ){.    z
ef50: 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
ef60: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  (SQLITE_NOMEM);.
ef70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d    }else{.    z =
ef80: 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f   (char*)sqlite3_
ef90: 76 61 6c 75 65 5f 74 65 78 74 28 64 62 2d 3e 70  value_text(db->p
efa0: 45 72 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  Err);.    assert
efb0: 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
efc0: 6c 65 64 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  led );.    if( z
efd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d  ==0 ){.      z =
efe0: 20 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 64   sqlite3ErrStr(d
eff0: 62 2d 3e 65 72 72 43 6f 64 65 29 3b 0a 20 20 20  b->errCode);.   
f000: 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
f010: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
f020: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
f030: 6e 20 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20  n z;.}..#ifndef 
f040: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31  SQLITE_OMIT_UTF1
f050: 36 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55  6./*.** Return U
f060: 54 46 2d 31 36 20 65 6e 63 6f 64 65 64 20 45 6e  TF-16 encoded En
f070: 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
f080: 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68  xplanation of th
f090: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a  e most recent.**
f0a0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   error..*/.const
f0b0: 20 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 65   void *sqlite3_e
f0c0: 72 72 6d 73 67 31 36 28 73 71 6c 69 74 65 33 20  rrmsg16(sqlite3 
f0d0: 2a 64 62 29 7b 0a 20 20 73 74 61 74 69 63 20 63  *db){.  static c
f0e0: 6f 6e 73 74 20 75 31 36 20 6f 75 74 4f 66 4d 65  onst u16 outOfMe
f0f0: 6d 5b 5d 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c  m[] = {.    'o',
f100: 20 27 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20   'u', 't', ' ', 
f110: 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 27  'o', 'f', ' ', '
f120: 6d 27 2c 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f  m', 'e', 'm', 'o
f130: 27 2c 20 27 72 27 2c 20 27 79 27 2c 20 30 0a 20  ', 'r', 'y', 0. 
f140: 20 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   };.  static con
f150: 73 74 20 75 31 36 20 6d 69 73 75 73 65 5b 5d 20  st u16 misuse[] 
f160: 3d 20 7b 0a 20 20 20 20 27 6c 27 2c 20 27 69 27  = {.    'l', 'i'
f170: 2c 20 27 62 27 2c 20 27 72 27 2c 20 27 61 27 2c  , 'b', 'r', 'a',
f180: 20 27 72 27 2c 20 27 79 27 2c 20 27 20 27 2c 20   'r', 'y', ' ', 
f190: 0a 20 20 20 20 27 72 27 2c 20 27 6f 27 2c 20 27  .    'r', 'o', '
f1a0: 75 27 2c 20 27 74 27 2c 20 27 69 27 2c 20 27 6e  u', 't', 'i', 'n
f1b0: 27 2c 20 27 65 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'e', ' ', .  
f1c0: 20 20 27 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c    'c', 'a', 'l',
f1d0: 20 27 6c 27 2c 20 27 65 27 2c 20 27 64 27 2c 20   'l', 'e', 'd', 
f1e0: 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27  ' ', .    'o', '
f1f0: 75 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 0a 20  u', 't', ' ', . 
f200: 20 20 20 27 6f 27 2c 20 27 66 27 2c 20 27 20 27     'o', 'f', ' '
f210: 2c 20 0a 20 20 20 20 27 73 27 2c 20 27 65 27 2c  , .    's', 'e',
f220: 20 27 71 27 2c 20 27 75 27 2c 20 27 65 27 2c 20   'q', 'u', 'e', 
f230: 27 6e 27 2c 20 27 63 27 2c 20 27 65 27 2c 20 30  'n', 'c', 'e', 0
f240: 0a 20 20 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76  .  };..  const v
f250: 6f 69 64 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64  oid *z;.  if( !d
f260: 62 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  b ){.    return 
f270: 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d  (void *)outOfMem
f280: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c  ;.  }.  if( !sql
f290: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
f2a0: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
f2b0: 20 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20     return (void 
f2c0: 2a 29 6d 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20  *)misuse;.  }.  
f2d0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
f2e0: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
f2f0: 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
f300: 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20  Failed ){.    z 
f310: 3d 20 28 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d  = (void *)outOfM
f320: 65 6d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  em;.  }else{.   
f330: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c   z = sqlite3_val
f340: 75 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45  ue_text16(db->pE
f350: 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d  rr);.    if( z==
f360: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
f370: 65 33 56 61 6c 75 65 53 65 74 53 74 72 28 64 62  e3ValueSetStr(db
f380: 2d 3e 70 45 72 72 2c 20 2d 31 2c 20 73 71 6c 69  ->pErr, -1, sqli
f390: 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72  te3ErrStr(db->er
f3a0: 72 43 6f 64 65 29 2c 0a 20 20 20 20 20 20 20 20  rCode),.        
f3b0: 20 20 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20     SQLITE_UTF8, 
f3c0: 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
f3d0: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
f3e0: 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28 64  3_value_text16(d
f3f0: 62 2d 3e 70 45 72 72 29 3b 0a 20 20 20 20 7d 0a  b->pErr);.    }.
f400: 20 20 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28      /* A malloc(
f410: 29 20 6d 61 79 20 68 61 76 65 20 66 61 69 6c 65  ) may have faile
f420: 64 20 77 69 74 68 69 6e 20 74 68 65 20 63 61 6c  d within the cal
f430: 6c 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 61 6c  l to sqlite3_val
f440: 75 65 5f 74 65 78 74 31 36 28 29 0a 20 20 20 20  ue_text16().    
f450: 2a 2a 20 61 62 6f 76 65 2e 20 49 66 20 74 68 69  ** above. If thi
f460: 73 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74  s is the case, t
f470: 68 65 6e 20 74 68 65 20 64 62 2d 3e 6d 61 6c 6c  hen the db->mall
f480: 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20 6e 65  ocFailed flag ne
f490: 65 64 73 20 74 6f 0a 20 20 20 20 2a 2a 20 62 65  eds to.    ** be
f4a0: 20 63 6c 65 61 72 65 64 20 62 65 66 6f 72 65 20   cleared before 
f4b0: 72 65 74 75 72 6e 69 6e 67 2e 20 44 6f 20 74 68  returning. Do th
f4c0: 69 73 20 64 69 72 65 63 74 6c 79 2c 20 69 6e 73  is directly, ins
f4d0: 74 65 61 64 20 6f 66 20 76 69 61 0a 20 20 20 20  tead of via.    
f4e0: 2a 2a 20 73 71 6c 69 74 65 33 41 70 69 45 78 69  ** sqlite3ApiExi
f4f0: 74 28 29 2c 20 74 6f 20 61 76 6f 69 64 20 73 65  t(), to avoid se
f500: 74 74 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  tting the databa
f510: 73 65 20 68 61 6e 64 6c 65 20 65 72 72 6f 72 20  se handle error 
f520: 6d 65 73 73 61 67 65 2e 0a 20 20 20 20 2a 2f 0a  message..    */.
f530: 20 20 20 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61      db->mallocFa
f540: 69 6c 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  iled = 0;.  }.  
f550: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
f560: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
f570: 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 23 65    return z;.}.#e
f580: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
f590: 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a  MIT_UTF16 */../*
f5a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d  .** Return the m
f5b0: 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f 72  ost recent error
f5c0: 20 63 6f 64 65 20 67 65 6e 65 72 61 74 65 64 20   code generated 
f5d0: 62 79 20 61 6e 20 53 51 4c 69 74 65 20 72 6f 75  by an SQLite rou
f5e0: 74 69 6e 65 2e 20 49 66 20 4e 55 4c 4c 20 69 73  tine. If NULL is
f5f0: 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 74 68  .** passed to th
f600: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 77 65 20  is function, we 
f610: 61 73 73 75 6d 65 20 61 20 6d 61 6c 6c 6f 63 28  assume a malloc(
f620: 29 20 66 61 69 6c 65 64 20 64 75 72 69 6e 67 20  ) failed during 
f630: 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29 2e 0a  sqlite3_open()..
f640: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65  */.int sqlite3_e
f650: 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20 2a  rrcode(sqlite3 *
f660: 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26 26  db){.  if( db &&
f670: 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79 43   !sqlite3SafetyC
f680: 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29  heckSickOrOk(db)
f690: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f6a0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
f6b0: 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64 62  T;.  }.  if( !db
f6c0: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
f6d0: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
f6e0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
f6f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64 62  .  }.  return db
f700: 2d 3e 65 72 72 43 6f 64 65 20 26 20 64 62 2d 3e  ->errCode & db->
f710: 65 72 72 4d 61 73 6b 3b 0a 7d 0a 69 6e 74 20 73  errMask;.}.int s
f720: 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
f730: 65 72 72 63 6f 64 65 28 73 71 6c 69 74 65 33 20  errcode(sqlite3 
f740: 2a 64 62 29 7b 0a 20 20 69 66 28 20 64 62 20 26  *db){.  if( db &
f750: 26 20 21 73 71 6c 69 74 65 33 53 61 66 65 74 79  & !sqlite3Safety
f760: 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62  CheckSickOrOk(db
f770: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
f780: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
f790: 50 54 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 64  PT;.  }.  if( !d
f7a0: 62 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  b || db->mallocF
f7b0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
f7c0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
f7d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 64  ;.  }.  return d
f7e0: 62 2d 3e 65 72 72 43 6f 64 65 3b 0a 7d 0a 0a 2f  b->errCode;.}../
f7f0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 73 74  *.** Return a st
f800: 72 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69  ring that descri
f810: 62 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20  bes the kind of 
f820: 65 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20  error specified 
f830: 69 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65  in the.** argume
f840: 6e 74 2e 20 20 46 6f 72 20 6e 6f 77 2c 20 74 68  nt.  For now, th
f850: 69 73 20 73 69 6d 70 6c 79 20 63 61 6c 6c 73 20  is simply calls 
f860: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 71 6c  the internal sql
f870: 69 74 65 33 45 72 72 53 74 72 28 29 0a 2a 2a 20  ite3ErrStr().** 
f880: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e  function..*/.con
f890: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
f8a0: 5f 65 72 72 73 74 72 28 69 6e 74 20 72 63 29 7b  _errstr(int rc){
f8b0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
f8c0: 33 45 72 72 53 74 72 28 72 63 29 3b 0a 7d 0a 0a  3ErrStr(rc);.}..
f8d0: 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e  /*.** Create a n
f8e0: 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e  ew collating fun
f8f0: 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61  ction for databa
f900: 73 65 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61  se "db".  The na
f910: 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61  me is zName.** a
f920: 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20  nd the encoding 
f930: 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69  is enc..*/.stati
f940: 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c  c int createColl
f950: 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ation(.  sqlite3
f960: 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  * db,.  const ch
f970: 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38  ar *zName, .  u8
f980: 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43   enc,.  void* pC
f990: 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70  tx,.  int(*xComp
f9a0: 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  are)(void*,int,c
f9b0: 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63  onst void*,int,c
f9c0: 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76  onst void*),.  v
f9d0: 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a  oid(*xDel)(void*
f9e0: 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ).){.  CollSeq *
f9f0: 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63  pColl;.  int enc
fa00: 32 3b 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d  2;.  int nName =
fa10: 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
fa20: 28 7a 4e 61 6d 65 29 3b 0a 20 20 0a 20 20 61 73  (zName);.  .  as
fa30: 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d 75  sert( sqlite3_mu
fa40: 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75 74  tex_held(db->mut
fa50: 65 78 29 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  ex) );..  /* If 
fa60: 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
fa70: 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68 65  specified as the
fa80: 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c 20   encoding type, 
fa90: 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20  transform this. 
faa0: 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51   ** to one of SQ
fab0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72 20  LITE_UTF16LE or 
fac0: 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 75  SQLITE_UTF16BE u
fad0: 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53 51  sing the.  ** SQ
fae0: 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45  LITE_UTF16NATIVE
faf0: 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55   macro. SQLITE_U
fb00: 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65 64  TF16 is not used
fb10: 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a   internally..  *
fb20: 2f 0a 20 20 65 6e 63 32 20 3d 20 65 6e 63 3b 0a  /.  enc2 = enc;.
fb30: 20 20 74 65 73 74 63 61 73 65 28 20 65 6e 63 32    testcase( enc2
fb40: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 20 29  ==SQLITE_UTF16 )
fb50: 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 65 6e  ;.  testcase( en
fb60: 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
fb70: 5f 41 4c 49 47 4e 45 44 20 29 3b 0a 20 20 69 66  _ALIGNED );.  if
fb80: 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55  ( enc2==SQLITE_U
fb90: 54 46 31 36 20 7c 7c 20 65 6e 63 32 3d 3d 53 51  TF16 || enc2==SQ
fba0: 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
fbb0: 45 44 20 29 7b 0a 20 20 20 20 65 6e 63 32 20 3d  ED ){.    enc2 =
fbc0: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
fbd0: 49 56 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 65  IVE;.  }.  if( e
fbe0: 6e 63 32 3c 53 51 4c 49 54 45 5f 55 54 46 38 20  nc2<SQLITE_UTF8 
fbf0: 7c 7c 20 65 6e 63 32 3e 53 51 4c 49 54 45 5f 55  || enc2>SQLITE_U
fc00: 54 46 31 36 42 45 20 29 7b 0a 20 20 20 20 72 65  TF16BE ){.    re
fc10: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
fc20: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20  SE_BKPT;.  }..  
fc30: 2f 2a 20 43 68 65 63 6b 20 69 66 20 74 68 69 73  /* Check if this
fc40: 20 63 61 6c 6c 20 69 73 20 72 65 6d 6f 76 69 6e   call is removin
fc50: 67 20 6f 72 20 72 65 70 6c 61 63 69 6e 67 20 61  g or replacing a
fc60: 6e 20 65 78 69 73 74 69 6e 67 20 63 6f 6c 6c 61  n existing colla
fc70: 74 69 6f 6e 20 0a 20 20 2a 2a 20 73 65 71 75 65  tion .  ** seque
fc80: 6e 63 65 2e 20 49 66 20 73 6f 2c 20 61 6e 64 20  nce. If so, and 
fc90: 74 68 65 72 65 20 61 72 65 20 61 63 74 69 76 65  there are active
fca0: 20 56 4d 73 2c 20 72 65 74 75 72 6e 20 62 75 73   VMs, return bus
fcb0: 79 2e 20 49 66 20 74 68 65 72 65 0a 20 20 2a 2a  y. If there.  **
fcc0: 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56   are no active V
fcd0: 4d 73 2c 20 69 6e 76 61 6c 69 64 61 74 65 20 61  Ms, invalidate a
fce0: 6e 79 20 70 72 65 2d 63 6f 6d 70 69 6c 65 64 20  ny pre-compiled 
fcf0: 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f  statements..  */
fd00: 0a 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  .  pColl = sqlit
fd10: 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62  e3FindCollSeq(db
fd20: 2c 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d  , (u8)enc2, zNam
fd30: 65 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 43 6f  e, 0);.  if( pCo
fd40: 6c 6c 20 26 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d  ll && pColl->xCm
fd50: 70 20 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d  p ){.    if( db-
fd60: 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29 7b 0a  >nVdbeActive ){.
fd70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
fd80: 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55  or(db, SQLITE_BU
fd90: 53 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e  SY, .        "un
fda0: 61 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d  able to delete/m
fdb0: 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20  odify collation 
fdc0: 73 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20  sequence due to 
fdd0: 61 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74  active statement
fde0: 73 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  s");.      retur
fdf0: 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
fe00: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
fe10: 45 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74  ExpirePreparedSt
fe20: 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 0a 20  atements(db);.. 
fe30: 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69     /* If collati
fe40: 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
fe50: 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69  l was created di
fe60: 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c  rectly by a call
fe70: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
fe80: 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
fe90: 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e  ion, and not gen
fea0: 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43  erated by synthC
feb0: 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a  ollSeq(),.    **
fec0: 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73   then any copies
fed0: 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f   made by synthCo
fee0: 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20  llSeq() need to 
fef0: 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
ff00: 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c      ** Also, col
ff10: 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f  lation destructo
ff20: 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c  r - CollSeq.xDel
ff30: 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61  () - function ma
ff40: 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  y need.    ** to
ff50: 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20   be called..    
ff60: 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f  */ .    if( (pCo
ff70: 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54  ll->enc & ~SQLIT
ff80: 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
ff90: 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20  ==enc2 ){.      
ffa0: 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d  CollSeq *aColl =
ffb0: 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
ffc0: 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
ffd0: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
ffe0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
fff0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20    for(j=0; j<3; 
10000 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 43 6f  j++){.        Co
10010 6c 6c 53 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c  llSeq *p = &aCol
10020 6c 5b 6a 5d 3b 0a 20 20 20 20 20 20 20 20 69 66  l[j];.        if
10030 28 20 70 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d  ( p->enc==pColl-
10040 3e 65 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  >enc ){.        
10050 20 20 69 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b    if( p->xDel ){
10060 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e  .            p->
10070 78 44 65 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a  xDel(p->pUser);.
10080 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10090 20 20 20 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20        p->xCmp = 
100a0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
100b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
100c0 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
100d0 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c  3FindCollSeq(db,
100e0 20 28 75 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65   (u8)enc2, zName
100f0 2c 20 31 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c  , 1);.  if( pCol
10100 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  l==0 ) return SQ
10110 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43  LITE_NOMEM;.  pC
10120 6f 6c 6c 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d  oll->xCmp = xCom
10130 70 61 72 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70  pare;.  pColl->p
10140 55 73 65 72 20 3d 20 70 43 74 78 3b 0a 20 20 70  User = pCtx;.  p
10150 43 6f 6c 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65  Coll->xDel = xDe
10160 6c 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20  l;.  pColl->enc 
10170 3d 20 28 75 38 29 28 65 6e 63 32 20 7c 20 28 65  = (u8)(enc2 | (e
10180 6e 63 20 26 20 53 51 4c 49 54 45 5f 55 54 46 31  nc & SQLITE_UTF1
10190 36 5f 41 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73  6_ALIGNED));.  s
101a0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
101b0 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b 0a 20  SQLITE_OK, 0);. 
101c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
101d0 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  K;.}.../*.** Thi
101e0 73 20 61 72 72 61 79 20 64 65 66 69 6e 65 73 20  s array defines 
101f0 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e 64  hard upper bound
10200 73 20 6f 6e 20 6c 69 6d 69 74 20 76 61 6c 75 65  s on limit value
10210 73 2e 20 20 54 68 65 0a 2a 2a 20 69 6e 69 74 69  s.  The.** initi
10220 61 6c 69 7a 65 72 20 6d 75 73 74 20 62 65 20 6b  alizer must be k
10230 65 70 74 20 69 6e 20 73 79 6e 63 20 77 69 74 68  ept in sync with
10240 20 74 68 65 20 53 51 4c 49 54 45 5f 4c 49 4d 49   the SQLITE_LIMI
10250 54 5f 2a 0a 2a 2a 20 23 64 65 66 69 6e 65 73 20  T_*.** #defines 
10260 69 6e 20 73 71 6c 69 74 65 33 2e 68 2e 0a 2a 2f  in sqlite3.h..*/
10270 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e  .static const in
10280 74 20 61 48 61 72 64 4c 69 6d 69 74 5b 5d 20 3d  t aHardLimit[] =
10290 20 7b 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f   {.  SQLITE_MAX_
102a0 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45  LENGTH,.  SQLITE
102b0 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 2c  _MAX_SQL_LENGTH,
102c0 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  .  SQLITE_MAX_CO
102d0 4c 55 4d 4e 2c 0a 20 20 53 51 4c 49 54 45 5f 4d  LUMN,.  SQLITE_M
102e0 41 58 5f 45 58 50 52 5f 44 45 50 54 48 2c 0a 20  AX_EXPR_DEPTH,. 
102f0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50   SQLITE_MAX_COMP
10300 4f 55 4e 44 5f 53 45 4c 45 43 54 2c 0a 20 20 53  OUND_SELECT,.  S
10310 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f  QLITE_MAX_VDBE_O
10320 50 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  P,.  SQLITE_MAX_
10330 46 55 4e 43 54 49 4f 4e 5f 41 52 47 2c 0a 20 20  FUNCTION_ARG,.  
10340 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
10350 48 45 44 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  HED,.  SQLITE_MA
10360 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
10370 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
10380 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d  MAX_VARIABLE_NUM
10390 42 45 52 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  BER,.  SQLITE_MA
103a0 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 2c  X_TRIGGER_DEPTH,
103b0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20  .};../*.** Make 
103c0 73 75 72 65 20 74 68 65 20 68 61 72 64 20 6c 69  sure the hard li
103d0 6d 69 74 73 20 61 72 65 20 73 65 74 20 74 6f 20  mits are set to 
103e0 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75 65  reasonable value
103f0 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f  s.*/.#if SQLITE_
10400 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a 23  MAX_LENGTH<100.#
10410 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
10420 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62 65  X_LENGTH must be
10430 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23 65   at least 100.#e
10440 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f  ndif.#if SQLITE_
10450 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c 31  MAX_SQL_LENGTH<1
10460 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  00.# error SQLIT
10470 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48  E_MAX_SQL_LENGTH
10480 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
10490 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69 66  t 100.#endif.#if
104a0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
104b0 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d 41  LENGTH>SQLITE_MA
104c0 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f 72  X_LENGTH.# error
104d0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f   SQLITE_MAX_SQL_
104e0 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74 20  LENGTH must not 
104f0 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  be greater than 
10500 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54  SQLITE_MAX_LENGT
10510 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c  H.#endif.#if SQL
10520 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44  ITE_MAX_COMPOUND
10530 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72 6f  _SELECT<2.# erro
10540 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  r SQLITE_MAX_COM
10550 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75 73  POUND_SELECT mus
10560 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 32 0a  t be at least 2.
10570 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
10580 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34 30  E_MAX_VDBE_OP<40
10590 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
105a0 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73 74  MAX_VDBE_OP must
105b0 20 62 65 20 61 74 20 6c 65 61 73 74 20 34 30 0a   be at least 40.
105c0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
105d0 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
105e0 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d  RG<0 || SQLITE_M
105f0 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 3e  AX_FUNCTION_ARG>
10600 31 30 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c  1000.# error SQL
10610 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
10620 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62 65 74  _ARG must be bet
10630 77 65 65 6e 20 30 20 61 6e 64 20 31 30 30 30 0a  ween 0 and 1000.
10640 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
10650 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c 30  E_MAX_ATTACHED<0
10660 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41   || SQLITE_MAX_A
10670 54 54 41 43 48 45 44 3e 36 32 0a 23 20 65 72 72  TTACHED>62.# err
10680 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54  or SQLITE_MAX_AT
10690 54 41 43 48 45 44 20 6d 75 73 74 20 62 65 20 62  TACHED must be b
106a0 65 74 77 65 65 6e 20 30 20 61 6e 64 20 36 32 0a  etween 0 and 62.
106b0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
106c0 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
106d0 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23 20 65 72  RN_LENGTH<1.# er
106e0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c  ror SQLITE_MAX_L
106f0 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
10700 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
10710 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ast 1.#endif.#if
10720 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
10730 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72 72 6f 72  MN>32767.# error
10740 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c 55   SQLITE_MAX_COLU
10750 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65 78 63 65  MN must not exce
10760 65 64 20 33 32 37 36 37 0a 23 65 6e 64 69 66 0a  ed 32767.#endif.
10770 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 54  #if SQLITE_MAX_T
10780 52 49 47 47 45 52 5f 44 45 50 54 48 3c 31 0a 23  RIGGER_DEPTH<1.#
10790 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
107a0 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20  X_TRIGGER_DEPTH 
107b0 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73 74  must be at least
107c0 20 31 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a   1.#endif.../*.*
107d0 2a 20 43 68 61 6e 67 65 20 74 68 65 20 76 61 6c  * Change the val
107e0 75 65 20 6f 66 20 61 20 6c 69 6d 69 74 2e 20 20  ue of a limit.  
107f0 52 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20 76  Report the old v
10800 61 6c 75 65 2e 0a 2a 2a 20 49 66 20 61 6e 20 69  alue..** If an i
10810 6e 76 61 6c 69 64 20 6c 69 6d 69 74 20 69 6e 64  nvalid limit ind
10820 65 78 20 69 73 20 73 75 70 70 6c 69 65 64 2c 20  ex is supplied, 
10830 72 65 70 6f 72 74 20 2d 31 2e 0a 2a 2a 20 4d 61  report -1..** Ma
10840 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 62 75  ke no changes bu
10850 74 20 73 74 69 6c 6c 20 72 65 70 6f 72 74 20 74  t still report t
10860 68 65 20 6f 6c 64 20 76 61 6c 75 65 20 69 66 20  he old value if 
10870 74 68 65 0a 2a 2a 20 6e 65 77 20 6c 69 6d 69 74  the.** new limit
10880 20 69 73 20 6e 65 67 61 74 69 76 65 2e 0a 2a 2a   is negative..**
10890 0a 2a 2a 20 41 20 6e 65 77 20 6c 6f 77 65 72 20  .** A new lower 
108a0 6c 69 6d 69 74 20 64 6f 65 73 20 6e 6f 74 20 73  limit does not s
108b0 68 72 69 6e 6b 20 65 78 69 73 74 69 6e 67 20 63  hrink existing c
108c0 6f 6e 73 74 72 75 63 74 73 2e 0a 2a 2a 20 49 74  onstructs..** It
108d0 20 6d 65 72 65 6c 79 20 70 72 65 76 65 6e 74 73   merely prevents
108e0 20 6e 65 77 20 63 6f 6e 73 74 72 75 63 74 73 20   new constructs 
108f0 74 68 61 74 20 65 78 63 65 65 64 20 74 68 65 20  that exceed the 
10900 6c 69 6d 69 74 0a 2a 2a 20 66 72 6f 6d 20 66 6f  limit.** from fo
10910 72 6d 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rming..*/.int sq
10920 6c 69 74 65 33 5f 6c 69 6d 69 74 28 73 71 6c 69  lite3_limit(sqli
10930 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6c 69 6d  te3 *db, int lim
10940 69 74 49 64 2c 20 69 6e 74 20 6e 65 77 4c 69 6d  itId, int newLim
10950 69 74 29 7b 0a 20 20 69 6e 74 20 6f 6c 64 4c 69  it){.  int oldLi
10960 6d 69 74 3b 0a 0a 0a 20 20 2f 2a 20 45 56 49 44  mit;...  /* EVID
10970 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 30 31 38 39  ENCE-OF: R-30189
10980 2d 35 34 30 39 37 20 46 6f 72 20 65 61 63 68 20  -54097 For each 
10990 6c 69 6d 69 74 20 63 61 74 65 67 6f 72 79 20 53  limit category S
109a0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4e 41 4d 45  QLITE_LIMIT_NAME
109b0 0a 20 20 2a 2a 20 74 68 65 72 65 20 69 73 20 61  .  ** there is a
109c0 20 68 61 72 64 20 75 70 70 65 72 20 62 6f 75 6e   hard upper boun
109d0 64 20 73 65 74 20 61 74 20 63 6f 6d 70 69 6c 65  d set at compile
109e0 2d 74 69 6d 65 20 62 79 20 61 20 43 20 70 72 65  -time by a C pre
109f0 70 72 6f 63 65 73 73 6f 72 0a 20 20 2a 2a 20 6d  processor.  ** m
10a00 61 63 72 6f 20 63 61 6c 6c 65 64 20 53 51 4c 49  acro called SQLI
10a10 54 45 5f 4d 41 58 5f 4e 41 4d 45 2e 20 28 54 68  TE_MAX_NAME. (Th
10a20 65 20 22 5f 4c 49 4d 49 54 5f 22 20 69 6e 20 74  e "_LIMIT_" in t
10a30 68 65 20 6e 61 6d 65 20 69 73 20 63 68 61 6e 67  he name is chang
10a40 65 64 20 74 6f 0a 20 20 2a 2a 20 22 5f 4d 41 58  ed to.  ** "_MAX
10a50 5f 22 2e 29 0a 20 20 2a 2f 0a 20 20 61 73 73 65  _".).  */.  asse
10a60 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
10a70 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47  QLITE_LIMIT_LENG
10a80 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f  TH]==SQLITE_MAX_
10a90 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73 65  LENGTH );.  asse
10aa0 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
10ab0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f  QLITE_LIMIT_SQL_
10ac0 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45 5f  LENGTH]==SQLITE_
10ad0 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 29  MAX_SQL_LENGTH )
10ae0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
10af0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
10b00 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3d 3d 53 51 4c  MIT_COLUMN]==SQL
10b10 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 20 29  ITE_MAX_COLUMN )
10b20 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
10b30 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
10b40 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 5d 3d  MIT_EXPR_DEPTH]=
10b50 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52  =SQLITE_MAX_EXPR
10b60 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73 65  _DEPTH );.  asse
10b70 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53  rt( aHardLimit[S
10b80 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
10b90 4f 55 4e 44 5f 53 45 4c 45 43 54 5d 3d 3d 53 51  OUND_SELECT]==SQ
10ba0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
10bb0 44 5f 53 45 4c 45 43 54 29 3b 0a 20 20 61 73 73  D_SELECT);.  ass
10bc0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
10bd0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42  SQLITE_LIMIT_VDB
10be0 45 5f 4f 50 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  E_OP]==SQLITE_MA
10bf0 58 5f 56 44 42 45 5f 4f 50 20 29 3b 0a 20 20 61  X_VDBE_OP );.  a
10c00 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
10c10 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46  t[SQLITE_LIMIT_F
10c20 55 4e 43 54 49 4f 4e 5f 41 52 47 5d 3d 3d 53 51  UNCTION_ARG]==SQ
10c30 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
10c40 4e 5f 41 52 47 20 29 3b 0a 20 20 61 73 73 65 72  N_ARG );.  asser
10c50 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51  t( aHardLimit[SQ
10c60 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41 43  LITE_LIMIT_ATTAC
10c70 48 45 44 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  HED]==SQLITE_MAX
10c80 5f 41 54 54 41 43 48 45 44 20 29 3b 0a 20 20 61  _ATTACHED );.  a
10c90 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
10ca0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c  t[SQLITE_LIMIT_L
10cb0 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47  IKE_PATTERN_LENG
10cc0 54 48 5d 3d 3d 0a 20 20 20 20 20 20 20 20 20 20  TH]==.          
10cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10cf0 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f       SQLITE_MAX_
10d00 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e  LIKE_PATTERN_LEN
10d10 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
10d20 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
10d30 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
10d40 45 5f 4e 55 4d 42 45 52 5d 3d 3d 53 51 4c 49 54  E_NUMBER]==SQLIT
10d50 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e  E_MAX_VARIABLE_N
10d60 55 4d 42 45 52 29 3b 0a 20 20 61 73 73 65 72 74  UMBER);.  assert
10d70 28 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c  ( aHardLimit[SQL
10d80 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45  ITE_LIMIT_TRIGGE
10d90 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
10da0 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
10db0 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  TH );.  assert( 
10dc0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
10dd0 47 47 45 52 5f 44 45 50 54 48 3d 3d 28 53 51 4c  GGER_DEPTH==(SQL
10de0 49 54 45 5f 4e 5f 4c 49 4d 49 54 2d 31 29 20 29  ITE_N_LIMIT-1) )
10df0 3b 0a 0a 0a 20 20 69 66 28 20 6c 69 6d 69 74 49  ;...  if( limitI
10e00 64 3c 30 20 7c 7c 20 6c 69 6d 69 74 49 64 3e 3d  d<0 || limitId>=
10e10 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49 54 20 29  SQLITE_N_LIMIT )
10e20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b  {.    return -1;
10e30 0a 20 20 7d 0a 20 20 6f 6c 64 4c 69 6d 69 74 20  .  }.  oldLimit 
10e40 3d 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d  = db->aLimit[lim
10e50 69 74 49 64 5d 3b 0a 20 20 69 66 28 20 6e 65 77  itId];.  if( new
10e60 4c 69 6d 69 74 3e 3d 30 20 29 7b 20 20 20 20 20  Limit>=0 ){     
10e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
10e80 20 49 4d 50 3a 20 52 2d 35 32 34 37 36 2d 32 38   IMP: R-52476-28
10e90 37 33 32 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e  732 */.    if( n
10ea0 65 77 4c 69 6d 69 74 3e 61 48 61 72 64 4c 69 6d  ewLimit>aHardLim
10eb0 69 74 5b 6c 69 6d 69 74 49 64 5d 20 29 7b 0a 20  it[limitId] ){. 
10ec0 20 20 20 20 20 6e 65 77 4c 69 6d 69 74 20 3d 20       newLimit = 
10ed0 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74  aHardLimit[limit
10ee0 49 64 5d 3b 20 20 2f 2a 20 49 4d 50 3a 20 52 2d  Id];  /* IMP: R-
10ef0 35 31 34 36 33 2d 32 35 36 33 34 20 2a 2f 0a 20  51463-25634 */. 
10f00 20 20 20 7d 0a 20 20 20 20 64 62 2d 3e 61 4c 69     }.    db->aLi
10f10 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 20 3d 20 6e  mit[limitId] = n
10f20 65 77 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72  ewLimit;.  }.  r
10f30 65 74 75 72 6e 20 6f 6c 64 4c 69 6d 69 74 3b 20  eturn oldLimit; 
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f50 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 33      /* IMP: R-53
10f60 33 34 31 2d 33 35 34 31 39 20 2a 2f 0a 7d 0a 0a  341-35419 */.}..
10f70 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
10f80 69 6f 6e 20 69 73 20 75 73 65 64 20 74 6f 20 70  ion is used to p
10f90 61 72 73 65 20 62 6f 74 68 20 55 52 49 73 20 61  arse both URIs a
10fa0 6e 64 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  nd non-URI filen
10fb0 61 6d 65 73 20 70 61 73 73 65 64 20 62 79 20 74  ames passed by t
10fc0 68 65 0a 2a 2a 20 75 73 65 72 20 74 6f 20 41 50  he.** user to AP
10fd0 49 20 66 75 6e 63 74 69 6f 6e 73 20 73 71 6c 69  I functions sqli
10fe0 74 65 33 5f 6f 70 65 6e 28 29 20 6f 72 20 73 71  te3_open() or sq
10ff0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 2c  lite3_open_v2(),
11000 20 61 6e 64 20 66 6f 72 20 64 61 74 61 62 61 73   and for databas
11010 65 0a 2a 2a 20 55 52 49 73 20 73 70 65 63 69 66  e.** URIs specif
11020 69 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 41  ied as part of A
11030 54 54 41 43 48 20 73 74 61 74 65 6d 65 6e 74 73  TTACH statements
11040 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
11050 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
11060 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 74  is function is t
11070 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 56  he name of the V
11080 46 53 20 74 6f 20 75 73 65 20 28 6f 72 0a 2a 2a  FS to use (or.**
11090 20 61 20 4e 55 4c 4c 20 74 6f 20 73 69 67 6e 69   a NULL to signi
110a0 66 79 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  fy the default V
110b0 46 53 29 20 69 66 20 74 68 65 20 55 52 49 20 64  FS) if the URI d
110c0 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
110d0 61 20 22 76 66 73 3d 78 78 78 22 0a 2a 2a 20 71  a "vfs=xxx".** q
110e0 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 20  uery parameter. 
110f0 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  The second argum
11100 65 6e 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ent contains the
11110 20 55 52 49 20 28 6f 72 20 6e 6f 6e 2d 55 52 49   URI (or non-URI
11120 20 66 69 6c 65 6e 61 6d 65 29 0a 2a 2a 20 69 74   filename).** it
11130 73 65 6c 66 2e 20 57 68 65 6e 20 74 68 69 73 20  self. When this 
11140 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
11150 65 64 20 74 68 65 20 2a 70 46 6c 61 67 73 20 76  ed the *pFlags v
11160 61 72 69 61 62 6c 65 20 73 68 6f 75 6c 64 20 63  ariable should c
11170 6f 6e 74 61 69 6e 0a 2a 2a 20 74 68 65 20 64 65  ontain.** the de
11180 66 61 75 6c 74 20 66 6c 61 67 73 20 74 6f 20 6f  fault flags to o
11190 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
111a0 20 68 61 6e 64 6c 65 20 77 69 74 68 2e 20 54 68   handle with. Th
111b0 65 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20 69  e value stored i
111c0 6e 0a 2a 2a 20 2a 70 46 6c 61 67 73 20 6d 61 79  n.** *pFlags may
111d0 20 62 65 20 75 70 64 61 74 65 64 20 62 65 66 6f   be updated befo
111e0 72 65 20 72 65 74 75 72 6e 69 6e 67 20 69 66 20  re returning if 
111f0 74 68 65 20 55 52 49 20 66 69 6c 65 6e 61 6d 65  the URI filename
11200 20 63 6f 6e 74 61 69 6e 73 20 0a 2a 2a 20 22 63   contains .** "c
11210 61 63 68 65 3d 78 78 78 22 20 6f 72 20 22 6d 6f  ache=xxx" or "mo
11220 64 65 3d 78 78 78 22 20 71 75 65 72 79 20 70 61  de=xxx" query pa
11230 72 61 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20  rameters..**.** 
11240 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
11250 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
11260 72 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rned. In this ca
11270 73 65 20 2a 70 70 56 66 73 20 69 73 20 73 65 74  se *ppVfs is set
11280 20 74 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20   to point to.** 
11290 74 68 65 20 56 46 53 20 74 68 61 74 20 73 68 6f  the VFS that sho
112a0 75 6c 64 20 62 65 20 75 73 65 64 20 74 6f 20 6f  uld be used to o
112b0 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
112c0 20 66 69 6c 65 2e 20 2a 70 7a 46 69 6c 65 20 69   file. *pzFile i
112d0 73 20 73 65 74 20 74 6f 0a 2a 2a 20 70 6f 69 6e  s set to.** poin
112e0 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
112f0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
11300 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  e of the file to
11310 20 6f 70 65 6e 2e 20 49 74 20 69 73 20 74 68 65   open. It is the
11320 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 69 62 69 6c   .** responsibil
11330 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65  ity of the calle
11340 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
11350 63 61 6c 6c 20 73 71 6c 69 74 65 33 5f 66 72 65  call sqlite3_fre
11360 65 28 29 20 74 6f 20 72 65 6c 65 61 73 65 0a 2a  e() to release.*
11370 2a 20 74 68 69 73 20 62 75 66 66 65 72 2e 0a 2a  * this buffer..*
11380 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
11390 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 61 6e   occurs, then an
113a0 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f   SQLite error co
113b0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
113c0 6e 64 20 2a 70 7a 45 72 72 4d 73 67 0a 2a 2a 20  nd *pzErrMsg.** 
113d0 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f  may be set to po
113e0 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
113f0 63 6f 6e 74 61 69 6e 69 6e 67 20 61 6e 20 45 6e  containing an En
11400 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
11410 72 72 6f 72 20 0a 2a 2a 20 6d 65 73 73 61 67 65  rror .** message
11420 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
11430 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
11440 65 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  e caller to even
11450 74 75 61 6c 6c 79 20 72 65 6c 65 61 73 65 0a 2a  tually release.*
11460 2a 20 74 68 69 73 20 62 75 66 66 65 72 20 62 79  * this buffer by
11470 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
11480 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 69 6e 74 20  _free()..*/.int 
11490 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69 28  sqlite3ParseUri(
114a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
114b0 44 65 66 61 75 6c 74 56 66 73 2c 20 20 20 20 20  DefaultVfs,     
114c0 20 20 20 2f 2a 20 56 46 53 20 74 6f 20 75 73 65     /* VFS to use
114d0 20 69 66 20 6e 6f 20 22 76 66 73 3d 78 78 78 22   if no "vfs=xxx"
114e0 20 71 75 65 72 79 20 6f 70 74 69 6f 6e 20 2a 2f   query option */
114f0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
11500 55 72 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  Uri,            
11510 20 20 20 2f 2a 20 4e 75 6c 2d 74 65 72 6d 69 6e     /* Nul-termin
11520 61 74 65 64 20 55 52 49 20 74 6f 20 70 61 72 73  ated URI to pars
11530 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
11540 69 6e 74 20 2a 70 46 6c 61 67 73 2c 20 20 20 20  int *pFlags,    
11550 20 20 20 20 20 20 20 2f 2a 20 49 4e 2f 4f 55 54         /* IN/OUT
11560 3a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 58 58  : SQLITE_OPEN_XX
11570 58 20 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c  X flags */.  sql
11580 69 74 65 33 5f 76 66 73 20 2a 2a 70 70 56 66 73  ite3_vfs **ppVfs
11590 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
115a0 4f 55 54 3a 20 56 46 53 20 74 6f 20 75 73 65 20  OUT: VFS to use 
115b0 2a 2f 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 46  */ .  char **pzF
115c0 69 6c 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ile,            
115d0 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 46 69        /* OUT: Fi
115e0 6c 65 6e 61 6d 65 20 63 6f 6d 70 6f 6e 65 6e 74  lename component
115f0 20 6f 66 20 55 52 49 20 2a 2f 0a 20 20 63 68 61   of URI */.  cha
11600 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20  r **pzErrMsg    
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11620 4f 55 54 3a 20 45 72 72 6f 72 20 6d 65 73 73 61  OUT: Error messa
11630 67 65 20 28 69 66 20 72 63 21 3d 53 51 4c 49 54  ge (if rc!=SQLIT
11640 45 5f 4f 4b 29 20 2a 2f 0a 29 7b 0a 20 20 69 6e  E_OK) */.){.  in
11650 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
11660 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  ;.  unsigned int
11670 20 66 6c 61 67 73 20 3d 20 2a 70 46 6c 61 67 73   flags = *pFlags
11680 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
11690 7a 56 66 73 20 3d 20 7a 44 65 66 61 75 6c 74 56  zVfs = zDefaultV
116a0 66 73 3b 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c  fs;.  char *zFil
116b0 65 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 69  e;.  char c;.  i
116c0 6e 74 20 6e 55 72 69 20 3d 20 73 71 6c 69 74 65  nt nUri = sqlite
116d0 33 53 74 72 6c 65 6e 33 30 28 7a 55 72 69 29 3b  3Strlen30(zUri);
116e0 0a 0a 20 20 61 73 73 65 72 74 28 20 2a 70 7a 45  ..  assert( *pzE
116f0 72 72 4d 73 67 3d 3d 30 20 29 3b 0a 0a 20 20 69  rrMsg==0 );..  i
11700 66 28 20 28 28 66 6c 61 67 73 20 26 20 53 51 4c  f( ((flags & SQL
11710 49 54 45 5f 4f 50 45 4e 5f 55 52 49 29 20 7c 7c  ITE_OPEN_URI) ||
11720 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
11730 6e 66 69 67 2e 62 4f 70 65 6e 55 72 69 29 20 0a  nfig.bOpenUri) .
11740 20 20 20 26 26 20 6e 55 72 69 3e 3d 35 20 26 26     && nUri>=5 &&
11750 20 6d 65 6d 63 6d 70 28 7a 55 72 69 2c 20 22 66   memcmp(zUri, "f
11760 69 6c 65 3a 22 2c 20 35 29 3d 3d 30 20 0a 20 20  ile:", 5)==0 .  
11770 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70  ){.    char *zOp
11780 74 3b 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74  t;.    int eStat
11790 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
117a0 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73       /* Parser s
117b0 74 61 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e  tate when parsin
117c0 67 20 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74  g URI */.    int
117d0 20 69 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20   iIn;           
117e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
117f0 70 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e  put character in
11800 64 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  dex */.    int i
11810 4f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Out = 0;        
11820 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70           /* Outp
11830 75 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64  ut character ind
11840 65 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  ex */.    int nB
11850 79 74 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20  yte = nUri+2;   
11860 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73          /* Bytes
11870 20 6f 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c   of space to all
11880 6f 63 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a  ocate */..    /*
11890 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 53   Make sure the S
118a0 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66  QLITE_OPEN_URI f
118b0 6c 61 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e  lag is set to in
118c0 64 69 63 61 74 65 20 74 6f 20 74 68 65 20 56 46  dicate to the VF
118d0 53 20 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20  S xOpen .    ** 
118e0 6d 65 74 68 6f 64 20 74 68 61 74 20 74 68 65 72  method that ther
118f0 65 20 6d 61 79 20 62 65 20 65 78 74 72 61 20 70  e may be extra p
11900 61 72 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77  arameters follow
11910 69 6e 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d  ing the file-nam
11920 65 2e 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73  e.  */.    flags
11930 20 7c 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   |= SQLITE_OPEN_
11940 55 52 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49  URI;..    for(iI
11950 6e 3d 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69  n=0; iIn<nUri; i
11960 49 6e 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28  In++) nByte += (
11970 7a 55 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b  zUri[iIn]=='&');
11980 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c  .    zFile = sql
11990 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74  ite3_malloc(nByt
119a0 65 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69  e);.    if( !zFi
119b0 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  le ) return SQLI
119c0 54 45 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20 2f  TE_NOMEM;..    /
119d0 2a 20 4d 61 70 70 69 6e 67 73 3a 0a 20 20 20 20  * Mappings:.    
119e0 2a 2a 20 55 52 49 20 20 20 20 20 20 20 20 20 20  ** URI          
119f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a00 20 20 46 49 4c 45 4e 41 4d 45 0a 20 20 20 20 2a    FILENAME.    *
11a10 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  * --------------
11a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
11a30 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
11a40 2d 2d 2d 2d 2d 2d 2d 0a 20 20 20 20 2a 2a 20 66  -------.    ** f
11a50 69 6c 65 3a 61 62 63 2f 78 79 7a 20 20 20 20 20  ile:abc/xyz     
11a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 62                ab
11a70 63 2f 78 79 7a 0a 20 20 20 20 2a 2a 20 66 69 6c  c/xyz.    ** fil
11a80 65 3a 2f 61 62 63 2f 78 79 7a 20 20 20 20 20 20  e:/abc/xyz      
11a90 20 20 20 20 20 20 20 20 20 20 20 20 2f 61 62 63              /abc
11aa0 2f 78 79 7a 0a 20 20 20 20 2a 2a 20 66 69 6c 65  /xyz.    ** file
11ab0 3a 2f 2f 61 62 63 2f 78 79 7a 20 20 20 20 20 20  ://abc/xyz      
11ac0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 61 62 63             //abc
11ad0 2f 78 79 7a 0a 20 20 20 20 2a 2a 20 66 69 6c 65  /xyz.    ** file
11ae0 3a 2f 2f 2f 61 62 63 2f 78 79 7a 20 20 20 20 20  :///abc/xyz     
11af0 20 20 20 20 20 20 20 20 20 20 20 2f 61 62 63 2f             /abc/
11b00 78 79 7a 0a 20 20 20 20 2a 2a 20 66 69 6c 65 3a  xyz.    ** file:
11b10 2f 2f 2f 2f 61 62 63 2f 78 79 7a 20 20 20 20 20  ////abc/xyz     
11b20 20 20 20 20 20 20 20 20 20 20 2f 2f 61 62 63 2f            //abc/
11b30 78 79 7a 0a 20 20 20 20 2a 2a 20 66 69 6c 65 3a  xyz.    ** file:
11b40 2f 2f 2f 2f 2f 61 62 63 2f 78 79 7a 20 20 20 20  /////abc/xyz    
11b50 20 20 20 20 20 20 20 20 20 20 2f 2f 61 62 63 2f            //abc/
11b60 78 79 7a 0a 20 20 20 20 2a 2a 20 66 69 6c 65 3a  xyz.    ** file:
11b70 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 78 79 7a 20  //localhost/xyz 
11b80 20 20 20 20 20 20 20 20 20 20 2f 78 79 7a 0a 20            /xyz. 
11b90 20 20 20 2a 2a 20 66 69 6c 65 3a 2f 2f 2f 63 3a     ** file:///c:
11ba0 2f 61 62 63 2f 78 79 7a 20 20 20 20 20 20 20 20  /abc/xyz        
11bb0 20 20 20 20 20 2f 63 3a 2f 61 62 63 2f 78 79 7a       /c:/abc/xyz
11bc0 20 20 20 20 28 77 69 6e 4f 70 65 6e 28 29 20 72      (winOpen() r
11bd0 65 6d 6f 76 65 73 20 6c 65 61 64 69 6e 67 20 2f  emoves leading /
11be0 29 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 49 6e  ).    */.    iIn
11bf0 20 3d 20 35 3b 0a 20 20 20 20 69 66 28 20 73 74   = 5;.    if( st
11c00 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20 22 2f  rncmp(zUri+5, "/
11c10 2f 2f 22 2c 20 33 29 3d 3d 30 20 29 7b 0a 20 20  //", 3)==0 ){.  
11c20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20      iIn = 7;.   
11c30 20 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77     /* The follow
11c40 69 6e 67 20 63 6f 6e 64 69 74 69 6f 6e 20 63 61  ing condition ca
11c50 75 73 65 73 20 55 52 49 73 20 77 69 74 68 20 66  uses URIs with f
11c60 69 76 65 20 6c 65 61 64 69 6e 67 20 2f 20 63 68  ive leading / ch
11c70 61 72 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a  aracters.      *
11c80 2a 20 6c 69 6b 65 20 66 69 6c 65 3a 2f 2f 2f 2f  * like file:////
11c90 2f 68 6f 73 74 2f 70 61 74 68 20 74 6f 20 62 65  /host/path to be
11ca0 20 63 6f 6e 76 65 72 74 65 64 20 69 6e 74 6f 20   converted into 
11cb0 55 4e 43 73 20 6c 69 6b 65 20 2f 2f 68 6f 73 74  UNCs like //host
11cc0 2f 70 61 74 68 2e 0a 20 20 20 20 20 20 2a 2a 20  /path..      ** 
11cd0 54 68 65 20 63 6f 72 72 65 63 74 20 55 52 49 20  The correct URI 
11ce0 66 6f 72 20 74 68 61 74 20 55 4e 43 20 68 61 73  for that UNC has
11cf0 20 6f 6e 6c 79 20 74 77 6f 20 6f 72 20 66 6f 75   only two or fou
11d00 72 20 6c 65 61 64 69 6e 67 20 2f 20 63 68 61 72  r leading / char
11d10 61 63 74 65 72 73 0a 20 20 20 20 20 20 2a 2a 20  acters.      ** 
11d20 66 69 6c 65 3a 2f 2f 68 6f 73 74 2f 70 61 74 68  file://host/path
11d30 20 6f 72 20 66 69 6c 65 3a 2f 2f 2f 2f 68 6f 73   or file:////hos
11d40 74 2f 70 61 74 68 2e 20 20 42 75 74 20 35 20 6c  t/path.  But 5 l
11d50 65 61 64 69 6e 67 20 73 6c 61 73 68 65 73 20 69  eading slashes i
11d60 73 20 61 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f  s a .      ** co
11d70 6d 6d 6f 6e 20 65 72 72 6f 72 2c 20 77 65 20 61  mmon error, we a
11d80 72 65 20 74 6f 6c 64 2c 20 73 6f 20 77 65 20 68  re told, so we h
11d90 61 6e 64 6c 65 20 69 74 20 61 73 20 61 20 73 70  andle it as a sp
11da0 65 63 69 61 6c 20 63 61 73 65 2e 20 2a 2f 0a 20  ecial case. */. 
11db0 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
11dc0 28 7a 55 72 69 2b 37 2c 20 22 2f 2f 2f 22 2c 20  (zUri+7, "///", 
11dd0 33 29 3d 3d 30 20 29 7b 20 69 49 6e 2b 2b 3b 20  3)==0 ){ iIn++; 
11de0 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  }.    }else if( 
11df0 73 74 72 6e 63 6d 70 28 7a 55 72 69 2b 35 2c 20  strncmp(zUri+5, 
11e00 22 2f 2f 6c 6f 63 61 6c 68 6f 73 74 2f 22 2c 20  "//localhost/", 
11e10 31 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  12)==0 ){.      
11e20 69 49 6e 20 3d 20 31 36 3b 0a 20 20 20 20 7d 0a  iIn = 16;.    }.
11e30 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65  .    /* Copy the
11e40 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 61 6e   filename and an
11e50 79 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  y query paramete
11e60 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46 69 6c  rs into the zFil
11e70 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20 2a  e buffer. .    *
11e80 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65 73 63  * Decode %HH esc
11e90 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e 67 20  ape codes along 
11ea0 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20 2a 2a  the way. .    **
11eb0 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e 20 74  .    ** Within t
11ec0 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69 61 62  his loop, variab
11ed0 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20 62 65  le eState may be
11ee0 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f 72 20   set to 0, 1 or 
11ef0 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20 20  2, depending.   
11f00 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72 73 69   ** on the parsi
11f10 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73 20 66  ng context. As f
11f20 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a 20  ollows:.    **. 
11f30 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72 73 69     **   0: Parsi
11f40 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20 20  ng file-name..  
11f50 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73 69 6e    **   1: Parsin
11f60 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e 20 6f  g name section o
11f70 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20 71  f a name=value q
11f80 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a  uery parameter..
11f90 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61 72 73      **   2: Pars
11fa0 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74 69 6f  ing value sectio
11fb0 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75  n of a name=valu
11fc0 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
11fd0 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65 53  r..    */.    eS
11fe0 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 77 68  tate = 0;.    wh
11ff0 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69  ile( (c = zUri[i
12000 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23  In])!=0 && c!='#
12010 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 2b 2b  ' ){.      iIn++
12020 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
12030 25 27 20 0a 20 20 20 20 20 20 20 26 26 20 73 71  %' .       && sq
12040 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a 55  lite3Isxdigit(zU
12050 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20 20 20  ri[iIn]) .      
12060 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69   && sqlite3Isxdi
12070 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31 5d 29  git(zUri[iIn+1])
12080 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20   .      ){.     
12090 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d 20 28     int octet = (
120a0 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74 28  sqlite3HexToInt(
120b0 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c 20  zUri[iIn++]) << 
120c0 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63 74 65  4);.        octe
120d0 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65 78 54  t += sqlite3HexT
120e0 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d  oInt(zUri[iIn++]
120f0 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65  );..        asse
12100 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26 26 20  rt( octet>=0 && 
12110 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20 20 20  octet<256 );.   
12120 20 20 20 20 20 69 66 28 20 6f 63 74 65 74 3d 3d       if( octet==
12130 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  0 ){.          /
12140 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69 73  * This branch is
12150 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25 30 30   taken when "%00
12160 22 20 61 70 70 65 61 72 73 20 77 69 74 68 69 6e  " appears within
12170 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74 68 69   the URI. In thi
12180 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63  s.          ** c
12190 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20 61 6c  ase we ignore al
121a0 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20 72 65  l text in the re
121b0 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 70  mainder of the p
121c0 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20 20 20  ath, name or.   
121d0 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20         ** value 
121e0 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67 20  currently being 
121f0 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e 6f 72  parsed. So ignor
12200 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
12210 61 72 61 63 74 65 72 0a 20 20 20 20 20 20 20 20  aracter.        
12220 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20 74 6f    ** and skip to
12230 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c 20 22   the next "?", "
12240 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20 61 70  =" or "&", as ap
12250 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a 20 20  propriate. */.  
12260 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28          while( (
12270 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21 3d  c = zUri[iIn])!=
12280 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20 20 20  0 && c!='#' .   
12290 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65             && (e
122a0 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21 3d 27  State!=0 || c!='
122b0 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20 20 20  ?').            
122c0 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 31 20    && (eState!=1 
122d0 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20 63 21  || (c!='=' && c!
122e0 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20 20 20  ='&')).         
122f0 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65 21       && (eState!
12300 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a 20 20  =2 || c!='&').  
12310 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
12320 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20 20         iIn++;.  
12330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12340 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
12350 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12360 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20 20  c = octet;.     
12370 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61 74   }else if( eStat
12380 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26 27 20  e==1 && (c=='&' 
12390 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20 20  || c=='=') ){.  
123a0 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b        if( zFile[
123b0 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20  iOut-1]==0 ){.  
123c0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 6d          /* An em
123d0 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2e  pty option name.
123e0 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f 70 74   Ignore this opt
123f0 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e 20  ion altogether. 
12400 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
12410 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26 26  le( zUri[iIn] &&
12420 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27 20   zUri[iIn]!='#' 
12430 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21 3d  && zUri[iIn-1]!=
12440 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20 20  '&' ) iIn++;.   
12450 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
12460 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12470 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20 29 7b     if( c=='&' ){
12480 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c 65  .          zFile
12490 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b  [iOut++] = '\0';
124a0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
124b0 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74 65            eState
124c0 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 2;.        }.
124d0 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a 20          c = 0;. 
124e0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28       }else if( (
124f0 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63 3d 3d  eState==0 && c==
12500 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74 65 3d  '?') || (eState=
12510 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20 29 7b  =2 && c=='&') ){
12520 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a  .        c = 0;.
12530 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20 3d          eState =
12540 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
12550 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20    zFile[iOut++] 
12560 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = c;.    }.    i
12570 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29 20 7a  f( eState==1 ) z
12580 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27  File[iOut++] = '
12590 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69  \0';.    zFile[i
125a0 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 20  Out++] = '\0';. 
125b0 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
125c0 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a   = '\0';..    /*
125d0 20 43 68 65 63 6b 20 69 66 20 74 68 65 72 65 20   Check if there 
125e0 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e 73  were any options
125f0 20 73 70 65 63 69 66 69 65 64 20 74 68 61 74 20   specified that 
12600 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65 72 70  should be interp
12610 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20 68 65  reted .    ** he
12620 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61 74  re. Options that
12630 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65 64   are interpreted
12640 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20 22 76   here include "v
12650 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20 74 68  fs" and those th
12660 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65 73  at.    ** corres
12670 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20 74 68  pond to flags th
12680 61 74 20 6d 61 79 20 62 65 20 70 61 73 73 65 64  at may be passed
12690 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33 5f   to the sqlite3_
126a0 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a 2a  open_v2().    **
126b0 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20 20   method. */.    
126c0 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73 71  zOpt = &zFile[sq
126d0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46  lite3Strlen30(zF
126e0 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68 69  ile)+1];.    whi
126f0 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a 20  le( zOpt[0] ){. 
12700 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d 20       int nOpt = 
12710 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12720 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63 68 61  zOpt);.      cha
12730 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74 5b  r *zVal = &zOpt[
12740 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20 69  nOpt+1];.      i
12750 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74 65  nt nVal = sqlite
12760 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29 3b  3Strlen30(zVal);
12770 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74  ..      if( nOpt
12780 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 22 76  ==3 && memcmp("v
12790 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d 30  fs", zOpt, 3)==0
127a0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56 66 73   ){.        zVfs
127b0 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20 7d   = zVal;.      }
127c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
127d0 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b 0a  ruct OpenMode {.
127e0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
127f0 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20 20  char *z;.       
12800 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20 20     int mode;.   
12810 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d 20       } *aMode = 
12820 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  0;.        char 
12830 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b 0a  *zModeType = 0;.
12840 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73 6b          int mask
12850 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e   = 0;.        in
12860 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20 20  t limit = 0;..  
12870 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d 3d        if( nOpt==
12880 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63 61 63  5 && memcmp("cac
12890 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d 30  he", zOpt, 5)==0
128a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
128b0 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65 6e  atic struct Open
128c0 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64 65 5b  Mode aCacheMode[
128d0 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
128e0 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20 20 53    { "shared",  S
128f0 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45  QLITE_OPEN_SHARE
12900 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20 20  DCACHE },.      
12910 20 20 20 20 20 20 7b 20 22 70 72 69 76 61 74 65        { "private
12920 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50  ", SQLITE_OPEN_P
12930 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a 20  RIVATECACHE },. 
12940 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c 20             { 0, 
12950 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 3b  0 }.          };
12960 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73 6b  ..          mask
12970 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53   = SQLITE_OPEN_S
12980 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c 49 54  HAREDCACHE|SQLIT
12990 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
129a0 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20 20 61  CHE;.          a
129b0 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d 6f 64  Mode = aCacheMod
129c0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d  e;.          lim
129d0 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20 20  it = mask;.     
129e0 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d       zModeType =
129f0 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20 20 20   "cache";.      
12a00 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
12a10 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63 6d  nOpt==4 && memcm
12a20 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c 20  p("mode", zOpt, 
12a30 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)==0 ){.       
12a40 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
12a50 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e 4d   OpenMode aOpenM
12a60 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ode[] = {.      
12a70 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20 20 53        { "ro",  S
12a80 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
12a90 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  NLY },.         
12aa0 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51 4c 49     { "rw",  SQLI
12ab0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
12ac0 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 20 20  E }, .          
12ad0 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c 49 54    { "rwc", SQLIT
12ae0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
12af0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
12b00 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20 20  REATE },.       
12b10 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79 22 2c       { "memory",
12b20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d   SQLITE_OPEN_MEM
12b30 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20 20 20  ORY },.         
12b40 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20     { 0, 0 }.    
12b50 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20        };..      
12b60 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54      mask = SQLIT
12b70 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
12b80 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  | SQLITE_OPEN_RE
12b90 41 44 57 52 49 54 45 0a 20 20 20 20 20 20 20 20  ADWRITE.        
12ba0 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c             | SQL
12bb0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
12bc0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  | SQLITE_OPEN_ME
12bd0 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20 20 20  MORY;.          
12be0 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f 64  aMode = aOpenMod
12bf0 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69 6d  e;.          lim
12c00 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61 67  it = mask & flag
12c10 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d 6f  s;.          zMo
12c20 64 65 54 79 70 65 20 3d 20 22 61 63 63 65 73 73  deType = "access
12c30 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  ";.        }..  
12c40 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65 20        if( aMode 
12c50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
12c60 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   i;.          in
12c70 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20 20  t mode = 0;.    
12c80 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 61        for(i=0; a
12c90 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29 7b  Mode[i].z; i++){
12ca0 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
12cb0 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d 6f  st char *z = aMo
12cc0 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20 20  de[i].z;.       
12cd0 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d 73       if( nVal==s
12ce0 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12cf0 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 7a  ) && 0==memcmp(z
12d00 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29 7b  Val, z, nVal) ){
12d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d  .              m
12d20 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e 6d  ode = aMode[i].m
12d30 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ode;.           
12d40 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
12d50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12d60 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
12d70 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20 20  ( mode==0 ){.   
12d80 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d           *pzErrM
12d90 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
12da0 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25 73  intf("no such %s
12db0 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f 64   mode: %s", zMod
12dc0 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20  eType, zVal);.  
12dd0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
12de0 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
12df0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
12e00 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
12e10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12e20 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26 20 7e     if( (mode & ~
12e30 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d 4f  SQLITE_OPEN_MEMO
12e40 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20 20  RY)>limit ){.   
12e50 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72 4d           *pzErrM
12e60 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  sg = sqlite3_mpr
12e70 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20 6e 6f  intf("%s mode no
12e80 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c 0a  t allowed: %s",.
12e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12eb0 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70          zModeTyp
12ec0 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20 20  e, zVal);.      
12ed0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
12ee0 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 20 20  E_PERM;.        
12ef0 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f 75      goto parse_u
12f00 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  ri_out;.        
12f10 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66 6c    }.          fl
12f20 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26 20 7e  ags = (flags & ~
12f30 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20 20  mask) | mode;.  
12f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
12f50 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a  .      zOpt = &z
12f60 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20 20  Val[nVal+1];.   
12f70 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   }..  }else{.   
12f80 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33   zFile = sqlite3
12f90 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b 32 29 3b  _malloc(nUri+2);
12fa0 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65 20  .    if( !zFile 
12fb0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
12fc0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 63 70  NOMEM;.    memcp
12fd0 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20 6e  y(zFile, zUri, n
12fe0 55 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  Uri);.    zFile[
12ff0 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  nUri] = '\0';.  
13000 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d 20    zFile[nUri+1] 
13010 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61 67  = '\0';.    flag
13020 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45  s &= ~SQLITE_OPE
13030 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a 70  N_URI;.  }..  *p
13040 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
13050 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a 20  fs_find(zVfs);. 
13060 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30 20 29   if( *ppVfs==0 )
13070 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20  {.    *pzErrMsg 
13080 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
13090 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73 3a 20  f("no such vfs: 
130a0 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20 20  %s", zVfs);.    
130b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
130c0 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75 72  R;.  }. parse_ur
130d0 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63 21  i_out:.  if( rc!
130e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
130f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13100 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c 65  File);.    zFile
13110 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46 6c   = 0;.  }.  *pFl
13120 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 2a  ags = flags;.  *
13130 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a  pzFile = zFile;.
13140 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
13150 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
13160 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f 72  ine does the wor
13170 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20 64  k of opening a d
13180 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61 6c  atabase on behal
13190 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33 5f  f of.** sqlite3_
131a0 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69 74  open() and sqlit
131b0 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68 65  e3_open16(). The
131c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61   database filena
131d0 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20 20  me "zFilename"  
131e0 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e 63  .** is UTF-8 enc
131f0 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  oded..*/.static 
13200 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73 65  int openDatabase
13210 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
13220 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44 61  zFilename, /* Da
13230 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20  tabase filename 
13240 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a 2f  UTF-8 encoded */
13250 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70 44  .  sqlite3 **ppD
13260 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  b,        /* OUT
13270 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74 61 62  : Returned datab
13280 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ase handle */.  
13290 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61  unsigned int fla
132a0 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61 74  gs,    /* Operat
132b0 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a 20  ional flags */. 
132c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66   const char *zVf
132d0 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  s       /* Name 
132e0 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75 73  of the VFS to us
132f0 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  e */.){.  sqlite
13300 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20  3 *db;          
13310 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 6f            /* Sto
13320 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61 6e  re allocated han
13330 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  dle here */.  in
13340 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
13350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13360 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
13370 20 20 69 6e 74 20 69 73 54 68 72 65 61 64 73 61    int isThreadsa
13380 66 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  fe;             
13390 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74 68    /* True for th
133a0 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63 74  readsafe connect
133b0 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ions */.  char *
133c0 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20 20  zOpen = 0;      
133d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
133e0 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20 74  ename argument t
133f0 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65 65 4f  o pass to BtreeO
13400 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72 20  pen() */.  char 
13410 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20 20  *zErrMsg = 0;   
13420 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 72             /* Er
13430 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f 6d  ror message from
13440 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72 69   sqlite3ParseUri
13450 28 29 20 2a 2f 0a 0a 20 20 2a 70 70 44 62 20 3d  () */..  *ppDb =
13460 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
13470 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54  TE_OMIT_AUTOINIT
13480 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
13490 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
134a0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
134b0 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  rc;.#endif..  /*
134c0 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e 73   Only allow sens
134d0 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  ible combination
134e0 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65  s of bits in the
134f0 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74 2e   flags argument.
13500 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61 6e    .  ** Throw an
13510 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e 6f   error if any no
13520 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61 74  n-sense combinat
13530 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49 66  ion is used.  If
13540 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74 20   we.  ** do not 
13550 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63 6f  block illegal co
13560 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65 2c  mbinations here,
13570 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67 65   it could trigge
13580 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20  r.  ** assert() 
13590 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64 65  statements in de
135a0 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53 65  eper layers.  Se
135b0 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69  nsible combinati
135c0 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20 20  ons.  ** are:.  
135d0 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51 4c  **.  **  1:  SQL
135e0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
135f0 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c 49  Y.  **  2:  SQLI
13600 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
13610 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c 49  E.  **  6:  SQLI
13620 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
13630 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
13640 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61 73  CREATE.  */.  as
13650 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
13660 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20 30  N_READONLY  == 0
13670 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  x01 );.  assert(
13680 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
13690 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20 29  DWRITE == 0x02 )
136a0 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49  ;.  assert( SQLI
136b0 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 20  TE_OPEN_CREATE  
136c0 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20 74    == 0x04 );.  t
136d0 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66 6c  estcase( (1<<(fl
136e0 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29 3b  ags&7))==0x02 );
136f0 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f 0a   /* READONLY */.
13700 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c    testcase( (1<<
13710 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 34  (flags&7))==0x04
13720 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54 45   ); /* READWRITE
13730 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28 20   */.  testcase( 
13740 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d  (1<<(flags&7))==
13750 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44 57  0x40 ); /* READW
13760 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a 2f  RITE | CREATE */
13770 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c 61  .  if( ((1<<(fla
13780 67 73 26 37 29 29 20 26 20 30 78 34 36 29 3d 3d  gs&7)) & 0x46)==
13790 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
137a0 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 0a  E_MISUSE_BKPT;..
137b0 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
137c0 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65 4d  balConfig.bCoreM
137d0 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 69  utex==0 ){.    i
137e0 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30 3b  sThreadsafe = 0;
137f0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c 61  .  }else if( fla
13800 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs & SQLITE_OPEN
13810 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20 20  _NOMUTEX ){.    
13820 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30  isThreadsafe = 0
13830 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
13840 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
13850 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a 20  N_FULLMUTEX ){. 
13860 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
13870 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
13880 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d    isThreadsafe =
13890 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
138a0 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3b  nfig.bFullMutex;
138b0 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67 73  .  }.  if( flags
138c0 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50   & SQLITE_OPEN_P
138d0 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a 20  RIVATECACHE ){. 
138e0 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c     flags &= ~SQL
138f0 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
13900 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ACHE;.  }else if
13910 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
13920 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63 68  onfig.sharedCach
13930 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20 20  eEnabled ){.    
13940 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45 5f  flags |= SQLITE_
13950 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45  OPEN_SHAREDCACHE
13960 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d 6f  ;.  }..  /* Remo
13970 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73 20  ve harmful bits 
13980 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20 70  from the flags p
13990 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20 20  arameter.  **.  
139a0 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f 50  ** The SQLITE_OP
139b0 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20 53  EN_NOMUTEX and S
139c0 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d  QLITE_OPEN_FULLM
139d0 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65 0a  UTEX flags were.
139e0 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68 20    ** dealt with 
139f0 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  in the previous 
13a00 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65 73  code block.  Bes
13a10 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65 20  ides these, the 
13a20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64 20  only.  ** valid 
13a30 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72 20  input flags for 
13a40 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28  sqlite3_open_v2(
13a50 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50 45  ) are SQLITE_OPE
13a60 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a 2a  N_READONLY,.  **
13a70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
13a80 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f 4f  DWRITE, SQLITE_O
13a90 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c 49  PEN_CREATE, SQLI
13aa0 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41  TE_OPEN_SHAREDCA
13ab0 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45  CHE,.  ** SQLITE
13ac0 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43  _OPEN_PRIVATECAC
13ad0 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65 73  HE, and some res
13ae0 65 72 76 65 64 20 62 69 74 73 2e 20 20 53 69 6c  erved bits.  Sil
13af0 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a 20  ently mask.  ** 
13b00 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66 6c  off all other fl
13b10 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61 67  ags..  */.  flag
13b20 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45 5f  s &=  ~( SQLITE_
13b30 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f  OPEN_DELETEONCLO
13b40 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  SE |.           
13b50 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
13b60 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20 20  EXCLUSIVE |.    
13b70 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
13b80 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 7c  E_OPEN_MAIN_DB |
13b90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13ba0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50  SQLITE_OPEN_TEMP
13bb0 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20 20  _DB | .         
13bc0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
13bd0 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20 7c  N_TRANSIENT_DB |
13be0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
13bf0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
13c00 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20 20  N_JOURNAL | .   
13c10 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
13c20 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55  TE_OPEN_TEMP_JOU
13c30 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20 20  RNAL | .        
13c40 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
13c50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c 20  EN_SUBJOURNAL | 
13c60 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13c70 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
13c80 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20 20  ER_JOURNAL |.   
13c90 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
13ca0 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58 20  TE_OPEN_NOMUTEX 
13cb0 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
13cc0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c   SQLITE_OPEN_FUL
13cd0 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20 20  LMUTEX |.       
13ce0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
13cf0 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20 20  PEN_WAL.        
13d00 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41 6c       );..  /* Al
13d10 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69 74  locate the sqlit
13d20 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  e data structure
13d30 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69 74   */.  db = sqlit
13d40 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73 69  e3MallocZero( si
13d50 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29 3b  zeof(sqlite3) );
13d60 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20 67  .  if( db==0 ) g
13d70 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
13d80 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73 61    if( isThreadsa
13d90 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d 75  fe ){.    db->mu
13da0 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75 74  tex = sqlite3Mut
13db0 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  exAlloc(SQLITE_M
13dc0 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29 3b  UTEX_RECURSIVE);
13dd0 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75 74  .    if( db->mut
13de0 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ex==0 ){.      s
13df0 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29 3b  qlite3_free(db);
13e00 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a 20  .      db = 0;. 
13e10 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62       goto opendb
13e20 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  _out;.    }.  }.
13e30 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
13e40 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
13e50 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20  ;.  db->errMask 
13e60 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e 44  = 0xff;.  db->nD
13e70 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61 67  b = 2;.  db->mag
13e80 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
13e90 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61 44  C_BUSY;.  db->aD
13ea0 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74 69  b = db->aDbStati
13eb0 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73 69  c;..  assert( si
13ec0 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74 29  zeof(db->aLimit)
13ed0 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c 69  ==sizeof(aHardLi
13ee0 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70 79  mit) );.  memcpy
13ef0 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48 61  (db->aLimit, aHa
13f00 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66 28  rdLimit, sizeof(
13f10 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20 20  db->aLimit));.  
13f20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 20 3d  db->autoCommit =
13f30 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 41 75   1;.  db->nextAu
13f40 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20 20 64 62  tovac = -1;.  db
13f50 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71 6c 69 74  ->szMmap = sqlit
13f60 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
13f70 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e 6e 65 78  zMmap;.  db->nex
13f80 74 50 61 67 65 73 69 7a 65 20 3d 20 30 3b 0a 20  tPagesize = 0;. 
13f90 20 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51   db->flags |= SQ
13fa0 4c 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d  LITE_ShortColNam
13fb0 65 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62  es | SQLITE_Enab
13fc0 6c 65 54 72 69 67 67 65 72 0a 23 69 66 20 21 64  leTrigger.#if !d
13fd0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
13fe0 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f  FAULT_AUTOMATIC_
13ff0 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c 49 54 45  INDEX) || SQLITE
14000 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54  _DEFAULT_AUTOMAT
14010 49 43 5f 49 4e 44 45 58 0a 20 20 20 20 20 20 20  IC_INDEX.       
14020 20 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49            | SQLI
14030 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a 23 65 6e  TE_AutoIndex.#en
14040 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 44  dif.#if SQLITE_D
14050 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46 4f 52 4d  EFAULT_FILE_FORM
14060 41 54 3c 34 0a 20 20 20 20 20 20 20 20 20 20 20  AT<4.           
14070 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c        | SQLITE_L
14080 65 67 61 63 79 46 69 6c 65 46 6d 74 0a 23 65 6e  egacyFileFmt.#en
14090 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
140a0 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44 5f 45 58  E_ENABLE_LOAD_EX
140b0 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20 20 20 20  TENSION.        
140c0 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
140d0 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 0a  E_LoadExtension.
140e0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
140f0 45 5f 44 45 46 41 55 4c 54 5f 52 45 43 55 52 53  E_DEFAULT_RECURS
14100 49 56 45 5f 54 52 49 47 47 45 52 53 0a 20 20 20  IVE_TRIGGERS.   
14110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
14120 53 51 4c 49 54 45 5f 52 65 63 54 72 69 67 67 65  SQLITE_RecTrigge
14130 72 73 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  rs.#endif.#if de
14140 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 46  fined(SQLITE_DEF
14150 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  AULT_FOREIGN_KEY
14160 53 29 20 26 26 20 53 51 4c 49 54 45 5f 44 45 46  S) && SQLITE_DEF
14170 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f 4b 45 59  AULT_FOREIGN_KEY
14180 53 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S.              
14190 20 20 20 7c 20 53 51 4c 49 54 45 5f 46 6f 72 65     | SQLITE_Fore
141a0 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69 66 0a 20  ignKeys.#endif. 
141b0 20 20 20 20 20 3b 0a 20 20 73 71 6c 69 74 65 33       ;.  sqlite3
141c0 48 61 73 68 49 6e 69 74 28 26 64 62 2d 3e 61 43  HashInit(&db->aC
141d0 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e 64 65 66  ollSeq);.#ifndef
141e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
141f0 54 55 41 4c 54 41 42 4c 45 0a 20 20 73 71 6c 69  TUALTABLE.  sqli
14200 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
14210 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69  >aModule);.#endi
14220 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74 68 65 20  f..  /* Add the 
14230 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
14240 6e 20 73 65 71 75 65 6e 63 65 20 42 49 4e 41 52  n sequence BINAR
14250 59 2e 20 42 49 4e 41 52 59 20 77 6f 72 6b 73 20  Y. BINARY works 
14260 66 6f 72 20 62 6f 74 68 20 55 54 46 2d 38 0a 20  for both UTF-8. 
14270 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31 36 2c 20   ** and UTF-16, 
14280 73 6f 20 61 64 64 20 61 20 76 65 72 73 69 6f 6e  so add a version
14290 20 66 6f 72 20 65 61 63 68 20 74 6f 20 61 76 6f   for each to avo
142a0 69 64 20 61 6e 79 20 75 6e 6e 65 63 65 73 73 61  id any unnecessa
142b0 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65 72 73 69  ry.  ** conversi
142c0 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79 20 65 72  ons. The only er
142d0 72 6f 72 20 74 68 61 74 20 63 61 6e 20 6f 63 63  ror that can occ
142e0 75 72 20 68 65 72 65 20 69 73 20 61 20 6d 61 6c  ur here is a mal
142f0 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 2e 0a 20  loc() failure.. 
14300 20 2a 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c   */.  createColl
14310 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52  ation(db, "BINAR
14320 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c  Y", SQLITE_UTF8,
14330 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c   0, binCollFunc,
14340 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c   0);.  createCol
14350 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41  lation(db, "BINA
14360 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31  RY", SQLITE_UTF1
14370 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46  6BE, 0, binCollF
14380 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74  unc, 0);.  creat
14390 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22  eCollation(db, "
143a0 42 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f  BINARY", SQLITE_
143b0 55 54 46 31 36 4c 45 2c 20 30 2c 20 62 69 6e 43  UTF16LE, 0, binC
143c0 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63  ollFunc, 0);.  c
143d0 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64  reateCollation(d
143e0 62 2c 20 22 52 54 52 49 4d 22 2c 20 53 51 4c 49  b, "RTRIM", SQLI
143f0 54 45 5f 55 54 46 38 2c 20 28 76 6f 69 64 2a 29  TE_UTF8, (void*)
14400 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20  1, binCollFunc, 
14410 30 29 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61  0);.  if( db->ma
14420 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
14430 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75    goto opendb_ou
14440 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e 70 44 66  t;.  }.  db->pDf
14450 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33  ltColl = sqlite3
14460 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20  FindCollSeq(db, 
14470 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 22 42 49  SQLITE_UTF8, "BI
14480 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20 61 73 73  NARY", 0);.  ass
14490 65 72 74 28 20 64 62 2d 3e 70 44 66 6c 74 43 6f  ert( db->pDfltCo
144a0 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 41  ll!=0 );..  /* A
144b0 6c 73 6f 20 61 64 64 20 61 20 55 54 46 2d 38 20  lso add a UTF-8 
144c0 63 61 73 65 2d 69 6e 73 65 6e 73 69 74 69 76 65  case-insensitive
144d0 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
144e0 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65 61 74 65  nce. */.  create
144f0 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 4e  Collation(db, "N
14500 4f 43 41 53 45 22 2c 20 53 51 4c 49 54 45 5f 55  OCASE", SQLITE_U
14510 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73 65 43 6f  TF8, 0, nocaseCo
14520 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20 30 29 3b  llatingFunc, 0);
14530 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
14540 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49 20 61 72   filename/URI ar
14550 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20 64 62 2d  gument. */.  db-
14560 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20 66 6c 61  >openFlags = fla
14570 67 73 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  gs;.  rc = sqlit
14580 65 33 50 61 72 73 65 55 72 69 28 7a 56 66 73 2c  e3ParseUri(zVfs,
14590 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26 66 6c 61   zFilename, &fla
145a0 67 73 2c 20 26 64 62 2d 3e 70 56 66 73 2c 20 26  gs, &db->pVfs, &
145b0 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d 73 67 29  zOpen, &zErrMsg)
145c0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
145d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
145e0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc==SQLITE_NOME
145f0 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  M ) db->mallocFa
14600 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71  iled = 1;.    sq
14610 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72  lite3Error(db, r
14620 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25 73  c, zErrMsg ? "%s
14630 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29 3b  " : 0, zErrMsg);
14640 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
14650 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
14660 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
14670 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20  .  }..  /* Open 
14680 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74 61  the backend data
14690 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a 20  base driver */. 
146a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74 72   rc = sqlite3Btr
146b0 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73 2c  eeOpen(db->pVfs,
146c0 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62 2d   zOpen, db, &db-
146d0 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 0a  >aDb[0].pBt, 0,.
146e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
146f0 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c 20          flags | 
14700 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
14710 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  _DB);.  if( rc!=
14720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14730 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
14740 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a 20  IOERR_NOMEM ){. 
14750 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14760 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20  _NOMEM;.    }.  
14770 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
14780 62 2c 20 72 63 2c 20 30 29 3b 0a 20 20 20 20 67  b, rc, 0);.    g
14790 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a  oto opendb_out;.
147a0 20 20 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d    }.  db->aDb[0]
147b0 2e 70 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74  .pSchema = sqlit
147c0 65 33 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20  e3SchemaGet(db, 
147d0 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b  db->aDb[0].pBt);
147e0 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  .  db->aDb[1].pS
147f0 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53  chema = sqlite3S
14800 63 68 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b  chemaGet(db, 0);
14810 0a 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 66 61  ...  /* The defa
14820 75 6c 74 20 73 61 66 65 74 79 5f 6c 65 76 65 6c  ult safety_level
14830 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61   for the main da
14840 74 61 62 61 73 65 20 69 73 20 27 66 75 6c 6c 27  tabase is 'full'
14850 3b 20 66 6f 72 20 74 68 65 20 74 65 6d 70 0a 20  ; for the temp. 
14860 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 74 20   ** database it 
14870 69 73 20 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20  is 'NONE'. This 
14880 6d 61 74 63 68 65 73 20 74 68 65 20 70 61 67 65  matches the page
14890 72 20 6c 61 79 65 72 20 64 65 66 61 75 6c 74 73  r layer defaults
148a0 2e 20 20 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61  .  .  */.  db->a
148b0 44 62 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d  Db[0].zName = "m
148c0 61 69 6e 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b  ain";.  db->aDb[
148d0 30 5d 2e 73 61 66 65 74 79 5f 6c 65 76 65 6c 20  0].safety_level 
148e0 3d 20 33 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31  = 3;.  db->aDb[1
148f0 5d 2e 7a 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22  ].zName = "temp"
14900 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73  ;.  db->aDb[1].s
14910 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b  afety_level = 1;
14920 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20  ..  db->magic = 
14930 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45  SQLITE_MAGIC_OPE
14940 4e 3b 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  N;.  if( db->mal
14950 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
14960 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
14970 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69  ;.  }..  /* Regi
14980 73 74 65 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69  ster all built-i
14990 6e 20 66 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74  n functions, but
149a0 20 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20   do not attempt 
149b0 74 6f 20 72 65 61 64 20 74 68 65 0a 20 20 2a 2a  to read the.  **
149c0 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61   database schema
149d0 20 79 65 74 2e 20 54 68 69 73 20 69 73 20 64 65   yet. This is de
149e0 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20  layed until the 
149f0 66 69 72 73 74 20 74 69 6d 65 20 74 68 65 20 64  first time the d
14a00 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 69 73 20  atabase.  ** is 
14a10 61 63 63 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20  accessed..  */. 
14a20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62   sqlite3Error(db
14a30 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 30 29 3b  , SQLITE_OK, 0);
14a40 0a 20 20 73 71 6c 69 74 65 33 52 65 67 69 73 74  .  sqlite3Regist
14a50 65 72 42 75 69 6c 74 69 6e 46 75 6e 63 74 69 6f  erBuiltinFunctio
14a60 6e 73 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 4c 6f  ns(db);..  /* Lo
14a70 61 64 20 61 75 74 6f 6d 61 74 69 63 20 65 78 74  ad automatic ext
14a80 65 6e 73 69 6f 6e 73 20 2d 20 65 78 74 65 6e 73  ensions - extens
14a90 69 6f 6e 73 20 74 68 61 74 20 68 61 76 65 20 62  ions that have b
14aa0 65 65 6e 20 72 65 67 69 73 74 65 72 65 64 0a 20  een registered. 
14ab0 20 2a 2a 20 75 73 69 6e 67 20 74 68 65 20 73 71   ** using the sq
14ac0 6c 69 74 65 33 5f 61 75 74 6f 6d 61 74 69 63 5f  lite3_automatic_
14ad0 65 78 74 65 6e 73 69 6f 6e 28 29 20 41 50 49 2e  extension() API.
14ae0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
14af0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
14b00 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
14b10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
14b20 69 74 65 33 41 75 74 6f 4c 6f 61 64 45 78 74 65  ite3AutoLoadExte
14b30 6e 73 69 6f 6e 73 28 64 62 29 3b 0a 20 20 20 20  nsions(db);.    
14b40 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72  rc = sqlite3_err
14b50 63 6f 64 65 28 64 62 29 3b 0a 20 20 20 20 69 66  code(db);.    if
14b60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14b70 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6f 70  ){.      goto op
14b80 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  endb_out;.    }.
14b90 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49    }..#ifdef SQLI
14ba0 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53 31 0a 20  TE_ENABLE_FTS1. 
14bb0 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63   if( !db->malloc
14bc0 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 65 78  Failed ){.    ex
14bd0 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
14be0 46 74 73 31 49 6e 69 74 28 73 71 6c 69 74 65 33  Fts1Init(sqlite3
14bf0 2a 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  *);.    rc = sql
14c00 69 74 65 33 46 74 73 31 49 6e 69 74 28 64 62 29  ite3Fts1Init(db)
14c10 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  ;.  }.#endif..#i
14c20 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
14c30 4c 45 5f 46 54 53 32 0a 20 20 69 66 28 20 21 64  LE_FTS2.  if( !d
14c40 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
14c50 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
14c60 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
14c70 6e 74 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e  nt sqlite3Fts2In
14c80 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
14c90 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
14ca0 73 32 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s2Init(db);.  }.
14cb0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
14cc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
14cd0 33 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  3.  if( !db->mal
14ce0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
14cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14d00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
14d10 73 33 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s3Init(db);.  }.
14d20 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
14d30 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 43 55  QLITE_ENABLE_ICU
14d40 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
14d50 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
14d60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14d70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 49 63 75   rc = sqlite3Icu
14d80 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23 65  Init(db);.  }.#e
14d90 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
14da0 49 54 45 5f 45 4e 41 42 4c 45 5f 52 54 52 45 45  ITE_ENABLE_RTREE
14db0 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c  .  if( !db->mall
14dc0 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d 3d  ocFailed && rc==
14dd0 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a 20 20 20 20  SQLITE_OK){.    
14de0 72 63 20 3d 20 73 71 6c 69 74 65 33 52 74 72 65  rc = sqlite3Rtre
14df0 65 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a 23  eInit(db);.  }.#
14e00 65 6e 64 69 66 0a 0a 20 20 73 71 6c 69 74 65 33  endif..  sqlite3
14e10 45 72 72 6f 72 28 64 62 2c 20 72 63 2c 20 30 29  Error(db, rc, 0)
14e20 3b 0a 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45  ;..  /* -DSQLITE
14e30 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
14e40 5f 4d 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58  _MODE=1 makes EX
14e50 43 4c 55 53 49 56 45 20 74 68 65 20 64 65 66 61  CLUSIVE the defa
14e60 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a  ult locking.  **
14e70 20 6d 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45   mode.  -DSQLITE
14e80 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47  _DEFAULT_LOCKING
14e90 5f 4d 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52  _MODE=0 make NOR
14ea0 4d 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20  MAL the default 
14eb0 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64  locking.  ** mod
14ec0 65 2e 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e  e.  Doing nothin
14ed0 67 20 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61  g at all also ma
14ee0 6b 65 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64  kes NORMAL the d
14ef0 65 66 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66  efault..  */.#if
14f00 64 65 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55  def SQLITE_DEFAU
14f10 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a  LT_LOCKING_MODE.
14f20 20 20 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f    db->dfltLockMo
14f30 64 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  de = SQLITE_DEFA
14f40 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45  ULT_LOCKING_MODE
14f50 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
14f60 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69  LockingMode(sqli
14f70 74 65 33 42 74 72 65 65 50 61 67 65 72 28 64 62  te3BtreePager(db
14f80 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20  ->aDb[0].pBt),. 
14f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14fa0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
14fb0 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f  DEFAULT_LOCKING_
14fc0 4d 4f 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  MODE);.#endif.. 
14fd0 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c   /* Enable the l
14fe0 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20  ookaside-malloc 
14ff0 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73  subsystem */.  s
15000 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62  etupLookaside(db
15010 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  , 0, sqlite3Glob
15020 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61  alConfig.szLooka
15030 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  side,.          
15040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
15050 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15060 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a  g.nLookaside);..
15070 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75    sqlite3_wal_au
15080 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  tocheckpoint(db,
15090 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
150a0 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49  WAL_AUTOCHECKPOI
150b0 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74  NT);..opendb_out
150c0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
150d0 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20 64  (zOpen);.  if( d
150e0 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
150f0 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c   db->mutex!=0 ||
15100 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30   isThreadsafe==0
15110 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   || sqlite3Globa
15120 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
15130 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ex==0 );.    sql
15140 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15150 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d  (db->mutex);.  }
15160 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
15170 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61  errcode(db);.  a
15180 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20  ssert( db!=0 || 
15190 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
151a0 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
151b0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
151c0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
151d0 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b  db);.    db = 0;
151e0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21  .  }else if( rc!
151f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15200 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
15210 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b  LITE_MAGIC_SICK;
15220 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64  .  }.  *ppDb = d
15230 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  b;.#ifdef SQLITE
15240 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20  _ENABLE_SQLLOG. 
15250 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
15260 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
15270 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69   ){.    /* Openi
15280 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20  ng a db handle. 
15290 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72  Fourth parameter
152a0 20 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f   is passed 0. */
152b0 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20  .    void *pArg 
152c0 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
152d0 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
152e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
152f0 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
15300 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c  g(pArg, db, zFil
15310 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23  ename, 0);.  }.#
15320 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 73  endif.  return s
15330 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c  qlite3ApiExit(0,
15340 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f   rc);.}../*.** O
15350 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61  pen a new databa
15360 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
15370 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a  t sqlite3_open(.
15380 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
15390 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
153a0 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20  te3 **ppDb .){. 
153b0 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
153c0 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  base(zFilename, 
153d0 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ppDb,.          
153e0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
153f0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
15400 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
15410 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e  CREATE, 0);.}.in
15420 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  t sqlite3_open_v
15430 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2(.  const char 
15440 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  *filename,   /* 
15450 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
15460 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73  e (UTF-8) */.  s
15470 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20  qlite3 **ppDb,  
15480 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
15490 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20  QLite db handle 
154a0 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
154c0 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  Flags */.  const
154d0 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20   char *zVfs     
154e0 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46     /* Name of VF
154f0 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20  S module to use 
15500 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  */.){.  return o
15510 70 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65  penDatabase(file
15520 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e 73  name, ppDb, (uns
15530 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c  igned int)flags,
15540 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64   zVfs);.}..#ifnd
15550 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
15560 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  TF16./*.** Open 
15570 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68  a new database h
15580 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
15590 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20  lite3_open16(.  
155a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c  const void *zFil
155b0 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65  ename, .  sqlite
155c0 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68  3 **ppDb.){.  ch
155d0 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e  ar const *zFilen
155e0 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65  ame8;   /* zFile
155f0 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20  name encoded in 
15600 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66  UTF-8 instead of
15610 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c   UTF-16 */.  sql
15620 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
15630 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
15640 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
15650 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70   );.  assert( pp
15660 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d 20  Db );.  *ppDb = 
15670 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
15680 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
15690 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69    rc = sqlite3_i
156a0 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
156b0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
156c0 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56 61 6c  c;.#endif.  pVal
156d0 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
156e0 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
156f0 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
15700 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
15710 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
15720 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  IVE, SQLITE_STAT
15730 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  IC);.  zFilename
15740 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  8 = sqlite3Value
15750 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54  Text(pVal, SQLIT
15760 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a  E_UTF8);.  if( z
15770 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20  Filename8 ){.   
15780 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61   rc = openDataba
15790 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70  se(zFilename8, p
157a0 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pDb,.           
157b0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
157c0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
157d0 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
157e0 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61  REATE, 0);.    a
157f0 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20  ssert( *ppDb || 
15800 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
15810 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
15820 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62  SQLITE_OK && !Db
15830 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44  HasProperty(*ppD
15840 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c  b, 0, DB_SchemaL
15850 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20  oaded) ){.      
15860 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c  ENC(*ppDb) = SQL
15870 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
15880 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
15890 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
158a0 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c  NOMEM;.  }.  sql
158b0 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
158c0 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73  al);..  return s
158d0 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c  qlite3ApiExit(0,
158e0 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f   rc);.}.#endif /
158f0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
15900 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
15910 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
15920 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
15930 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
15940 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
15950 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
15960 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  te_collation(.  
15970 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
15980 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
15990 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
159a0 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
159b0 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
159c0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
159d0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
159e0 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
159f0 63 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  c;.  sqlite3_mut
15a00 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
15a10 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ex);.  assert( !
15a20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15a30 20 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74   );.  rc = creat
15a40 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a  eCollation(db, z
15a50 4e 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70  Name, (u8)enc, p
15a60 43 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30  Ctx, xCompare, 0
15a70 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
15a80 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
15a90 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
15aa0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
15ab0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
15ac0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  .}../*.** Regist
15ad0 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69  er a new collati
15ae0 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74 68  on sequence with
15af0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
15b00 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20  ndle db..*/.int 
15b10 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63  sqlite3_create_c
15b20 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20 73  ollation_v2(.  s
15b30 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20 63  qlite3* db, .  c
15b40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
15b50 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  , .  int enc, . 
15b60 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
15b70 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
15b80 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
15b90 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
15ba0 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78 44  id*),.  void(*xD
15bb0 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20 20  el)(void*).){.  
15bc0 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
15bd0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
15be0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
15bf0 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
15c00 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d 20  ailed );.  rc = 
15c10 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
15c20 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29 65  db, zName, (u8)e
15c30 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70 61  nc, pCtx, xCompa
15c40 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63 20  re, xDel);.  rc 
15c50 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74  = sqlite3ApiExit
15c60 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69  (db, rc);.  sqli
15c70 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
15c80 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
15c90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
15ca0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15cb0 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69  UTF16./*.** Regi
15cc0 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61  ster a new colla
15cd0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69  tion sequence wi
15ce0 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
15cf0 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e  handle db..*/.in
15d00 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  t sqlite3_create
15d10 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20 20  _collation16(.  
15d20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
15d30 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61 6d  const void *zNam
15d40 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a 20  e,.  int enc, . 
15d50 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20 69   void* pCtx,.  i
15d60 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76 6f  nt(*xCompare)(vo
15d70 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
15d80 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76 6f  id*,int,const vo
15d90 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
15da0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
15db0 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20 20  char *zName8;.  
15dc0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
15dd0 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
15de0 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d    assert( !db->m
15df0 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20  allocFailed );. 
15e00 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74 65   zName8 = sqlite
15e10 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 4e  3Utf16to8(db, zN
15e20 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
15e30 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20 20  UTF16NATIVE);.  
15e40 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20 20  if( zName8 ){.  
15e50 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c    rc = createCol
15e60 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65  lation(db, zName
15e70 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74 78  8, (u8)enc, pCtx
15e80 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a  , xCompare, 0);.
15e90 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
15ea0 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a 20  e(db, zName8);. 
15eb0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
15ec0 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29  3ApiExit(db, rc)
15ed0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
15ee0 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65  x_leave(db->mute
15ef0 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  x);.  return rc;
15f00 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
15f10 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a  ITE_OMIT_UTF16 *
15f20 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  /../*.** Registe
15f30 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  r a collation se
15f40 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20 63  quence factory c
15f50 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
15f60 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
15f70 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65 20  .** db. Replace 
15f80 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20 69  any previously i
15f90 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69  nstalled collati
15fa0 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74  on sequence fact
15fb0 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ory..*/.int sqli
15fc0 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65  te3_collation_ne
15fd0 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33 20  eded(.  sqlite3 
15fe0 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43  *db, .  void *pC
15ff0 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20  ollNeededArg, . 
16000 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64   void(*xCollNeed
16010 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74 65  ed)(void*,sqlite
16020 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70 2c  3*,int eTextRep,
16030 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a  const char*).){.
16040 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
16050 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
16060 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65  ;.  db->xCollNee
16070 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65  ded = xCollNeede
16080 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  d;.  db->xCollNe
16090 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64 62  eded16 = 0;.  db
160a0 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67  ->pCollNeededArg
160b0 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72   = pCollNeededAr
160c0 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  g;.  sqlite3_mut
160d0 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
160e0 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  ex);.  return SQ
160f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 6e  LITE_OK;.}..#ifn
16100 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16110 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67 69  UTF16./*.** Regi
16120 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e  ster a collation
16130 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72   sequence factor
16140 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  y callback with 
16150 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
16160 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61  dle.** db. Repla
16170 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c  ce any previousl
16180 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c  y installed coll
16190 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
161a0 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73  actory..*/.int s
161b0 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e  qlite3_collation
161c0 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71 6c  _needed16(.  sql
161d0 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f 69  ite3 *db, .  voi
161e0 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  d *pCollNeededAr
161f0 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f 6c  g, .  void(*xCol
16200 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64 2a  lNeeded16)(void*
16210 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65 54  ,sqlite3*,int eT
16220 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f 69  extRep,const voi
16230 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33  d*).){.  sqlite3
16240 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
16250 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 78  >mutex);.  db->x
16260 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b 0a  CollNeeded = 0;.
16270 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65    db->xCollNeede
16280 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64 65  d16 = xCollNeede
16290 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c 6c  d16;.  db->pColl
162a0 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f 6c  NeededArg = pCol
162b0 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73 71  lNeededArg;.  sq
162c0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
162d0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
162e0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
162f0 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
16300 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
16310 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  */..#ifndef SQLI
16320 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41 54  TE_OMIT_DEPRECAT
16330 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  ED./*.** This fu
16340 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61 6e  nction is now an
16350 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49 74   anachronism. It
16360 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65 64   used to be used
16370 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f 6d   to recover from
16380 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20 66   a.** malloc() f
16390 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c 69  ailure, but SQLi
163a0 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69 73  te now does this
163b0 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 0a   automatically..
163c0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 67  */.int sqlite3_g
163d0 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76 6f  lobal_recover(vo
163e0 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53 51  id){.  return SQ
163f0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
16400 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f  f../*.** Test to
16410 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72 20   see whether or 
16420 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65  not the database
16430 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 69   connection is i
16440 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a 20  n autocommit.** 
16450 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54 52  mode.  Return TR
16460 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64 20  UE if it is and 
16470 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20 41  FALSE if not.  A
16480 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20 69  utocommit mode i
16490 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61 75  s on.** by defau
164a0 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74 20  lt.  Autocommit 
164b0 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20 61  is disabled by a
164c0 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e 74   BEGIN statement
164d0 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a 2a   and reenabled.*
164e0 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43 4f  * by the next CO
164f0 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b  MMIT or ROLLBACK
16500 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16510 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
16520 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
16530 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f 43  return db->autoC
16540 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ommit;.}../*.** 
16550 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f  The following ro
16560 75 74 69 6e 65 73 20 61 72 65 20 73 75 62 74 69  utines are subti
16570 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73 74 61  tutes for consta
16580 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  nts SQLITE_CORRU
16590 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4d 49  PT,.** SQLITE_MI
165a0 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43 41 4e  SUSE, SQLITE_CAN
165b0 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f 49 4f  TOPEN, SQLITE_IO
165c0 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62 6c 79  ERR and possibly
165d0 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a 2a 20   other error.** 
165e0 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68 65 79  constants.  They
165f0 20 73 65 72 76 65 72 20 74 77 6f 20 70 75 72 70   server two purp
16600 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 2e  oses:.**.**   1.
16610 20 20 53 65 72 76 65 20 61 73 20 61 20 63 6f 6e    Serve as a con
16620 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74 6f  venient place to
16630 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69 6e   set a breakpoin
16640 74 20 69 6e 20 61 20 64 65 62 75 67 67 65 72 0a  t in a debugger.
16650 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74 65  **       to dete
16660 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e 20  ct when version 
16670 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e 73  error conditions
16680 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 20   occurs..**.**  
16690 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c 69   2.  Invoke sqli
166a0 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72 6f  te3_log() to pro
166b0 76 69 64 65 20 74 68 65 20 73 6f 75 72 63 65 20  vide the source 
166c0 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77 68  code location wh
166d0 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20 6c  ere.**       a l
166e0 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20 69  ow-level error i
166f0 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65 64  s first detected
16700 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
16710 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e 74  CorruptError(int
16720 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
16730 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
16740 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
16750 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
16760 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  og(SQLITE_CORRUP
16770 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
16780 20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72 75   "database corru
16790 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25 64  ption at line %d
167a0 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20   of [%.10s]",.  
167b0 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
167c0 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73  no, 20+sqlite3_s
167d0 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65  ourceid());.  re
167e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
167f0 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74  UPT;.}.int sqlit
16800 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69 6e  e3MisuseError(in
16810 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
16820 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
16830 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
16840 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
16850 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55 53  log(SQLITE_MISUS
16860 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  E, .            
16870 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69 6e    "misuse at lin
16880 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22  e %d of [%.10s]"
16890 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
168a0 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74  lineno, 20+sqlit
168b0 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b 0a  e3_sourceid());.
168c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
168d0 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73 71  MISUSE;.}.int sq
168e0 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72 72  lite3CantopenErr
168f0 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a  or(int lineno){.
16900 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c 69    testcase( sqli
16910 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
16920 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71 6c  xLog!=0 );.  sql
16930 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45 5f  ite3_log(SQLITE_
16940 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20 20  CANTOPEN, .     
16950 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f 74           "cannot
16960 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c 69   open file at li
16970 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d  ne %d of [%.10s]
16980 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
16990 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69   lineno, 20+sqli
169a0 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
169b0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
169c0 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a 23  _CANTOPEN;.}...#
169d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
169e0 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a  IT_DEPRECATED./*
169f0 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63 6f  .** This is a co
16a00 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69 6e  nvenience routin
16a10 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75 72  e that makes sur
16a20 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65 61  e that all threa
16a30 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64 61  d-specific.** da
16a40 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72 65  ta for this thre
16a50 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61 6c  ad has been deal
16a60 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 53  located..**.** S
16a70 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72 20  QLite no longer 
16a80 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65 63  uses thread-spec
16a90 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68 69  ific data so thi
16aa0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 77  s routine is now
16ab0 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49 74   a.** no-op.  It
16ac0 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f 72   is retained for
16ad0 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d 70   historical comp
16ae0 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76 6f  atibility..*/.vo
16af0 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  id sqlite3_threa
16b00 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29 7b  d_cleanup(void){
16b10 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
16b20 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e 66   Return meta inf
16b30 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
16b40 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d 6e   specific column
16b50 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 74   of a database t
16b60 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f 6d  able..** See com
16b70 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33 2e  ment in sqlite3.
16b80 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29 20  h (sqlite.h.in) 
16b90 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
16ba0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
16bb0 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41  ABLE_COLUMN_META
16bc0 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65 33  DATA.int sqlite3
16bd0 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
16be0 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74 65  tadata(.  sqlite
16bf0 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
16c00 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63 74        /* Connect
16c10 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20  ion handle */.  
16c20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
16c30 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 44  ame,        /* D
16c40 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72 20  atabase name or 
16c50 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  NULL */.  const 
16c60 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d 65  char *zTableName
16c70 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 6e  ,     /* Table n
16c80 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ame */.  const c
16c90 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  har *zColumnName
16ca0 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e  ,    /* Column n
16cb0 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ame */.  char co
16cc0 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70 65  nst **pzDataType
16cd0 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20  ,    /* OUTPUT: 
16ce0 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74 79  Declared data ty
16cf0 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6e  pe */.  char con
16d00 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c 20  st **pzCollSeq, 
16d10 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 43      /* OUTPUT: C
16d20 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
16d30 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20  e name */.  int 
16d40 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20 20  *pNotNull,      
16d50 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
16d60 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20 4e  T: True if NOT N
16d70 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20 65  ULL constraint e
16d80 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  xists */.  int *
16d90 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20 20  pPrimaryKey,    
16da0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
16db0 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e  : True if column
16dc0 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a 20   part of PK */. 
16dd0 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20 20   int *pAutoinc  
16de0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16df0 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66 20  OUTPUT: True if 
16e00 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d 69  column is auto-i
16e10 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a 20  ncrement */.){. 
16e20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
16e30 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
16e40 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
16e50 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20  .  Column *pCol 
16e60 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c 3b  = 0;.  int iCol;
16e70 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a  ..  char const *
16e80 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a 20  zDataType = 0;. 
16e90 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43 6f   char const *zCo
16ea0 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e 74  llSeq = 0;.  int
16eb0 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20 20   notnull = 0;.  
16ec0 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20 3d  int primarykey =
16ed0 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69 6e   0;.  int autoin
16ee0 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e 73  c = 0;..  /* Ens
16ef0 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
16f00 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65 6e   schema has been
16f10 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71 6c   loaded */.  sql
16f20 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
16f30 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 73  (db->mutex);.  s
16f40 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
16f50 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d 20  All(db);.  rc = 
16f60 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c 20  sqlite3Init(db, 
16f70 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
16f80 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20 29   SQLITE_OK!=rc )
16f90 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72  {.    goto error
16fa0 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
16fb0 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c 65  Locate the table
16fc0 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f 0a   in question */.
16fd0 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65 33    pTab = sqlite3
16fe0 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a 54  FindTable(db, zT
16ff0 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61 6d  ableName, zDbNam
17000 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62 20  e);.  if( !pTab 
17010 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  || pTab->pSelect
17020 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20 30   ){.    pTab = 0
17030 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f 72  ;.    goto error
17040 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  _out;.  }..  /* 
17050 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20  Find the column 
17060 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20 69  for which info i
17070 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20  s requested */. 
17080 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52 6f   if( sqlite3IsRo
17090 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29  wid(zColumnName)
170a0 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20 70   ){.    iCol = p
170b0 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20 20  Tab->iPKey;.    
170c0 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
170d0 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54 61       pCol = &pTa
170e0 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a 20  b->aCol[iCol];. 
170f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
17100 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69 43    for(iCol=0; iC
17110 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69  ol<pTab->nCol; i
17120 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70 43  Col++){.      pC
17130 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f 6c  ol = &pTab->aCol
17140 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69 66  [iCol];.      if
17150 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 49  ( 0==sqlite3StrI
17160 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  Cmp(pCol->zName,
17170 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b   zColumnName) ){
17180 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
17190 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
171a0 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61 62    if( iCol==pTab
171b0 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  ->nCol ){.      
171c0 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
171d0 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
171e0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
171f0 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c  The following bl
17200 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20 6d  ock stores the m
17210 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  eta information 
17220 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65 74  that will be ret
17230 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74 68  urned.  ** to th
17240 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63 61  e caller in loca
17250 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61 74  l variables zDat
17260 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71 2c  aType, zCollSeq,
17270 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61 72   notnull, primar
17280 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61 75  ykey.  ** and au
17290 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20 70  toinc. At this p
172a0 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65 20 74  oint there are t
172b0 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  wo possibilities
172c0 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20 20  :.  ** .  **    
172d0 20 31 2e 20 54 68 65 20 73 70 65 63 69 66 69 65   1. The specifie
172e0 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77 61  d column name wa
172f0 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22 20  s rowid", "oid" 
17300 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20 20  or "_rowid_" .  
17310 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74 68  **        and th
17320 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69 63  ere is no explic
17330 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49 50  itly declared IP
17340 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a 0a  K column. .  **.
17350 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65 20    **     2. The 
17360 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20 76  table is not a v
17370 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c 75  iew and the colu
17380 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66 69  mn name identifi
17390 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20 20  ed an .  **     
173a0 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64 65     explicitly de
173b0 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20 43  clared column. C
173c0 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61  opy meta informa
173d0 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c 2e  tion from *pCol.
173e0 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43 6f  .  */ .  if( pCo
173f0 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54 79  l ){.    zDataTy
17400 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70 65  pe = pCol->zType
17410 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d  ;.    zCollSeq =
17420 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20 20   pCol->zColl;.  
17430 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f 6c    notnull = pCol
17440 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20 20  ->notNull!=0;.  
17450 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d 20    primarykey  = 
17460 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73 20  (pCol->colFlags 
17470 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b 45  & COLFLAG_PRIMKE
17480 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f 69  Y)!=0;.    autoi
17490 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65 79  nc = pTab->iPKey
174a0 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62 2d  ==iCol && (pTab-
174b0 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f 41  >tabFlags & TF_A
174c0 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d 30  utoincrement)!=0
174d0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a  ;.  }else{.    z
174e0 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54 45  DataType = "INTE
174f0 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61 72  GER";.    primar
17500 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  ykey = 1;.  }.  
17510 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29 7b  if( !zCollSeq ){
17520 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d 20  .    zCollSeq = 
17530 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a 65  "BINARY";.  }..e
17540 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c 69  rror_out:.  sqli
17550 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c 6c  te3BtreeLeaveAll
17560 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 74  (db);..  /* Whet
17570 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  her the function
17580 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64 20   call succeeded 
17590 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20 74  or failed, set t
175a0 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65  he output parame
175b0 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68 61  ters.  ** to wha
175c0 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63 61  tever their loca
175d0 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20 63  l counterparts c
175e0 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65 72  ontain. If an er
175f0 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a 20  ror did occur,. 
17600 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68 65   ** this has the
17610 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f 69   effect of zeroi
17620 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70 61  ng all output pa
17630 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a 20  rameters..  */. 
17640 20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65 20   if( pzDataType 
17650 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d 20  ) *pzDataType = 
17660 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66 28  zDataType;.  if(
17670 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70 7a   pzCollSeq ) *pz
17680 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c 53  CollSeq = zCollS
17690 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e 75  eq;.  if( pNotNu
176a0 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20 3d  ll ) *pNotNull =
176b0 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28 20   notnull;.  if( 
176c0 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a 70  pPrimaryKey ) *p
176d0 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72 69  PrimaryKey = pri
176e0 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20 70  marykey;.  if( p
176f0 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74 6f  Autoinc ) *pAuto
17700 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a 0a  inc = autoinc;..
17710 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d    if( SQLITE_OK=
17720 3d 72 63 20 26 26 20 21 70 54 61 62 20 29 7b 0a  =rc && !pTab ){.
17730 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65      sqlite3DbFre
17740 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  e(db, zErrMsg);.
17750 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73 71      zErrMsg = sq
17760 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62 2c  lite3MPrintf(db,
17770 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65 20   "no such table 
17780 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c 20  column: %s.%s", 
17790 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20 20  zTableName,.    
177a0 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29      zColumnName)
177b0 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  ;.    rc = SQLIT
177c0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 73  E_ERROR;.  }.  s
177d0 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20  qlite3Error(db, 
177e0 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25 73  rc, (zErrMsg?"%s
177f0 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  ":0), zErrMsg);.
17800 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28    sqlite3DbFree(
17810 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  db, zErrMsg);.  
17820 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
17830 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
17840 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
17850 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
17860 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
17870 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  ndif../*.** Slee
17880 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20 77  p for a little w
17890 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74 68  hile.  Return th
178a0 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d 65  e amount of time
178b0 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20 73   slept..*/.int s
178c0 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e 74  qlite3_sleep(int
178d0 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f   ms){.  sqlite3_
178e0 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e 74  vfs *pVfs;.  int
178f0 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73 71   rc;.  pVfs = sq
17900 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30  lite3_vfs_find(0
17910 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d 30  );.  if( pVfs==0
17920 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20   ) return 0;..  
17930 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
17940 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69 73   works in millis
17950 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65 20  econds, but the 
17960 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c 65  underlying OsSle
17970 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20 75  ep() .  ** API u
17980 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73  ses microseconds
17990 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30 30 30  . Hence the 1000
179a0 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  's..  */.  rc = 
179b0 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28  (sqlite3OsSleep(
179c0 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f 31  pVfs, 1000*ms)/1
179d0 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  000);.  return r
179e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62  c;.}../*.** Enab
179f0 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74 68  le or disable th
17a00 65 20 65 78 74 65 6e 64 65 64 20 72 65 73 75 6c  e extended resul
17a10 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74 20  t codes..*/.int 
17a20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
17a30 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73 71  _result_codes(sq
17a40 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 6f  lite3 *db, int o
17a50 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74 65 33  noff){.  sqlite3
17a60 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
17a70 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 65  >mutex);.  db->e
17a80 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20 3f  rrMask = onoff ?
17a90 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30 78   0xffffffff : 0x
17aa0 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ff;.  sqlite3_mu
17ab0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
17ac0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
17ad0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
17ae0 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78 46  ** Invoke the xF
17af0 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  ileControl metho
17b00 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c 61  d on a particula
17b10 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69  r database..*/.i
17b20 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f  nt sqlite3_file_
17b30 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 20  control(sqlite3 
17b40 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
17b50 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f 70  *zDbName, int op
17b60 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20  , void *pArg){. 
17b70 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
17b80 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65 20  _ERROR;.  Btree 
17b90 2a 70 42 74 72 65 65 3b 0a 0a 20 20 73 71 6c 69  *pBtree;..  sqli
17ba0 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
17bb0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 42  db->mutex);.  pB
17bc0 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44 62  tree = sqlite3Db
17bd0 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20  NameToBtree(db, 
17be0 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  zDbName);.  if( 
17bf0 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50 61  pBtree ){.    Pa
17c00 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 20  ger *pPager;.   
17c10 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
17c20 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74  d;.    sqlite3Bt
17c30 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65 29  reeEnter(pBtree)
17c40 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 73  ;.    pPager = s
17c50 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
17c60 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61 73  (pBtree);.    as
17c70 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
17c80 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c 69  );.    fd = sqli
17c90 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50 61  te3PagerFile(pPa
17ca0 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ger);.    assert
17cb0 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20 69  ( fd!=0 );.    i
17cc0 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46 43  f( op==SQLITE_FC
17cd0 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45 52  NTL_FILE_POINTER
17ce0 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c 69   ){.      *(sqli
17cf0 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67 20  te3_file**)pArg 
17d00 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20 3d  = fd;.      rc =
17d10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
17d20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d 3e 70 4d  }else if( fd->pM
17d30 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
17d40 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
17d50 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f 70  leControl(fd, op
17d60 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 65 6c  , pArg);.    }el
17d70 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
17d80 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b 0a  QLITE_NOTFOUND;.
17d90 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
17da0 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74 72  3BtreeLeave(pBtr
17db0 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ee);.  }.  sqlit
17dc0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
17dd0 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
17de0 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f 2a  urn rc;   .}../*
17df0 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74 6f  .** Interface to
17e00 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f 67   the testing log
17e10 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ic..*/.int sqlit
17e20 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
17e30 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20 20  int op, ...){.  
17e40 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66 6e  int rc = 0;.#ifn
17e50 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
17e60 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20 76  BUILTIN_TEST.  v
17e70 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61 5f  a_list ap;.  va_
17e80 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a 20  start(ap, op);. 
17e90 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 0a   switch( op ){..
17ea0 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53 61      /*.    ** Sa
17eb0 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ve the current s
17ec0 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e 47  tate of the PRNG
17ed0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
17ee0 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
17ef0 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a 20  L_PRNG_SAVE: {. 
17f00 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67       sqlite3Prng
17f10 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20 20  SaveState();.   
17f20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
17f30 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 52  .    /*.    ** R
17f40 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74 65  estore the state
17f50 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f 20   of the PRNG to 
17f60 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20 73  the last state s
17f70 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20 2a  aved using.    *
17f80 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49 66  * PRNG_SAVE.  If
17f90 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20 6e   PRNG_SAVE has n
17fa0 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65 6e  ever before been
17fb0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20 20   called, then.  
17fc0 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20 61    ** this verb a
17fd0 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52 45  cts like PRNG_RE
17fe0 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  SET..    */.    
17ff0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
18000 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f 52  CTRL_PRNG_RESTOR
18010 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
18020 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74 61  e3PrngRestoreSta
18030 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61  te();.      brea
18040 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
18050 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74 68  .    ** Reset th
18060 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20 69  e PRNG back to i
18070 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65 64  ts uninitialized
18080 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65 78   state.  The nex
18090 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  t call.    ** to
180a0 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e   sqlite3_randomn
180b0 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65 65  ess() will resee
180c0 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e 67  d the PRNG using
180d0 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a 20   a single call. 
180e0 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52 61     ** to the xRa
180f0 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64 20  ndomness method 
18100 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20 56  of the default V
18110 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  FS..    */.    c
18120 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
18130 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a 20  TRL_PRNG_RESET: 
18140 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  {.      sqlite3P
18150 72 6e 67 52 65 73 65 74 53 74 61 74 65 28 29 3b  rngResetState();
18160 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18170 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
18180 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
18190 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43 5f  _control(BITVEC_
181a0 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f 67  TEST, size, prog
181b0 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ram).    **.    
181c0 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61 67  ** Run a test ag
181d0 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20 6f  ainst a Bitvec o
181e0 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20 20  bject of size.  
181f0 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67 75  The program argu
18200 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20 61  ment.    ** is a
18210 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65 67  n array of integ
18220 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65 73  ers that defines
18230 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74 75   the test.  Retu
18240 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20 2a  rn -1 on a.    *
18250 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  * memory allocat
18260 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e 20  ion error, 0 on 
18270 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e 2d  success, or non-
18280 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72 6f  zero for an erro
18290 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74 68  r..    ** See th
182a0 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 42  e sqlite3BitvecB
182b0 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f 72  uiltinTest() for
182c0 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
182d0 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  rmation..    */.
182e0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
182f0 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43 5f  TESTCTRL_BITVEC_
18300 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e  TEST: {.      in
18310 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61 70  t sz = va_arg(ap
18320 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 6e  , int);.      in
18330 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61 72  t *aProg = va_ar
18340 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20 20  g(ap, int*);.   
18350 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42     rc = sqlite3B
18360 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73 74  itvecBuiltinTest
18370 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20 20  (sz, aProg);.   
18380 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
18390 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20  .    /*.    **  
183a0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
183b0 74 72 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c  trol(BENIGN_MALL
183c0 4f 43 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e  OC_HOOKS, xBegin
183d0 2c 20 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20  , xEnd).    **. 
183e0 20 20 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68     ** Register h
183f0 6f 6f 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20  ooks to call to 
18400 69 6e 64 69 63 61 74 65 20 77 68 69 63 68 20 6d  indicate which m
18410 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73  alloc() failures
18420 20 0a 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e   .    ** are ben
18430 69 67 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ign..    */.    
18440 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
18450 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c  CTRL_BENIGN_MALL
18460 4f 43 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20  OC_HOOKS: {.    
18470 20 20 74 79 70 65 64 65 66 20 76 6f 69 64 20 28    typedef void (
18480 2a 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28  *void_function)(
18490 76 6f 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69  void);.      voi
184a0 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69  d_function xBeni
184b0 67 6e 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76  gnBegin;.      v
184c0 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65  oid_function xBe
184d0 6e 69 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78  nignEnd;.      x
184e0 42 65 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61  BenignBegin = va
184f0 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75  _arg(ap, void_fu
18500 6e 63 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78  nction);.      x
18510 42 65 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61  BenignEnd = va_a
18520 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63  rg(ap, void_func
18530 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  tion);.      sql
18540 69 74 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  ite3BenignMalloc
18550 48 6f 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67  Hooks(xBenignBeg
18560 69 6e 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b  in, xBenignEnd);
18570 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18580 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
18590 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  **  sqlite3_test
185a0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
185b0 54 45 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47  TESTCTRL_PENDING
185c0 5f 42 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20  _BYTE, unsigned 
185d0 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
185e0 20 20 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e    ** Set the PEN
185f0 44 49 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65  DING byte to the
18600 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72   value in the ar
18610 67 75 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a  gument, if X>0..
18620 20 20 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63      ** Make no c
18630 68 61 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20  hanges if X==0. 
18640 20 52 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75   Return the valu
18650 65 20 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67  e of the pending
18660 20 62 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20   byte.    ** as 
18670 69 74 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f  it existing befo
18680 72 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  re this routine 
18690 77 61 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20  was called..    
186a0 2a 2a 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54  **.    ** IMPORT
186b0 41 4e 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74  ANT:  Changing t
186c0 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20  he PENDING byte 
186d0 66 72 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20  from 0x40000000 
186e0 72 65 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a  results in.    *
186f0 2a 20 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c  * an incompatibl
18700 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
18710 66 6f 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e  format.  Changin
18720 67 20 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79  g the PENDING by
18730 74 65 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20  te.    ** while 
18740 61 6e 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e  any database con
18750 6e 65 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20  nection is open 
18760 72 65 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66  results in undef
18770 69 6e 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ined and.    ** 
18780 64 69 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61  dileterious beha
18790 76 69 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  vior..    */.   
187a0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
187b0 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59  TCTRL_PENDING_BY
187c0 54 45 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d  TE: {.      rc =
187d0 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23   PENDING_BYTE;.#
187e0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
187f0 49 54 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20  IT_WSD.      {. 
18800 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
18810 69 6e 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f  int newVal = va_
18820 61 72 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64  arg(ap, unsigned
18830 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69   int);.        i
18840 66 28 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69  f( newVal ) sqli
18850 74 65 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d  te3PendingByte =
18860 20 6e 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d   newVal;.      }
18870 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
18880 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
18890 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
188a0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
188b0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
188c0 41 53 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20  ASSERT, int X). 
188d0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
188e0 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65  s action provide
188f0 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73  s a run-time tes
18900 74 20 74 6f 20 73 65 65 20 77 68 65 74 68 65 72  t to see whether
18910 20 6f 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61   or not.    ** a
18920 73 73 65 72 74 28 29 20 77 61 73 20 65 6e 61 62  ssert() was enab
18930 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74  led at compile-t
18940 69 6d 65 2e 20 20 49 66 20 58 20 69 73 20 74 72  ime.  If X is tr
18950 75 65 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a  ue and assert().
18960 20 20 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65      ** is enable
18970 64 2c 20 74 68 65 6e 20 74 68 65 20 72 65 74 75  d, then the retu
18980 72 6e 20 76 61 6c 75 65 20 69 73 20 74 72 75 65  rn value is true
18990 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65 20  .  If X is true 
189a0 61 6e 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72  and.    ** asser
189b0 74 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c  t() is disabled,
189c0 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
189d0 20 76 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20   value is zero. 
189e0 20 49 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20   If X is.    ** 
189f0 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74  false and assert
18a00 28 29 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74  () is enabled, t
18a10 68 65 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f  hen the assertio
18a20 6e 20 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a  n fires and the.
18a30 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61      ** process a
18a40 62 6f 72 74 73 2e 20 20 49 66 20 58 20 69 73 20  borts.  If X is 
18a50 66 61 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74  false and assert
18a60 28 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20  () is disabled, 
18a70 74 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  then the.    ** 
18a80 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20  return value is 
18a90 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  zero..    */.   
18aa0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
18ab0 54 43 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a  TCTRL_ASSERT: {.
18ac0 20 20 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69        volatile i
18ad0 6e 74 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20  nt x = 0;.      
18ae0 61 73 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f  assert( (x = va_
18af0 61 72 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20  arg(ap,int))!=0 
18b00 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b  );.      rc = x;
18b10 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
18b20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20    }...    /*.   
18b30 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
18b40 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
18b50 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
18b60 2c 20 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a  , int X).    **.
18b70 20 20 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69      ** This acti
18b80 6f 6e 20 70 72 6f 76 69 64 65 73 20 61 20 72 75  on provides a ru
18b90 6e 2d 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73  n-time test to s
18ba0 65 65 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59  ee how the ALWAY
18bb0 53 20 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56  S and.    ** NEV
18bc0 45 52 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64  ER macros were d
18bd0 65 66 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c  efined at compil
18be0 65 2d 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20  e-time..    **. 
18bf0 20 20 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e     ** The return
18c00 20 76 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53   value is ALWAYS
18c10 28 58 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20  (X).  .    **.  
18c20 20 20 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65    ** The recomme
18c30 6e 64 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d  nded test is X==
18c40 32 2e 20 20 49 66 20 74 68 65 20 72 65 74 75 72  2.  If the retur
18c50 6e 20 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68  n value is 2, th
18c60 61 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  at means.    ** 
18c70 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
18c80 45 52 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f  ER() are both no
18c90 2d 6f 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68  -op pass-through
18ca0 20 6d 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69   macros, which i
18cb0 73 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66  s the.    ** def
18cc0 61 75 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49  ault setting.  I
18cd0 66 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  f the return val
18ce0 75 65 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c  ue is 1, then AL
18cf0 57 41 59 53 28 29 20 69 73 20 65 69 74 68 65 72  WAYS() is either
18d00 0a 20 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64  .    ** hard-cod
18d10 65 64 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c  ed to true or el
18d20 73 65 20 69 74 20 61 73 73 65 72 74 73 20 69 66  se it asserts if
18d30 20 69 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73   its argument is
18d40 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54   false..    ** T
18d50 68 65 20 66 69 72 73 74 20 62 65 68 61 76 69 6f  he first behavio
18d60 72 20 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f  r (hard-coded to
18d70 20 74 72 75 65 29 20 69 73 20 74 68 65 20 63 61   true) is the ca
18d80 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c  se if.    ** SQL
18d90 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
18da0 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20 61  ERT shows that a
18db0 73 73 65 72 74 28 29 20 69 73 20 64 69 73 61 62  ssert() is disab
18dc0 6c 65 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f  led and the seco
18dd0 6e 64 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69  nd.    ** behavi
18de0 6f 72 20 28 61 73 73 65 72 74 20 69 66 20 74 68  or (assert if th
18df0 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c  e argument to AL
18e00 57 41 59 53 28 29 20 69 73 20 66 61 6c 73 65 29  WAYS() is false)
18e10 20 69 73 20 74 68 65 20 63 61 73 65 20 69 66 0a   is the case if.
18e20 20 20 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45      ** SQLITE_TE
18e30 53 54 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68  STCTRL_ASSERT sh
18e40 6f 77 73 20 74 68 61 74 20 61 73 73 65 72 74 28  ows that assert(
18e50 29 20 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20  ) is enabled..  
18e60 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
18e70 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72  run-time test pr
18e80 6f 63 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f  ocedure might lo
18e90 6f 6b 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b  ok something lik
18ea0 65 20 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20  e this:.    **. 
18eb0 20 20 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c     **    if( sql
18ec0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
18ed0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
18ee0 4c 5f 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20  L_ALWAYS, 2)==2 
18ef0 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  ){.    **      /
18f00 2f 20 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e  / ALWAYS() and N
18f10 45 56 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70  EVER() are no-op
18f20 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61   pass-through ma
18f30 63 72 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d  cros.    **    }
18f40 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65 33  else if( sqlite3
18f50 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
18f60 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
18f70 53 45 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20  SERT, 1) ){.    
18f80 2a 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59  **      // ALWAY
18f90 53 28 78 29 20 61 73 73 65 72 74 73 20 74 68 61  S(x) asserts tha
18fa0 74 20 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56  t x is true. NEV
18fb0 45 52 28 78 29 20 61 73 73 65 72 74 73 20 78 20  ER(x) asserts x 
18fc0 69 73 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a  is false..    **
18fd0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a      }else{.    *
18fe0 2a 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53  *      // ALWAYS
18ff0 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e  (x) is a constan
19000 74 20 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69  t 1.  NEVER(x) i
19010 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a  s a constant 0..
19020 20 20 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20      **    }.    
19030 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
19040 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
19050 59 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  YS: {.      int 
19060 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
19070 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41  t);.      rc = A
19080 4c 57 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20  LWAYS(x);.      
19090 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
190a0 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74    /*   sqlite3_t
190b0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
190c0 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
190d0 52 56 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  RVE, sqlite3 *db
190e0 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a  , int N).    **.
190f0 20 20 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e      ** Set the n
19100 52 65 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20  Reserve size to 
19110 4e 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64  N for the main d
19120 61 74 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64  atabase on the d
19130 61 74 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63  atabase.    ** c
19140 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20  onnection db..  
19150 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
19160 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45  LITE_TESTCTRL_RE
19170 53 45 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73  SERVE: {.      s
19180 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f  qlite3 *db = va_
19190 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a  arg(ap, sqlite3*
191a0 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d  );.      int x =
191b0 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b   va_arg(ap,int);
191c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  .      sqlite3_m
191d0 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
191e0 75 74 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c  utex);.      sql
191f0 69 74 65 33 42 74 72 65 65 53 65 74 50 61 67 65  ite3BtreeSetPage
19200 53 69 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e  Size(db->aDb[0].
19210 70 42 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20  pBt, 0, x, 0);. 
19220 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
19230 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
19240 65 78 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ex);.      break
19250 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
19260 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
19270 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
19280 54 43 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49  TCTRL_OPTIMIZATI
19290 4f 4e 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62  ONS, sqlite3 *db
192a0 2c 20 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a  , int N).    **.
192b0 20 20 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72      ** Enable or
192c0 20 64 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73   disable various
192d0 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66   optimizations f
192e0 6f 72 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f  or testing purpo
192f0 73 65 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a  ses.  The .    *
19300 2a 20 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20  * argument N is 
19310 61 20 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74  a bitmask of opt
19320 69 6d 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65  imizations to be
19330 20 64 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20   disabled.  For 
19340 6e 6f 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70  normal.    ** op
19350 65 72 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64  eration N should
19360 20 62 65 20 30 2e 20 20 54 68 65 20 69 64 65 61   be 0.  The idea
19370 20 69 73 20 74 68 61 74 20 61 20 74 65 73 74 20   is that a test 
19380 70 72 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68  program (like th
19390 65 0a 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67  e.    ** SQL Log
193a0 69 63 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74  ic Test or SLT t
193b0 65 73 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20  est module) can 
193c0 72 75 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c  run the same SQL
193d0 20 6d 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a   multiple times.
193e0 20 20 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69      ** with vari
193f0 6f 75 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ous optimization
19400 73 20 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65  s disabled to ve
19410 72 69 66 79 20 74 68 61 74 20 74 68 65 20 73 61  rify that the sa
19420 6d 65 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a  me answer.    **
19430 20 69 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20   is obtained in 
19440 65 76 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20  every case..    
19450 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
19460 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
19470 4d 49 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20  MIZATIONS: {.   
19480 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
19490 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
194a0 74 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d  te3*);.      db-
194b0 3e 64 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75  >dbOptFlags = (u
194c0 31 36 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69  16)(va_arg(ap, i
194d0 6e 74 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20  nt) & 0xffff);. 
194e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
194f0 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
19500 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f  _N_KEYWORD.    /
19510 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
19520 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
19530 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44  STCTRL_ISKEYWORD
19540 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57  , const char *zW
19550 6f 72 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ord).    **.    
19560 2a 2a 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61  ** If zWord is a
19570 20 6b 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69   keyword recogni
19580 7a 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  zed by the parse
19590 72 2c 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74  r, then return t
195a0 68 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  he.    ** number
195b0 20 6f 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f   of keywords.  O
195c0 72 20 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f  r if zWord is no
195d0 74 20 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74  t a keyword, ret
195e0 75 72 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20  urn 0..    ** . 
195f0 20 20 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20     ** This test 
19600 66 65 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20  feature is only 
19610 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65  available in the
19620 20 61 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69   amalgamation si
19630 6e 63 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53  nce.    ** the S
19640 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20  QLITE_N_KEYWORD 
19650 6d 61 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66  macro is not def
19660 69 6e 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c  ined in this fil
19670 65 20 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20  e if SQLite.    
19680 2a 2a 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e  ** is built usin
19690 67 20 73 65 70 61 72 61 74 65 20 73 6f 75 72 63  g separate sourc
196a0 65 20 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a  e files..    */.
196b0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
196c0 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f  TESTCTRL_ISKEYWO
196d0 52 44 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  RD: {.      cons
196e0 74 20 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20  t char *zWord = 
196f0 76 61 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74  va_arg(ap, const
19700 20 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69   char*);.      i
19710 6e 74 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  nt n = sqlite3St
19720 72 6c 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20  rlen30(zWord);. 
19730 20 20 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74       rc = (sqlit
19740 65 33 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75  e3KeywordCode((u
19750 38 2a 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b  8*)zWord, n)!=TK
19760 5f 49 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f  _ID) ? SQLITE_N_
19770 4b 45 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20  KEYWORD : 0;.   
19780 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
19790 23 65 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20  #endif ..    /* 
197a0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
197b0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
197c0 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c  CTRL_SCRATCHMALL
197d0 4f 43 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70  OC, sz, &pNew, p
197e0 46 72 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20  Free);.    **.  
197f0 20 20 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20    ** Pass pFree 
19800 69 6e 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61  into sqlite3Scra
19810 74 63 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20  tchFree(). .    
19820 2a 2a 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20  ** If sz>0 then 
19830 61 6c 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74  allocate a scrat
19840 63 68 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70  ch buffer into p
19850 4e 65 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20  New.  .    */.  
19860 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
19870 53 54 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41  STCTRL_SCRATCHMA
19880 4c 4c 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f  LLOC: {.      vo
19890 69 64 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e  id *pFree, **ppN
198a0 65 77 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a  ew;.      int sz
198b0 3b 0a 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f  ;.      sz = va_
198c0 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
198d0 20 20 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61      ppNew = va_a
198e0 72 67 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a  rg(ap, void**);.
198f0 20 20 20 20 20 20 70 46 72 65 65 20 3d 20 76 61        pFree = va
19900 5f 61 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b  _arg(ap, void*);
19910 0a 20 20 20 20 20 20 69 66 28 20 73 7a 20 29 20  .      if( sz ) 
19920 2a 70 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33  *ppNew = sqlite3
19930 53 63 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a  ScratchMalloc(sz
19940 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
19950 53 63 72 61 74 63 68 46 72 65 65 28 70 46 72 65  ScratchFree(pFre
19960 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
19970 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20  .    }..    /*  
19980 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
19990 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
199a0 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
199b0 46 41 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66  FAULT, int onoff
199c0 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  );.    **.    **
199d0 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e   If parameter on
199e0 6f 66 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  off is non-zero,
199f0 20 63 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77   configure the w
19a00 72 61 70 70 65 72 73 20 73 6f 20 74 68 61 74 20  rappers so that 
19a10 61 6c 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65  all.    ** subse
19a20 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c  quent calls to l
19a30 6f 63 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76  ocaltime() and v
19a40 61 72 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66  ariants fail. If
19a50 20 6f 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a   onoff is zero,.
19a60 20 20 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73      ** undo this
19a70 20 73 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f   setting..    */
19a80 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19a90 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54  _TESTCTRL_LOCALT
19aa0 49 4d 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20  IME_FAULT: {.   
19ab0 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c     sqlite3Global
19ac0 43 6f 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d  Config.bLocaltim
19ad0 65 46 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28  eFault = va_arg(
19ae0 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20  ap, int);.      
19af0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69  break;.    }..#i
19b00 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
19b10 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50  _ENABLE_TREE_EXP
19b20 4c 41 49 4e 29 0a 20 20 20 20 2f 2a 20 20 20 73  LAIN).    /*   s
19b30 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
19b40 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
19b50 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d 54  TRL_EXPLAIN_STMT
19b60 2c 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20  ,.    **        
19b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19b80 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a 2c 63 6f  sqlite3_stmt*,co
19b90 6e 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20  nst char**);.   
19ba0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 63 6f   **.    ** If co
19bb0 6d 70 69 6c 65 64 20 77 69 74 68 20 53 51 4c 49  mpiled with SQLI
19bc0 54 45 5f 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45  TE_ENABLE_TREE_E
19bd0 58 50 4c 41 49 4e 2c 20 65 61 63 68 20 73 71 6c  XPLAIN, each sql
19be0 69 74 65 33 5f 73 74 6d 74 20 68 6f 6c 64 73 0a  ite3_stmt holds.
19bf0 20 20 20 20 2a 2a 20 61 20 73 74 72 69 6e 67 20      ** a string 
19c00 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
19c10 68 65 20 6f 70 74 69 6d 69 7a 65 64 20 70 61 72  he optimized par
19c20 73 65 20 74 72 65 65 2e 20 20 54 68 69 73 20 74  se tree.  This t
19c30 65 73 74 2d 63 6f 6e 74 72 6f 6c 0a 20 20 20 20  est-control.    
19c40 2a 2a 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69  ** returns a poi
19c50 6e 74 65 72 20 74 6f 20 74 68 61 74 20 73 74 72  nter to that str
19c60 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ing..    */.    
19c70 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
19c80 43 54 52 4c 5f 45 58 50 4c 41 49 4e 5f 53 54 4d  CTRL_EXPLAIN_STM
19c90 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
19ca0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
19cb0 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
19cc0 74 65 33 5f 73 74 6d 74 2a 29 3b 0a 20 20 20 20  te3_stmt*);.    
19cd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a 70    const char **p
19ce0 7a 52 65 74 20 3d 20 76 61 5f 61 72 67 28 61 70  zRet = va_arg(ap
19cf0 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2a 29 3b  , const char**);
19d00 0a 20 20 20 20 20 20 2a 70 7a 52 65 74 20 3d 20  .      *pzRet = 
19d10 73 71 6c 69 74 65 33 56 64 62 65 45 78 70 6c 61  sqlite3VdbeExpla
19d20 6e 61 74 69 6f 6e 28 28 56 64 62 65 2a 29 70 53  nation((Vdbe*)pS
19d30 74 6d 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tmt);.      brea
19d40 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
19d50 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
19d60 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
19d70 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
19d80 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75 72  _TEST */.  retur
19d90 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
19da0 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
19db0 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c   routine, useful
19dc0 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e   to VFS implemen
19dd0 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68  tations, that ch
19de0 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69  ecks.** to see i
19df0 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
19e00 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61 74  e was a URI that
19e10 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65   contained a spe
19e20 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20  cific query .** 
19e30 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69  parameter, and i
19e40 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65  f so obtains the
19e50 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75   value of the qu
19e60 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
19e70 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
19e80 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
19e90 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e  he filename poin
19ea0 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ter passed into 
19eb0 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d  the xOpen().** m
19ec0 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69  ethod of a VFS i
19ed0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
19ee0 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d  The zParam argum
19ef0 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
19f00 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  of the.** query 
19f10 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65 65  parameter we see
19f20 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  k.  This routine
19f30 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
19f40 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d  ue of the zParam
19f50 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66  .** parameter if
19f60 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66 20   it exists.  If 
19f70 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f  the parameter do
19f80 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
19f90 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
19fa0 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69  turns a NULL poi
19fb0 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  nter..*/.const c
19fc0 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69  har *sqlite3_uri
19fd0 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74  _parameter(const
19fe0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
19ff0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
1a000 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69  aram){.  if( zFi
1a010 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  lename==0 ) retu
1a020 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  rn 0;.  zFilenam
1a030 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
1a040 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
1a050 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46  + 1;.  while( zF
1a060 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
1a070 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d 70    int x = strcmp
1a080 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72  (zFilename, zPar
1a090 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  am);.    zFilena
1a0a0 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
1a0b0 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
1a0c0 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78 3d   + 1;.    if( x=
1a0d0 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69 6c  =0 ) return zFil
1a0e0 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65  ename;.    zFile
1a0f0 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
1a100 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
1a110 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65  e) + 1;.  }.  re
1a120 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1a130 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61   Return a boolea
1a140 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75  n value for a qu
1a150 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
1a160 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 72  /.int sqlite3_ur
1a170 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  i_boolean(const 
1a180 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1a190 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1a1a0 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b  ram, int bDflt){
1a1b0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1a1c0 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
1a1d0 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61  arameter(zFilena
1a1e0 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62  me, zParam);.  b
1a1f0 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b  Dflt = bDflt!=0;
1a200 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71  .  return z ? sq
1a210 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
1a220 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44 66 6c  z, bDflt) : bDfl
1a230 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
1a240 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  rn a 64-bit inte
1a250 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 61 20  ger value for a 
1a260 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
1a270 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
1a280 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e  4 sqlite3_uri_in
1a290 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  t64(.  const cha
1a2a0 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
1a2b0 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73 20   /* Filename as 
1a2c0 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 20  passed to xOpen 
1a2d0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1a2e0 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 20 2f  *zParam,       /
1a2f0 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65 72 20  * URI parameter 
1a300 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69  sought */.  sqli
1a310 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c 74 20  te3_int64 bDflt 
1a320 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20        /* return 
1a330 69 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  if parameter is 
1a340 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20  missing */.){.  
1a350 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1a360 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
1a370 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c  meter(zFilename,
1a380 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69   zParam);.  sqli
1a390 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69  te3_int64 v;.  i
1a3a0 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65 33 41  f( z && sqlite3A
1a3b0 74 6f 69 36 34 28 7a 2c 20 26 76 2c 20 73 71 6c  toi64(z, &v, sql
1a3c0 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 2c  ite3Strlen30(z),
1a3d0 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3d 3d 53   SQLITE_UTF8)==S
1a3e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a3f0 62 44 66 6c 74 20 3d 20 76 3b 0a 20 20 7d 0a 20  bDflt = v;.  }. 
1a400 20 72 65 74 75 72 6e 20 62 44 66 6c 74 3b 0a 7d   return bDflt;.}
1a410 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1a420 68 65 20 42 74 72 65 65 20 70 6f 69 6e 74 65 72  he Btree pointer
1a430 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 7a   identified by z
1a440 44 62 4e 61 6d 65 2e 20 20 52 65 74 75 72 6e 20  DbName.  Return 
1a450 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e  NULL if not foun
1a460 64 2e 0a 2a 2f 0a 42 74 72 65 65 20 2a 73 71 6c  d..*/.Btree *sql
1a470 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65  ite3DbNameToBtre
1a480 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  e(sqlite3 *db, c
1a490 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
1a4a0 6d 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  me){.  int i;.  
1a4b0 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e  for(i=0; i<db->n
1a4c0 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  Db; i++){.    if
1a4d0 28 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74  ( db->aDb[i].pBt
1a4e0 0a 20 20 20 20 20 26 26 20 28 7a 44 62 4e 61 6d  .     && (zDbNam
1a4f0 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53  e==0 || sqlite3S
1a500 74 72 49 43 6d 70 28 7a 44 62 4e 61 6d 65 2c 20  trICmp(zDbName, 
1a510 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 4e 61 6d 65  db->aDb[i].zName
1a520 29 3d 3d 30 29 0a 20 20 20 20 29 7b 0a 20 20 20  )==0).    ){.   
1a530 20 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 44     return db->aD
1a540 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 7d 0a  b[i].pBt;.    }.
1a550 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
1a560 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a570 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 6f 66 20  the filename of 
1a580 74 68 65 20 64 61 74 61 62 61 73 65 20 61 73 73  the database ass
1a590 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
1a5a0 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
1a5b0 63 74 69 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  ction..*/.const 
1a5c0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 62  char *sqlite3_db
1a5d0 5f 66 69 6c 65 6e 61 6d 65 28 73 71 6c 69 74 65  _filename(sqlite
1a5e0 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1a5f0 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42  r *zDbName){.  B
1a600 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71 6c 69  tree *pBt = sqli
1a610 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
1a620 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  (db, zDbName);. 
1a630 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71   return pBt ? sq
1a640 6c 69 74 65 33 42 74 72 65 65 47 65 74 46 69 6c  lite3BtreeGetFil
1a650 65 6e 61 6d 65 28 70 42 74 29 20 3a 20 30 3b 0a  ename(pBt) : 0;.
1a660 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
1a670 31 20 69 66 20 64 61 74 61 62 61 73 65 20 69 73  1 if database is
1a680 20 72 65 61 64 2d 6f 6e 6c 79 20 6f 72 20 30 20   read-only or 0 
1a690 69 66 20 72 65 61 64 2f 77 72 69 74 65 2e 20 20  if read/write.  
1a6a0 52 65 74 75 72 6e 20 2d 31 20 69 66 0a 2a 2a 20  Return -1 if.** 
1a6b0 6e 6f 20 73 75 63 68 20 64 61 74 61 62 61 73 65  no such database
1a6c0 20 65 78 69 73 74 73 2e 0a 2a 2f 0a 69 6e 74 20   exists..*/.int 
1a6d0 73 71 6c 69 74 65 33 5f 64 62 5f 72 65 61 64 6f  sqlite3_db_reado
1a6e0 6e 6c 79 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  nly(sqlite3 *db,
1a6f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1a700 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Name){.  Btree *
1a710 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
1a720 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
1a730 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
1a740 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 50  n pBt ? sqlite3P
1a750 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 73  agerIsreadonly(s
1a760 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
1a770 28 70 42 74 29 29 20 3a 20 2d 31 3b 0a 7d 0a     (pBt)) : -1;.}.