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

Artifact e48517e3da289d93ad86e8b7b4f68078df5e6e51:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 4d 61 69 6e 20 66  ******.** Main f
0180: 69 6c 65 20 66 6f 72 20 74 68 65 20 53 51 4c 69  ile for the SQLi
0190: 74 65 20 6c 69 62 72 61 72 79 2e 20 20 54 68 65  te library.  The
01a0: 20 72 6f 75 74 69 6e 65 73 20 69 6e 20 74 68 69   routines in thi
01b0: 73 20 66 69 6c 65 0a 2a 2a 20 69 6d 70 6c 65 6d  s file.** implem
01c0: 65 6e 74 20 74 68 65 20 70 72 6f 67 72 61 6d 6d  ent the programm
01d0: 65 72 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20  er interface to 
01e0: 74 68 65 20 6c 69 62 72 61 72 79 2e 20 20 52 6f  the library.  Ro
01f0: 75 74 69 6e 65 73 20 69 6e 0a 2a 2a 20 6f 74 68  utines in.** oth
0200: 65 72 20 66 69 6c 65 73 20 61 72 65 20 66 6f 72  er files are for
0210: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 62 79   internal use by
0220: 20 53 51 4c 69 74 65 20 61 6e 64 20 73 68 6f 75   SQLite and shou
0230: 6c 64 20 6e 6f 74 20 62 65 0a 2a 2a 20 61 63 63  ld not be.** acc
0240: 65 73 73 65 64 20 62 79 20 75 73 65 72 73 20 6f  essed by users o
0250: 66 20 74 68 65 20 6c 69 62 72 61 72 79 2e 0a 2a  f the library..*
0260: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0270: 74 65 49 6e 74 2e 68 22 0a 0a 23 69 66 64 65 66  teInt.h"..#ifdef
0280: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46   SQLITE_ENABLE_F
0290: 54 53 33 0a 23 20 69 6e 63 6c 75 64 65 20 22 66  TS3.# include "f
02a0: 74 73 33 2e 68 22 0a 23 65 6e 64 69 66 0a 23 69  ts3.h".#endif.#i
02b0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
02c0: 4c 45 5f 52 54 52 45 45 0a 23 20 69 6e 63 6c 75  LE_RTREE.# inclu
02d0: 64 65 20 22 72 74 72 65 65 2e 68 22 0a 23 65 6e  de "rtree.h".#en
02e0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
02f0: 45 5f 45 4e 41 42 4c 45 5f 49 43 55 0a 23 20 69  E_ENABLE_ICU.# i
0300: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 69 63  nclude "sqliteic
0310: 75 2e 68 22 0a 23 65 6e 64 69 66 0a 0a 23 69 66  u.h".#endif..#if
0320: 6e 64 65 66 20 53 51 4c 49 54 45 5f 41 4d 41 4c  ndef SQLITE_AMAL
0330: 47 41 4d 41 54 49 4f 4e 0a 2f 2a 20 49 4d 50 4c  GAMATION./* IMPL
0340: 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52  EMENTATION-OF: R
0350: 2d 34 36 36 35 36 2d 34 35 31 35 36 20 54 68 65  -46656-45156 The
0360: 20 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e   sqlite3_version
0370: 5b 5d 20 73 74 72 69 6e 67 20 63 6f 6e 73 74 61  [] string consta
0380: 6e 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74  nt.** contains t
0390: 68 65 20 74 65 78 74 20 6f 66 20 53 51 4c 49 54  he text of SQLIT
03a0: 45 5f 56 45 52 53 49 4f 4e 20 6d 61 63 72 6f 2e  E_VERSION macro.
03b0: 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20   .*/.const char 
03c0: 73 71 6c 69 74 65 33 5f 76 65 72 73 69 6f 6e 5b  sqlite3_version[
03d0: 5d 20 3d 20 53 51 4c 49 54 45 5f 56 45 52 53 49  ] = SQLITE_VERSI
03e0: 4f 4e 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 49  ON;.#endif../* I
03f0: 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46  MPLEMENTATION-OF
0400: 3a 20 52 2d 35 33 35 33 36 2d 34 32 35 37 35 20  : R-53536-42575 
0410: 54 68 65 20 73 71 6c 69 74 65 33 5f 6c 69 62 76  The sqlite3_libv
0420: 65 72 73 69 6f 6e 28 29 20 66 75 6e 63 74 69 6f  ersion() functio
0430: 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 61 20 70  n returns.** a p
0440: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 74 6f  ointer to the to
0450: 20 74 68 65 20 73 71 6c 69 74 65 33 5f 76 65 72   the sqlite3_ver
0460: 73 69 6f 6e 5b 5d 20 73 74 72 69 6e 67 20 63 6f  sion[] string co
0470: 6e 73 74 61 6e 74 2e 20 0a 2a 2f 0a 63 6f 6e 73  nstant. .*/.cons
0480: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  t char *sqlite3_
0490: 6c 69 62 76 65 72 73 69 6f 6e 28 76 6f 69 64 29  libversion(void)
04a0: 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33  { return sqlite3
04b0: 5f 76 65 72 73 69 6f 6e 3b 20 7d 0a 0a 2f 2a 20  _version; }../* 
04c0: 49 4d 50 4c 45 4d 45 4e 54 41 54 49 4f 4e 2d 4f  IMPLEMENTATION-O
04d0: 46 3a 20 52 2d 36 33 31 32 34 2d 33 39 33 30 30  F: R-63124-39300
04e0: 20 54 68 65 20 73 71 6c 69 74 65 33 5f 73 6f 75   The sqlite3_sou
04f0: 72 63 65 69 64 28 29 20 66 75 6e 63 74 69 6f 6e  rceid() function
0500: 20 72 65 74 75 72 6e 73 20 61 0a 2a 2a 20 70 6f   returns a.** po
0510: 69 6e 74 65 72 20 74 6f 20 61 20 73 74 72 69 6e  inter to a strin
0520: 67 20 63 6f 6e 73 74 61 6e 74 20 77 68 6f 73 65  g constant whose
0530: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 73 61   value is the sa
0540: 6d 65 20 61 73 20 74 68 65 0a 2a 2a 20 53 51 4c  me as the.** SQL
0550: 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 20 43 20  ITE_SOURCE_ID C 
0560: 70 72 65 70 72 6f 63 65 73 73 6f 72 20 6d 61 63  preprocessor mac
0570: 72 6f 2e 20 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ro. .*/.const ch
0580: 61 72 20 2a 73 71 6c 69 74 65 33 5f 73 6f 75 72  ar *sqlite3_sour
0590: 63 65 69 64 28 76 6f 69 64 29 7b 20 72 65 74 75  ceid(void){ retu
05a0: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  rn SQLITE_SOURCE
05b0: 5f 49 44 3b 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45  _ID; }../* IMPLE
05c0: 4d 45 4e 54 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d  MENTATION-OF: R-
05d0: 33 35 32 31 30 2d 36 33 35 30 38 20 54 68 65 20  35210-63508 The 
05e0: 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72 73 69  sqlite3_libversi
05f0: 6f 6e 5f 6e 75 6d 62 65 72 28 29 20 66 75 6e 63  on_number() func
0600: 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73 20  tion.** returns 
0610: 61 6e 20 69 6e 74 65 67 65 72 20 65 71 75 61 6c  an integer equal
0620: 20 74 6f 20 53 51 4c 49 54 45 5f 56 45 52 53 49   to SQLITE_VERSI
0630: 4f 4e 5f 4e 55 4d 42 45 52 2e 0a 2a 2f 0a 69 6e  ON_NUMBER..*/.in
0640: 74 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72  t sqlite3_libver
0650: 73 69 6f 6e 5f 6e 75 6d 62 65 72 28 76 6f 69 64  sion_number(void
0660: 29 7b 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ){ return SQLITE
0670: 5f 56 45 52 53 49 4f 4e 5f 4e 55 4d 42 45 52 3b  _VERSION_NUMBER;
0680: 20 7d 0a 0a 2f 2a 20 49 4d 50 4c 45 4d 45 4e 54   }../* IMPLEMENT
0690: 41 54 49 4f 4e 2d 4f 46 3a 20 52 2d 32 30 37 39  ATION-OF: R-2079
06a0: 30 2d 31 34 30 32 35 20 54 68 65 20 73 71 6c 69  0-14025 The sqli
06b0: 74 65 33 5f 74 68 72 65 61 64 73 61 66 65 28 29  te3_threadsafe()
06c0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
06d0: 73 0a 2a 2a 20 7a 65 72 6f 20 69 66 20 61 6e 64  s.** zero if and
06e0: 20 6f 6e 6c 79 20 69 66 20 53 51 4c 69 74 65 20   only if SQLite 
06f0: 77 61 73 20 63 6f 6d 70 69 6c 65 64 20 77 69 74  was compiled wit
0700: 68 20 6d 75 74 65 78 69 6e 67 20 63 6f 64 65 20  h mutexing code 
0710: 6f 6d 69 74 74 65 64 20 64 75 65 20 74 6f 0a 2a  omitted due to.*
0720: 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 54 48 52  * the SQLITE_THR
0730: 45 41 44 53 41 46 45 20 63 6f 6d 70 69 6c 65 2d  EADSAFE compile-
0740: 74 69 6d 65 20 6f 70 74 69 6f 6e 20 62 65 69 6e  time option bein
0750: 67 20 73 65 74 20 74 6f 20 30 2e 0a 2a 2f 0a 69  g set to 0..*/.i
0760: 6e 74 20 73 71 6c 69 74 65 33 5f 74 68 72 65 61  nt sqlite3_threa
0770: 64 73 61 66 65 28 76 6f 69 64 29 7b 20 72 65 74  dsafe(void){ ret
0780: 75 72 6e 20 53 51 4c 49 54 45 5f 54 48 52 45 41  urn SQLITE_THREA
0790: 44 53 41 46 45 3b 20 7d 0a 0a 23 69 66 20 21 64  DSAFE; }..#if !d
07a0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
07b0: 49 54 5f 54 52 41 43 45 29 20 26 26 20 64 65 66  IT_TRACE) && def
07c0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
07d0: 4c 45 5f 49 4f 54 52 41 43 45 29 0a 2f 2a 0a 2a  LE_IOTRACE)./*.*
07e0: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
07f0: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e  ng function poin
0800: 74 65 72 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  ter is not NULL 
0810: 61 6e 64 20 69 66 0a 2a 2a 20 53 51 4c 49 54 45  and if.** SQLITE
0820: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 20  _ENABLE_IOTRACE 
0830: 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e  is enabled, then
0840: 20 6d 65 73 73 61 67 65 73 20 64 65 73 63 72 69   messages descri
0850: 62 69 6e 67 0a 2a 2a 20 49 2f 4f 20 61 63 74 69  bing.** I/O acti
0860: 76 65 20 61 72 65 20 77 72 69 74 74 65 6e 20 75  ve are written u
0870: 73 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69  sing this functi
0880: 6f 6e 2e 20 20 54 68 65 73 65 20 6d 65 73 73 61  on.  These messa
0890: 67 65 73 0a 2a 2a 20 61 72 65 20 69 6e 74 65 6e  ges.** are inten
08a0: 64 65 64 20 66 6f 72 20 64 65 62 75 67 67 69 6e  ded for debuggin
08b0: 67 20 61 63 74 69 76 69 74 79 20 6f 6e 6c 79 2e  g activity only.
08c0: 0a 2a 2f 0a 76 6f 69 64 20 28 2a 73 71 6c 69 74  .*/.void (*sqlit
08d0: 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73 74  e3IoTrace)(const
08e0: 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 20 3d 20 30   char*, ...) = 0
08f0: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
0900: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
0910: 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
0920: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74 72   points to a str
0930: 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68 65  ing which is the
0940: 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64 69  .** name of a di
0950: 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74 68  rectory, then th
0960: 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69 6c  at directory wil
0970: 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74 6f  l be used to sto
0980: 72 65 0a 2a 2a 20 74 65 6d 70 6f 72 61 72 79 20  re.** temporary 
0990: 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  files..**.** See
09a0: 20 61 6c 73 6f 20 74 68 65 20 22 50 52 41 47 4d   also the "PRAGM
09b0: 41 20 74 65 6d 70 5f 73 74 6f 72 65 5f 64 69 72  A temp_store_dir
09c0: 65 63 74 6f 72 79 22 20 53 51 4c 20 63 6f 6d 6d  ectory" SQL comm
09d0: 61 6e 64 2e 0a 2a 2f 0a 63 68 61 72 20 2a 73 71  and..*/.char *sq
09e0: 6c 69 74 65 33 5f 74 65 6d 70 5f 64 69 72 65 63  lite3_temp_direc
09f0: 74 6f 72 79 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  tory = 0;../*.**
0a00: 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   If the followin
0a10: 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
0a20: 65 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  e points to a st
0a30: 72 69 6e 67 20 77 68 69 63 68 20 69 73 20 74 68  ring which is th
0a40: 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 61 20 64  e.** name of a d
0a50: 69 72 65 63 74 6f 72 79 2c 20 74 68 65 6e 20 74  irectory, then t
0a60: 68 61 74 20 64 69 72 65 63 74 6f 72 79 20 77 69  hat directory wi
0a70: 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20 73 74  ll be used to st
0a80: 6f 72 65 0a 2a 2a 20 61 6c 6c 20 64 61 74 61 62  ore.** all datab
0a90: 61 73 65 20 66 69 6c 65 73 20 73 70 65 63 69 66  ase files specif
0aa0: 69 65 64 20 77 69 74 68 20 61 20 72 65 6c 61 74  ied with a relat
0ab0: 69 76 65 20 70 61 74 68 6e 61 6d 65 2e 0a 2a 2a  ive pathname..**
0ac0: 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 74 68 65  .** See also the
0ad0: 20 22 50 52 41 47 4d 41 20 64 61 74 61 5f 73 74   "PRAGMA data_st
0ae0: 6f 72 65 5f 64 69 72 65 63 74 6f 72 79 22 20 53  ore_directory" S
0af0: 51 4c 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 63  QL command..*/.c
0b00: 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 64 61 74  har *sqlite3_dat
0b10: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
0b20: 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69  ../*.** Initiali
0b30: 7a 65 20 53 51 4c 69 74 65 2e 20 20 0a 2a 2a 0a  ze SQLite.  .**.
0b40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
0b50: 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 74  must be called t
0b60: 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
0b70: 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
0b80: 6f 6e 2c 0a 2a 2a 20 56 46 53 2c 20 61 6e 64 20  on,.** VFS, and 
0b90: 6d 75 74 65 78 20 73 75 62 73 79 73 74 65 6d 73  mutex subsystems
0ba0: 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20   prior to doing 
0bb0: 61 6e 79 20 73 65 72 69 6f 75 73 20 77 6f 72 6b  any serious work
0bc0: 20 77 69 74 68 0a 2a 2a 20 53 51 4c 69 74 65 2e   with.** SQLite.
0bd0: 20 20 42 75 74 20 61 73 20 6c 6f 6e 67 20 61 73    But as long as
0be0: 20 79 6f 75 20 64 6f 20 6e 6f 74 20 63 6f 6d 70   you do not comp
0bf0: 69 6c 65 20 77 69 74 68 20 53 51 4c 49 54 45 5f  ile with SQLITE_
0c00: 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a 2a 2a  OMIT_AUTOINIT.**
0c10: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
0c20: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 61 75 74  ll be called aut
0c30: 6f 6d 61 74 69 63 61 6c 6c 79 20 62 79 20 6b 65  omatically by ke
0c40: 79 20 72 6f 75 74 69 6e 65 73 20 73 75 63 68 20  y routines such 
0c50: 61 73 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 6f 70  as.** sqlite3_op
0c60: 65 6e 28 29 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  en().  .**.** Th
0c70: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
0c80: 6e 6f 2d 6f 70 20 65 78 63 65 70 74 20 6f 6e 20  no-op except on 
0c90: 69 74 73 20 76 65 72 79 20 66 69 72 73 74 20 63  its very first c
0ca0: 61 6c 6c 20 66 6f 72 20 74 68 65 20 70 72 6f 63  all for the proc
0cb0: 65 73 73 2c 0a 2a 2a 20 6f 72 20 66 6f 72 20 74  ess,.** or for t
0cc0: 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 61 66  he first call af
0cd0: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 73 71  ter a call to sq
0ce0: 6c 69 74 65 33 5f 73 68 75 74 64 6f 77 6e 2e 0a  lite3_shutdown..
0cf0: 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
0d00: 74 68 72 65 61 64 20 74 6f 20 63 61 6c 6c 20 74  thread to call t
0d10: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
0d20: 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61 74   the initializat
0d30: 69 6f 6e 20 74 6f 0a 2a 2a 20 63 6f 6d 70 6c 65  ion to.** comple
0d40: 74 69 6f 6e 2e 20 20 49 66 20 73 75 62 73 65 71  tion.  If subseq
0d50: 75 65 6e 74 20 74 68 72 65 61 64 73 20 63 61 6c  uent threads cal
0d60: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 62  l this routine b
0d70: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 0a  efore the first.
0d80: 2a 2a 20 74 68 72 65 61 64 20 68 61 73 20 66 69  ** thread has fi
0d90: 6e 69 73 68 65 64 20 74 68 65 20 69 6e 69 74 69  nished the initi
0da0: 61 6c 69 7a 61 74 69 6f 6e 20 70 72 6f 63 65 73  alization proces
0db0: 73 2c 20 74 68 65 6e 20 74 68 65 20 73 75 62 73  s, then the subs
0dc0: 65 71 75 65 6e 74 0a 2a 2a 20 74 68 72 65 61 64  equent.** thread
0dd0: 73 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74  s must block unt
0de0: 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 68 72  il the first thr
0df0: 65 61 64 20 66 69 6e 69 73 68 65 73 20 77 69 74  ead finishes wit
0e00: 68 20 74 68 65 20 69 6e 69 74 69 61 6c 69 7a 61  h the initializa
0e10: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
0e20: 66 69 72 73 74 20 74 68 72 65 61 64 20 6d 69 67  first thread mig
0e30: 68 74 20 63 61 6c 6c 20 74 68 69 73 20 72 6f 75  ht call this rou
0e40: 74 69 6e 65 20 72 65 63 75 72 73 69 76 65 6c 79  tine recursively
0e50: 2e 20 20 52 65 63 75 72 73 69 76 65 0a 2a 2a 20  .  Recursive.** 
0e60: 63 61 6c 6c 73 20 74 6f 20 74 68 69 73 20 72 6f  calls to this ro
0e70: 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6e 6f 74  utine should not
0e80: 20 62 6c 6f 63 6b 2c 20 6f 66 20 63 6f 75 72 73   block, of cours
0e90: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
0ea0: 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 61 74  e.** initializat
0eb0: 69 6f 6e 20 70 72 6f 63 65 73 73 20 77 6f 75 6c  ion process woul
0ec0: 64 20 6e 65 76 65 72 20 63 6f 6d 70 6c 65 74 65  d never complete
0ed0: 2e 0a 2a 2a 0a 2a 2a 20 4c 65 74 20 58 20 62 65  ..**.** Let X be
0ee0: 20 74 68 65 20 66 69 72 73 74 20 74 68 72 65 61   the first threa
0ef0: 64 20 74 6f 20 65 6e 74 65 72 20 74 68 69 73 20  d to enter this 
0f00: 72 6f 75 74 69 6e 65 2e 20 20 4c 65 74 20 59 20  routine.  Let Y 
0f10: 62 65 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  be some other.**
0f20: 20 74 68 72 65 61 64 2e 20 20 54 68 65 6e 20 77   thread.  Then w
0f30: 68 69 6c 65 20 74 68 65 20 69 6e 69 74 69 61 6c  hile the initial
0f40: 20 69 6e 76 6f 63 61 74 69 6f 6e 20 6f 66 20 74   invocation of t
0f50: 68 69 73 20 72 6f 75 74 69 6e 65 20 62 79 20 58  his routine by X
0f60: 20 69 73 0a 2a 2a 20 69 6e 63 6f 6d 70 6c 65 74   is.** incomplet
0f70: 65 2c 20 69 74 20 69 73 20 72 65 71 75 69 72 65  e, it is require
0f80: 64 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  d that:.**.**   
0f90: 20 2a 20 20 43 61 6c 6c 73 20 74 6f 20 74 68 69   *  Calls to thi
0fa0: 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20 59  s routine from Y
0fb0: 20 6d 75 73 74 20 62 6c 6f 63 6b 20 75 6e 74 69   must block unti
0fc0: 6c 20 74 68 65 20 6f 75 74 65 72 2d 6d 6f 73 74  l the outer-most
0fd0: 0a 2a 2a 20 20 20 20 20 20 20 63 61 6c 6c 20 62  .**       call b
0fe0: 79 20 58 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 2a  y X completes..*
0ff0: 2a 0a 2a 2a 20 20 20 20 2a 20 20 52 65 63 75 72  *.**    *  Recur
1000: 73 69 76 65 20 63 61 6c 6c 73 20 74 6f 20 74 68  sive calls to th
1010: 69 73 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  is routine from 
1020: 74 68 72 65 61 64 20 58 20 72 65 74 75 72 6e 20  thread X return 
1030: 69 6d 6d 65 64 69 61 74 65 6c 79 0a 2a 2a 20 20  immediately.**  
1040: 20 20 20 20 20 77 69 74 68 6f 75 74 20 62 6c 6f       without blo
1050: 63 6b 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  cking..*/.int sq
1060: 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65  lite3_initialize
1070: 28 76 6f 69 64 29 7b 0a 20 20 4d 55 54 45 58 5f  (void){.  MUTEX_
1080: 4c 4f 47 49 43 28 20 73 71 6c 69 74 65 33 5f 6d  LOGIC( sqlite3_m
1090: 75 74 65 78 20 2a 70 4d 61 73 74 65 72 3b 20 29  utex *pMaster; )
10a0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
10b0: 69 6e 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  in static mutex 
10c0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
10d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
1100: 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54   */.#ifdef SQLIT
1110: 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20 20 69  E_EXTRA_INIT.  i
1120: 6e 74 20 62 52 75 6e 45 78 74 72 61 49 6e 69 74  nt bRunExtraInit
1130: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1140: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
1150: 78 74 72 61 20 69 6e 69 74 69 61 6c 69 7a 61 74  xtra initializat
1160: 69 6f 6e 20 6e 65 65 64 65 64 20 2a 2f 0a 23 65  ion needed */.#e
1170: 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1180: 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20 72  ITE_OMIT_WSD.  r
1190: 63 20 3d 20 73 71 6c 69 74 65 33 5f 77 73 64 5f  c = sqlite3_wsd_
11a0: 69 6e 69 74 28 34 30 39 36 2c 20 32 34 29 3b 0a  init(4096, 24);.
11b0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11c0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
11d0: 6e 20 72 63 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  n rc;.  }.#endif
11e0: 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 69 74 65  ..  /* If SQLite
11f0: 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f 6d 70   is already comp
1200: 6c 65 74 65 6c 79 20 69 6e 69 74 69 61 6c 69 7a  letely initializ
1210: 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61  ed, then this ca
1220: 6c 6c 0a 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74  ll.  ** to sqlit
1230: 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 20  e3_initialize() 
1240: 73 68 6f 75 6c 64 20 62 65 20 61 20 6e 6f 2d 6f  should be a no-o
1250: 70 2e 20 20 42 75 74 20 74 68 65 20 69 6e 69 74  p.  But the init
1260: 69 61 6c 69 7a 61 74 69 6f 6e 0a 20 20 2a 2a 20  ialization.  ** 
1270: 6d 75 73 74 20 62 65 20 63 6f 6d 70 6c 65 74 65  must be complete
1280: 2e 20 20 53 6f 20 69 73 49 6e 69 74 20 6d 75 73  .  So isInit mus
1290: 74 20 6e 6f 74 20 62 65 20 73 65 74 20 75 6e 74  t not be set unt
12a0: 69 6c 20 74 68 65 20 76 65 72 79 20 65 6e 64 0a  il the very end.
12b0: 20 20 2a 2a 20 6f 66 20 74 68 69 73 20 72 6f 75    ** of this rou
12c0: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tine..  */.  if(
12d0: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
12e0: 6e 66 69 67 2e 69 73 49 6e 69 74 20 29 20 72 65  nfig.isInit ) re
12f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1300: 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1310: 74 68 65 20 6d 75 74 65 78 20 73 75 62 73 79 73  the mutex subsys
1320: 74 65 6d 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  tem is initializ
1330: 65 64 2e 20 20 49 66 20 75 6e 61 62 6c 65 20 74  ed.  If unable t
1340: 6f 20 0a 20 20 2a 2a 20 69 6e 69 74 69 61 6c 69  o .  ** initiali
1350: 7a 65 20 74 68 65 20 6d 75 74 65 78 20 73 75 62  ze the mutex sub
1360: 73 79 73 74 65 6d 2c 20 72 65 74 75 72 6e 20 65  system, return e
1370: 61 72 6c 79 20 77 69 74 68 20 74 68 65 20 65 72  arly with the er
1380: 72 6f 72 2e 0a 20 20 2a 2a 20 49 66 20 74 68 65  ror..  ** If the
1390: 20 73 79 73 74 65 6d 20 69 73 20 73 6f 20 73 69   system is so si
13a0: 63 6b 20 74 68 61 74 20 77 65 20 61 72 65 20 75  ck that we are u
13b0: 6e 61 62 6c 65 20 74 6f 20 61 6c 6c 6f 63 61 74  nable to allocat
13c0: 65 20 61 20 6d 75 74 65 78 2c 0a 20 20 2a 2a 20  e a mutex,.  ** 
13d0: 74 68 65 72 65 20 69 73 20 6e 6f 74 20 6d 75 63  there is not muc
13e0: 68 20 53 51 4c 69 74 65 20 69 73 20 67 6f 69 6e  h SQLite is goin
13f0: 67 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  g to be able to 
1400: 64 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  do..  **.  ** Th
1410: 65 20 6d 75 74 65 78 20 73 75 62 73 79 73 74 65  e mutex subsyste
1420: 6d 20 6d 75 73 74 20 74 61 6b 65 20 63 61 72 65  m must take care
1430: 20 6f 66 20 73 65 72 69 61 6c 69 7a 69 6e 67 20   of serializing 
1440: 69 74 73 20 6f 77 6e 0a 20 20 2a 2a 20 69 6e 69  its own.  ** ini
1450: 74 69 61 6c 69 7a 61 74 69 6f 6e 2e 0a 20 20 2a  tialization..  *
1460: 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
1470: 4d 75 74 65 78 49 6e 69 74 28 29 3b 0a 20 20 69  MutexInit();.  i
1480: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1490: 63 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c  c;..  /* Initial
14a0: 69 7a 65 20 74 68 65 20 6d 61 6c 6c 6f 63 28 29  ize the malloc()
14b0: 20 73 79 73 74 65 6d 20 61 6e 64 20 74 68 65 20   system and the 
14c0: 72 65 63 75 72 73 69 76 65 20 70 49 6e 69 74 4d  recursive pInitM
14d0: 75 74 65 78 20 6d 75 74 65 78 2e 0a 20 20 2a 2a  utex mutex..  **
14e0: 20 54 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 20   This operation 
14f0: 69 73 20 70 72 6f 74 65 63 74 65 64 20 62 79 20  is protected by 
1500: 74 68 65 20 53 54 41 54 49 43 5f 4d 41 53 54 45  the STATIC_MASTE
1510: 52 20 6d 75 74 65 78 2e 20 20 4e 6f 74 65 20 74  R mutex.  Note t
1520: 68 61 74 0a 20 20 2a 2a 20 4d 75 74 65 78 41 6c  hat.  ** MutexAl
1530: 6c 6f 63 28 29 20 69 73 20 63 61 6c 6c 65 64 20  loc() is called 
1540: 66 6f 72 20 61 20 73 74 61 74 69 63 20 6d 75 74  for a static mut
1550: 65 78 20 70 72 69 6f 72 20 74 6f 20 69 6e 69 74  ex prior to init
1560: 69 61 6c 69 7a 69 6e 67 20 74 68 65 0a 20 20 2a  ializing the.  *
1570: 2a 20 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73 74  * malloc subsyst
1580: 65 6d 20 2d 20 74 68 69 73 20 69 6d 70 6c 69 65  em - this implie
1590: 73 20 74 68 61 74 20 74 68 65 20 61 6c 6c 6f 63  s that the alloc
15a0: 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 61 74 69  ation of a stati
15b0: 63 0a 20 20 2a 2a 20 6d 75 74 65 78 20 6d 75 73  c.  ** mutex mus
15c0: 74 20 6e 6f 74 20 72 65 71 75 69 72 65 20 73 75  t not require su
15d0: 70 70 6f 72 74 20 66 72 6f 6d 20 74 68 65 20 6d  pport from the m
15e0: 61 6c 6c 6f 63 20 73 75 62 73 79 73 74 65 6d 2e  alloc subsystem.
15f0: 0a 20 20 2a 2f 0a 20 20 4d 55 54 45 58 5f 4c 4f  .  */.  MUTEX_LO
1600: 47 49 43 28 20 70 4d 61 73 74 65 72 20 3d 20 73  GIC( pMaster = s
1610: 71 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63  qlite3MutexAlloc
1620: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1630: 41 54 49 43 5f 4d 41 53 54 45 52 29 3b 20 29 0a  ATIC_MASTER); ).
1640: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1650: 65 6e 74 65 72 28 70 4d 61 73 74 65 72 29 3b 0a  enter(pMaster);.
1660: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
1670: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
1680: 74 20 3d 20 31 3b 0a 20 20 69 66 28 20 21 73 71  t = 1;.  if( !sq
1690: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
16a0: 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29  g.isMallocInit )
16b0: 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
16c0: 65 33 4d 61 6c 6c 6f 63 49 6e 69 74 28 29 3b 0a  e3MallocInit();.
16d0: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
16e0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
16f0: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1700: 69 67 2e 69 73 4d 61 6c 6c 6f 63 49 6e 69 74 20  ig.isMallocInit 
1710: 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 21 73 71  = 1;.    if( !sq
1720: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1730: 67 2e 70 49 6e 69 74 4d 75 74 65 78 20 29 7b 0a  g.pInitMutex ){.
1740: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
1750: 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74 4d  balConfig.pInitM
1760: 75 74 65 78 20 3d 0a 20 20 20 20 20 20 20 20 20  utex =.         
1770: 20 20 73 71 6c 69 74 65 33 4d 75 74 65 78 41 6c    sqlite3MutexAl
1780: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1790: 5f 52 45 43 55 52 53 49 56 45 29 3b 0a 20 20 20  _RECURSIVE);.   
17a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c     if( sqlite3Gl
17b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
17c0: 4d 75 74 65 78 20 26 26 20 21 73 71 6c 69 74 65  Mutex && !sqlite
17d0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
17e0: 6e 69 74 4d 75 74 65 78 20 29 7b 0a 20 20 20 20  nitMutex ){.    
17f0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1800: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
1810: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
1820: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1830: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1840: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
1850: 4d 75 74 65 78 2b 2b 3b 0a 20 20 7d 0a 20 20 73  Mutex++;.  }.  s
1860: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
1870: 76 65 28 70 4d 61 73 74 65 72 29 3b 0a 0a 20 20  ve(pMaster);..  
1880: 2f 2a 20 49 66 20 72 63 20 69 73 20 6e 6f 74 20  /* If rc is not 
1890: 53 51 4c 49 54 45 5f 4f 4b 20 61 74 20 74 68 69  SQLITE_OK at thi
18a0: 73 20 70 6f 69 6e 74 2c 20 74 68 65 6e 20 65 69  s point, then ei
18b0: 74 68 65 72 20 74 68 65 20 6d 61 6c 6c 6f 63 0a  ther the malloc.
18c0: 20 20 2a 2a 20 73 75 62 73 79 73 74 65 6d 20 63    ** subsystem c
18d0: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 69 6e 69 74  ould not be init
18e0: 69 61 6c 69 7a 65 64 20 6f 72 20 74 68 65 20 73  ialized or the s
18f0: 79 73 74 65 6d 20 66 61 69 6c 65 64 20 74 6f 20  ystem failed to 
1900: 61 6c 6c 6f 63 61 74 65 0a 20 20 2a 2a 20 74 68  allocate.  ** th
1910: 65 20 70 49 6e 69 74 4d 75 74 65 78 20 6d 75 74  e pInitMutex mut
1920: 65 78 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72  ex. Return an er
1930: 72 6f 72 20 69 6e 20 65 69 74 68 65 72 20 63 61  ror in either ca
1940: 73 65 2e 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  se.  */.  if( rc
1950: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1960: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1970: 7d 0a 0a 20 20 2f 2a 20 44 6f 20 74 68 65 20 72  }..  /* Do the r
1980: 65 73 74 20 6f 66 20 74 68 65 20 69 6e 69 74 69  est of the initi
1990: 61 6c 69 7a 61 74 69 6f 6e 20 75 6e 64 65 72 20  alization under 
19a0: 74 68 65 20 72 65 63 75 72 73 69 76 65 20 6d 75  the recursive mu
19b0: 74 65 78 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74  tex so.  ** that
19c0: 20 77 65 20 77 69 6c 6c 20 62 65 20 61 62 6c 65   we will be able
19d0: 20 74 6f 20 68 61 6e 64 6c 65 20 72 65 63 75 72   to handle recur
19e0: 73 69 76 65 20 63 61 6c 6c 73 20 69 6e 74 6f 0a  sive calls into.
19f0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 69 6e 69    ** sqlite3_ini
1a00: 74 69 61 6c 69 7a 65 28 29 2e 20 20 54 68 65 20  tialize().  The 
1a10: 72 65 63 75 72 73 69 76 65 20 63 61 6c 6c 73 20  recursive calls 
1a20: 6e 6f 72 6d 61 6c 6c 79 20 63 6f 6d 65 20 74 68  normally come th
1a30: 72 6f 75 67 68 0a 20 20 2a 2a 20 73 71 6c 69 74  rough.  ** sqlit
1a40: 65 33 5f 6f 73 5f 69 6e 69 74 28 29 20 77 68 65  e3_os_init() whe
1a50: 6e 20 69 74 20 69 6e 76 6f 6b 65 73 20 73 71 6c  n it invokes sql
1a60: 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65  ite3_vfs_registe
1a70: 72 28 29 2c 20 62 75 74 20 6f 74 68 65 72 0a 20  r(), but other. 
1a80: 20 2a 2a 20 72 65 63 75 72 73 69 76 65 20 63 61   ** recursive ca
1a90: 6c 6c 73 20 6d 69 67 68 74 20 61 6c 73 6f 20 62  lls might also b
1aa0: 65 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 2a 2a  e possible..  **
1ab0: 0a 20 20 2a 2a 20 49 4d 50 4c 45 4d 45 4e 54 41  .  ** IMPLEMENTA
1ac0: 54 49 4f 4e 2d 4f 46 3a 20 52 2d 30 30 31 34 30  TION-OF: R-00140
1ad0: 2d 33 37 34 34 35 20 53 51 4c 69 74 65 20 61 75  -37445 SQLite au
1ae0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 73 65 72 69  tomatically seri
1af0: 61 6c 69 7a 65 73 20 63 61 6c 6c 73 0a 20 20 2a  alizes calls.  *
1b00: 2a 20 74 6f 20 74 68 65 20 78 49 6e 69 74 20 6d  * to the xInit m
1b10: 65 74 68 6f 64 2c 20 73 6f 20 74 68 65 20 78 49  ethod, so the xI
1b20: 6e 69 74 20 6d 65 74 68 6f 64 20 6e 65 65 64 20  nit method need 
1b30: 6e 6f 74 20 62 65 20 74 68 72 65 61 64 73 61 66  not be threadsaf
1b40: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  e..  **.  ** The
1b50: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 75 74 65 78   following mutex
1b60: 20 69 73 20 77 68 61 74 20 73 65 72 69 61 6c 69   is what seriali
1b70: 7a 65 73 20 61 63 63 65 73 73 20 74 6f 20 74 68  zes access to th
1b80: 65 20 61 70 70 64 65 66 20 70 63 61 63 68 65 20  e appdef pcache 
1b90: 78 49 6e 69 74 0a 20 20 2a 2a 20 6d 65 74 68 6f  xInit.  ** metho
1ba0: 64 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65 33  ds.  The sqlite3
1bb0: 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 2e  _pcache_methods.
1bc0: 78 49 6e 69 74 28 29 20 61 6c 6c 20 69 73 20 65  xInit() all is e
1bd0: 6d 62 65 64 64 65 64 20 69 6e 20 74 68 65 0a 20  mbedded in the. 
1be0: 20 2a 2a 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69   ** call to sqli
1bf0: 74 65 33 50 63 61 63 68 65 49 6e 69 74 69 61 6c  te3PcacheInitial
1c00: 69 7a 65 28 29 2e 0a 20 20 2a 2f 0a 20 20 73 71  ize()..  */.  sq
1c10: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c20: 72 28 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  r(sqlite3GlobalC
1c30: 6f 6e 66 69 67 2e 70 49 6e 69 74 4d 75 74 65 78  onfig.pInitMutex
1c40: 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
1c50: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1c60: 6e 69 74 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  nit==0 && sqlite
1c70: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e  3GlobalConfig.in
1c80: 50 72 6f 67 72 65 73 73 3d 3d 30 20 29 7b 0a 20  Progress==0 ){. 
1c90: 20 20 20 46 75 6e 63 44 65 66 48 61 73 68 20 2a     FuncDefHash *
1ca0: 70 48 61 73 68 20 3d 20 26 47 4c 4f 42 41 4c 28  pHash = &GLOBAL(
1cb0: 46 75 6e 63 44 65 66 48 61 73 68 2c 20 73 71 6c  FuncDefHash, sql
1cc0: 69 74 65 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69  ite3GlobalFuncti
1cd0: 6f 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ons);.    sqlite
1ce0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 6e  3GlobalConfig.in
1cf0: 50 72 6f 67 72 65 73 73 20 3d 20 31 3b 0a 20 20  Progress = 1;.  
1d00: 20 20 6d 65 6d 73 65 74 28 70 48 61 73 68 2c 20    memset(pHash, 
1d10: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
1d20: 33 47 6c 6f 62 61 6c 46 75 6e 63 74 69 6f 6e 73  3GlobalFunctions
1d30: 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 52  ));.    sqlite3R
1d40: 65 67 69 73 74 65 72 47 6c 6f 62 61 6c 46 75 6e  egisterGlobalFun
1d50: 63 74 69 6f 6e 73 28 29 3b 0a 20 20 20 20 69 66  ctions();.    if
1d60: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
1d70: 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65 49 6e  onfig.isPCacheIn
1d80: 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  it==0 ){.      r
1d90: 63 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  c = sqlite3Pcach
1da0: 65 49 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  eInitialize();. 
1db0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d     }.    if( rc=
1dc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1dd0: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
1de0: 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63 68 65  lConfig.isPCache
1df0: 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  Init = 1;.      
1e00: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 49 6e  rc = sqlite3OsIn
1e10: 69 74 28 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  it();.    }.    
1e20: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1e30: 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  K ){.      sqlit
1e40: 65 33 50 43 61 63 68 65 42 75 66 66 65 72 53 65  e3PCacheBufferSe
1e50: 74 75 70 28 20 73 71 6c 69 74 65 33 47 6c 6f 62  tup( sqlite3Glob
1e60: 61 6c 43 6f 6e 66 69 67 2e 70 50 61 67 65 2c 20  alConfig.pPage, 
1e70: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
1e80: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
1e90: 7a 50 61 67 65 2c 20 73 71 6c 69 74 65 33 47 6c  zPage, sqlite3Gl
1ea0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67 65  obalConfig.nPage
1eb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ec0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
1ed0: 6e 69 74 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  nit = 1;.#ifdef 
1ee0: 53 51 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49  SQLITE_EXTRA_INI
1ef0: 54 0a 20 20 20 20 20 20 62 52 75 6e 45 78 74 72  T.      bRunExtr
1f00: 61 49 6e 69 74 20 3d 20 31 3b 0a 23 65 6e 64 69  aInit = 1;.#endi
1f10: 66 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  f.    }.    sqli
1f20: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
1f30: 69 6e 50 72 6f 67 72 65 73 73 20 3d 20 30 3b 0a  inProgress = 0;.
1f40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
1f50: 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65  tex_leave(sqlite
1f60: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49  3GlobalConfig.pI
1f70: 6e 69 74 4d 75 74 65 78 29 3b 0a 0a 20 20 2f 2a  nitMutex);..  /*
1f80: 20 47 6f 20 62 61 63 6b 20 75 6e 64 65 72 20 74   Go back under t
1f90: 68 65 20 73 74 61 74 69 63 20 6d 75 74 65 78 20  he static mutex 
1fa0: 61 6e 64 20 63 6c 65 61 6e 20 75 70 20 74 68 65  and clean up the
1fb0: 20 72 65 63 75 72 73 69 76 65 0a 20 20 2a 2a 20   recursive.  ** 
1fc0: 6d 75 74 65 78 20 74 6f 20 70 72 65 76 65 6e 74  mutex to prevent
1fd0: 20 61 20 72 65 73 6f 75 72 63 65 20 6c 65 61 6b   a resource leak
1fe0: 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
1ff0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 70 4d 61  _mutex_enter(pMa
2000: 73 74 65 72 29 3b 0a 20 20 73 71 6c 69 74 65 33  ster);.  sqlite3
2010: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65  GlobalConfig.nRe
2020: 66 49 6e 69 74 4d 75 74 65 78 2d 2d 3b 0a 20 20  fInitMutex--;.  
2030: 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61  if( sqlite3Globa
2040: 6c 43 6f 6e 66 69 67 2e 6e 52 65 66 49 6e 69 74  lConfig.nRefInit
2050: 4d 75 74 65 78 3c 3d 30 20 29 7b 0a 20 20 20 20  Mutex<=0 ){.    
2060: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 47  assert( sqlite3G
2070: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 52 65 66  lobalConfig.nRef
2080: 49 6e 69 74 4d 75 74 65 78 3d 3d 30 20 29 3b 0a  InitMutex==0 );.
2090: 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
20a0: 78 5f 66 72 65 65 28 73 71 6c 69 74 65 33 47 6c  x_free(sqlite3Gl
20b0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 49 6e 69 74  obalConfig.pInit
20c0: 4d 75 74 65 78 29 3b 0a 20 20 20 20 73 71 6c 69  Mutex);.    sqli
20d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
20e0: 70 49 6e 69 74 4d 75 74 65 78 20 3d 20 30 3b 0a  pInitMutex = 0;.
20f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
2100: 74 65 78 5f 6c 65 61 76 65 28 70 4d 61 73 74 65  tex_leave(pMaste
2110: 72 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f  r);..  /* The fo
2120: 6c 6c 6f 77 69 6e 67 20 69 73 20 6a 75 73 74 20  llowing is just 
2130: 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b 20 74  a sanity check t
2140: 6f 20 6d 61 6b 65 20 73 75 72 65 20 53 51 4c 69  o make sure SQLi
2150: 74 65 20 68 61 73 0a 20 20 2a 2a 20 62 65 65 6e  te has.  ** been
2160: 20 63 6f 6d 70 69 6c 65 64 20 63 6f 72 72 65 63   compiled correc
2170: 74 6c 79 2e 20 20 49 74 20 69 73 20 69 6d 70 6f  tly.  It is impo
2180: 72 74 61 6e 74 20 74 6f 20 72 75 6e 20 74 68 69  rtant to run thi
2190: 73 20 63 6f 64 65 2c 20 62 75 74 0a 20 20 2a 2a  s code, but.  **
21a0: 20 77 65 20 64 6f 6e 27 74 20 77 61 6e 74 20 74   we don't want t
21b0: 6f 20 72 75 6e 20 69 74 20 74 6f 6f 20 6f 66 74  o run it too oft
21c0: 65 6e 20 61 6e 64 20 73 6f 61 6b 20 75 70 20 43  en and soak up C
21d0: 50 55 20 63 79 63 6c 65 73 20 66 6f 72 20 6e 6f  PU cycles for no
21e0: 0a 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 20 53  .  ** reason.  S
21f0: 6f 20 77 65 20 72 75 6e 20 69 74 20 6f 6e 63 65  o we run it once
2200: 20 64 75 72 69 6e 67 20 69 6e 69 74 69 61 6c 69   during initiali
2210: 7a 61 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66  zation..  */.#if
2220: 6e 64 65 66 20 4e 44 45 42 55 47 0a 23 69 66 6e  ndef NDEBUG.#ifn
2230: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2240: 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20  FLOATING_POINT. 
2250: 20 2f 2a 20 54 68 69 73 20 73 65 63 74 69 6f 6e   /* This section
2260: 20 6f 66 20 63 6f 64 65 27 73 20 6f 6e 6c 79 20   of code's only 
2270: 22 6f 75 74 70 75 74 22 20 69 73 20 76 69 61 20  "output" is via 
2280: 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65  assert() stateme
2290: 6e 74 73 2e 20 2a 2f 0a 20 20 69 66 20 28 20 72  nts. */.  if ( r
22a0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22b0: 20 20 20 20 75 36 34 20 78 20 3d 20 28 28 28 75      u64 x = (((u
22c0: 36 34 29 31 29 3c 3c 36 33 29 2d 31 3b 0a 20 20  64)1)<<63)-1;.  
22d0: 20 20 64 6f 75 62 6c 65 20 79 3b 0a 20 20 20 20    double y;.    
22e0: 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 78 29  assert(sizeof(x)
22f0: 3d 3d 38 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ==8);.    assert
2300: 28 73 69 7a 65 6f 66 28 78 29 3d 3d 73 69 7a 65  (sizeof(x)==size
2310: 6f 66 28 79 29 29 3b 0a 20 20 20 20 6d 65 6d 63  of(y));.    memc
2320: 70 79 28 26 79 2c 20 26 78 2c 20 38 29 3b 0a 20  py(&y, &x, 8);. 
2330: 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
2340: 65 33 49 73 4e 61 4e 28 79 29 20 29 3b 0a 20 20  e3IsNaN(y) );.  
2350: 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69 66 0a  }.#endif.#endif.
2360: 0a 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 69  .  /* Do extra i
2370: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 73 74  nitialization st
2380: 65 70 73 20 72 65 71 75 65 73 74 65 64 20 62 79  eps requested by
2390: 20 74 68 65 20 53 51 4c 49 54 45 5f 45 58 54 52   the SQLITE_EXTR
23a0: 41 5f 49 4e 49 54 0a 20 20 2a 2a 20 63 6f 6d 70  A_INIT.  ** comp
23b0: 69 6c 65 2d 74 69 6d 65 20 6f 70 74 69 6f 6e 2e  ile-time option.
23c0: 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  .  */.#ifdef SQL
23d0: 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 0a 20  ITE_EXTRA_INIT. 
23e0: 20 69 66 28 20 62 52 75 6e 45 78 74 72 61 49 6e   if( bRunExtraIn
23f0: 69 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 53 51  it ){.    int SQ
2400: 4c 49 54 45 5f 45 58 54 52 41 5f 49 4e 49 54 28  LITE_EXTRA_INIT(
2410: 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a 20 20  const char*);.  
2420: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 58    rc = SQLITE_EX
2430: 54 52 41 5f 49 4e 49 54 28 30 29 3b 0a 20 20 7d  TRA_INIT(0);.  }
2440: 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
2450: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
2460: 6e 64 6f 20 74 68 65 20 65 66 66 65 63 74 73 20  ndo the effects 
2470: 6f 66 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69  of sqlite3_initi
2480: 61 6c 69 7a 65 28 29 2e 20 20 4d 75 73 74 20 6e  alize().  Must n
2490: 6f 74 20 62 65 20 63 61 6c 6c 65 64 20 77 68 69  ot be called whi
24a0: 6c 65 0a 2a 2a 20 74 68 65 72 65 20 61 72 65 20  le.** there are 
24b0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 64 61 74 61  outstanding data
24c0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
24d0: 20 6f 72 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63   or memory alloc
24e0: 61 74 69 6f 6e 73 20 6f 72 0a 2a 2a 20 77 68 69  ations or.** whi
24f0: 6c 65 20 61 6e 79 20 70 61 72 74 20 6f 66 20 53  le any part of S
2500: 51 4c 69 74 65 20 69 73 20 6f 74 68 65 72 77 69  QLite is otherwi
2510: 73 65 20 69 6e 20 75 73 65 20 69 6e 20 61 6e 79  se in use in any
2520: 20 74 68 72 65 61 64 2e 20 20 54 68 69 73 0a 2a   thread.  This.*
2530: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f 74  * routine is not
2540: 20 74 68 72 65 61 64 73 61 66 65 2e 20 20 42 75   threadsafe.  Bu
2550: 74 20 69 74 20 69 73 20 73 61 66 65 20 74 6f 20  t it is safe to 
2560: 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75 74  invoke this rout
2570: 69 6e 65 0a 2a 2a 20 6f 6e 20 77 68 65 6e 20 53  ine.** on when S
2580: 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64 79  QLite is already
2590: 20 73 68 75 74 20 64 6f 77 6e 2e 20 20 49 66 20   shut down.  If 
25a0: 53 51 4c 69 74 65 20 69 73 20 61 6c 72 65 61 64  SQLite is alread
25b0: 79 20 73 68 75 74 20 64 6f 77 6e 0a 2a 2a 20 77  y shut down.** w
25c0: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
25d0: 20 69 73 20 69 6e 76 6f 6b 65 64 2c 20 74 68 65   is invoked, the
25e0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
25f0: 73 20 61 20 68 61 72 6d 6c 65 73 73 20 6e 6f 2d  s a harmless no-
2600: 6f 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  op..*/.int sqlit
2610: 65 33 5f 73 68 75 74 64 6f 77 6e 28 76 6f 69 64  e3_shutdown(void
2620: 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  ){.  if( sqlite3
2630: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69 73 49  GlobalConfig.isI
2640: 6e 69 74 20 29 7b 0a 23 69 66 64 65 66 20 53 51  nit ){.#ifdef SQ
2650: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
2660: 4f 57 4e 0a 20 20 20 20 76 6f 69 64 20 53 51 4c  OWN.    void SQL
2670: 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44 4f  ITE_EXTRA_SHUTDO
2680: 57 4e 28 76 6f 69 64 29 3b 0a 20 20 20 20 53 51  WN(void);.    SQ
2690: 4c 49 54 45 5f 45 58 54 52 41 5f 53 48 55 54 44  LITE_EXTRA_SHUTD
26a0: 4f 57 4e 28 29 3b 0a 23 65 6e 64 69 66 0a 20 20  OWN();.#endif.  
26b0: 20 20 73 71 6c 69 74 65 33 5f 6f 73 5f 65 6e 64    sqlite3_os_end
26c0: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ();.    sqlite3_
26d0: 72 65 73 65 74 5f 61 75 74 6f 5f 65 78 74 65 6e  reset_auto_exten
26e0: 73 69 6f 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69  sion();.    sqli
26f0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
2700: 69 73 49 6e 69 74 20 3d 20 30 3b 0a 20 20 7d 0a  isInit = 0;.  }.
2710: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
2720: 62 61 6c 43 6f 6e 66 69 67 2e 69 73 50 43 61 63  balConfig.isPCac
2730: 68 65 49 6e 69 74 20 29 7b 0a 20 20 20 20 73 71  heInit ){.    sq
2740: 6c 69 74 65 33 50 63 61 63 68 65 53 68 75 74 64  lite3PcacheShutd
2750: 6f 77 6e 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  own();.    sqlit
2760: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2770: 73 50 43 61 63 68 65 49 6e 69 74 20 3d 20 30 3b  sPCacheInit = 0;
2780: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
2790: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
27a0: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 29 7b 0a 20  sMallocInit ){. 
27b0: 20 20 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63     sqlite3Malloc
27c0: 45 6e 64 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  End();.    sqlit
27d0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
27e0: 73 4d 61 6c 6c 6f 63 49 6e 69 74 20 3d 20 30 3b  sMallocInit = 0;
27f0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
2800: 5f 4f 4d 49 54 5f 53 48 55 54 44 4f 57 4e 5f 44  _OMIT_SHUTDOWN_D
2810: 49 52 45 43 54 4f 52 49 45 53 0a 20 20 20 20 2f  IRECTORIES.    /
2820: 2a 20 54 68 65 20 68 65 61 70 20 73 75 62 73 79  * The heap subsy
2830: 73 74 65 6d 20 68 61 73 20 6e 6f 77 20 62 65 65  stem has now bee
2840: 6e 20 73 68 75 74 64 6f 77 6e 20 61 6e 64 20 74  n shutdown and t
2850: 68 65 73 65 20 76 61 6c 75 65 73 20 61 72 65 20  hese values are 
2860: 73 75 70 70 6f 73 65 64 0a 20 20 20 20 2a 2a 20  supposed.    ** 
2870: 74 6f 20 62 65 20 4e 55 4c 4c 20 6f 72 20 70 6f  to be NULL or po
2880: 69 6e 74 20 74 6f 20 6d 65 6d 6f 72 79 20 74 68  int to memory th
2890: 61 74 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20  at was obtained 
28a0: 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
28b0: 6c 6f 63 28 29 2c 0a 20 20 20 20 2a 2a 20 77 68  loc(),.    ** wh
28c0: 69 63 68 20 77 6f 75 6c 64 20 72 65 6c 79 20 6f  ich would rely o
28d0: 6e 20 74 68 61 74 20 68 65 61 70 20 73 75 62 73  n that heap subs
28e0: 79 73 74 65 6d 3b 20 74 68 65 72 65 66 6f 72 65  ystem; therefore
28f0: 2c 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 73  , make sure thes
2900: 65 0a 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20  e.    ** values 
2910: 63 61 6e 6e 6f 74 20 72 65 66 65 72 20 74 6f 20  cannot refer to 
2920: 68 65 61 70 20 6d 65 6d 6f 72 79 20 74 68 61 74  heap memory that
2930: 20 77 61 73 20 6a 75 73 74 20 69 6e 76 61 6c 69   was just invali
2940: 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 0a 20  dated when the. 
2950: 20 20 20 2a 2a 20 68 65 61 70 20 73 75 62 73 79     ** heap subsy
2960: 73 74 65 6d 20 77 61 73 20 73 68 75 74 64 6f 77  stem was shutdow
2970: 6e 2e 20 20 54 68 69 73 20 69 73 20 6f 6e 6c 79  n.  This is only
2980: 20 64 6f 6e 65 20 69 66 20 74 68 65 20 63 75 72   done if the cur
2990: 72 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20 20 20  rent call to.   
29a0: 20 2a 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f   ** this functio
29b0: 6e 20 72 65 73 75 6c 74 65 64 20 69 6e 20 74 68  n resulted in th
29c0: 65 20 68 65 61 70 20 73 75 62 73 79 73 74 65 6d  e heap subsystem
29d0: 20 61 63 74 75 61 6c 6c 79 20 62 65 69 6e 67 20   actually being 
29e0: 73 68 75 74 64 6f 77 6e 2e 0a 20 20 20 20 2a 2f  shutdown..    */
29f0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 61 74  .    sqlite3_dat
2a00: 61 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  a_directory = 0;
2a10: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 6d  .    sqlite3_tem
2a20: 70 5f 64 69 72 65 63 74 6f 72 79 20 3d 20 30 3b  p_directory = 0;
2a30: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 69 66  .#endif.  }.  if
2a40: 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  ( sqlite3GlobalC
2a50: 6f 6e 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69  onfig.isMutexIni
2a60: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
2a70: 4d 75 74 65 78 45 6e 64 28 29 3b 0a 20 20 20 20  MutexEnd();.    
2a80: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
2a90: 66 69 67 2e 69 73 4d 75 74 65 78 49 6e 69 74 20  fig.isMutexInit 
2aa0: 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  = 0;.  }..  retu
2ab0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
2ac0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 41 50 49 20  ./*.** This API 
2ad0: 61 6c 6c 6f 77 73 20 61 70 70 6c 69 63 61 74 69  allows applicati
2ae0: 6f 6e 73 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  ons to modify th
2af0: 65 20 67 6c 6f 62 61 6c 20 63 6f 6e 66 69 67 75  e global configu
2b00: 72 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65  ration of.** the
2b10: 20 53 51 4c 69 74 65 20 6c 69 62 72 61 72 79 20   SQLite library 
2b20: 61 74 20 72 75 6e 2d 74 69 6d 65 2e 0a 2a 2a 0a  at run-time..**.
2b30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
2b40: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
2b50: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 72 65  alled when there
2b60: 20 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64   are no outstand
2b70: 69 6e 67 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ing.** database 
2b80: 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f 72 20 6d  connections or m
2b90: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e  emory allocation
2ba0: 73 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  s.  This routine
2bb0: 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 68 72 65 61   is not.** threa
2bc0: 64 73 61 66 65 2e 20 20 46 61 69 6c 75 72 65 20  dsafe.  Failure 
2bd0: 74 6f 20 68 65 65 64 20 74 68 65 73 65 20 77 61  to heed these wa
2be0: 72 6e 69 6e 67 73 20 63 61 6e 20 6c 65 61 64 20  rnings can lead 
2bf0: 74 6f 20 75 6e 70 72 65 64 69 63 74 61 62 6c 65  to unpredictable
2c00: 0a 2a 2a 20 62 65 68 61 76 69 6f 72 2e 0a 2a 2f  .** behavior..*/
2c10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f 6e  .int sqlite3_con
2c20: 66 69 67 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29  fig(int op, ...)
2c30: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a  {.  va_list ap;.
2c40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
2c50: 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  E_OK;..  /* sqli
2c60: 74 65 33 5f 63 6f 6e 66 69 67 28 29 20 73 68 61  te3_config() sha
2c70: 6c 6c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  ll return SQLITE
2c80: 5f 4d 49 53 55 53 45 20 69 66 20 69 74 20 69 73  _MISUSE if it is
2c90: 20 69 6e 76 6f 6b 65 64 20 77 68 69 6c 65 0a 20   invoked while. 
2ca0: 20 2a 2a 20 74 68 65 20 53 51 4c 69 74 65 20 6c   ** the SQLite l
2cb0: 69 62 72 61 72 79 20 69 73 20 69 6e 20 75 73 65  ibrary is in use
2cc0: 2e 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74  . */.  if( sqlit
2cd0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
2ce0: 73 49 6e 69 74 20 29 20 72 65 74 75 72 6e 20 53  sInit ) return S
2cf0: 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50  QLITE_MISUSE_BKP
2d00: 54 3b 0a 0a 20 20 76 61 5f 73 74 61 72 74 28 61  T;..  va_start(a
2d10: 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68  p, op);.  switch
2d20: 28 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 20  ( op ){..    /* 
2d30: 4d 75 74 65 78 20 63 6f 6e 66 69 67 75 72 61 74  Mutex configurat
2d40: 69 6f 6e 20 6f 70 74 69 6f 6e 73 20 61 72 65 20  ion options are 
2d50: 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65 20 69  only available i
2d60: 6e 20 61 20 74 68 72 65 61 64 73 61 66 65 0a 20  n a threadsafe. 
2d70: 20 20 20 2a 2a 20 63 6f 6d 70 69 6c 65 2e 20 0a     ** compile. .
2d80: 20 20 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e      */.#if defin
2d90: 65 64 28 53 51 4c 49 54 45 5f 54 48 52 45 41 44  ed(SQLITE_THREAD
2da0: 53 41 46 45 29 20 26 26 20 53 51 4c 49 54 45 5f  SAFE) && SQLITE_
2db0: 54 48 52 45 41 44 53 41 46 45 3e 30 0a 20 20 20  THREADSAFE>0.   
2dc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
2dd0: 46 49 47 5f 53 49 4e 47 4c 45 54 48 52 45 41 44  FIG_SINGLETHREAD
2de0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73  : {.      /* Dis
2df0: 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78 69 6e  able all mutexin
2e00: 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  g */.      sqlit
2e10: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2e20: 43 6f 72 65 4d 75 74 65 78 20 3d 20 30 3b 0a 20  CoreMutex = 0;. 
2e30: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
2e40: 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75  alConfig.bFullMu
2e50: 74 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 62  tex = 0;.      b
2e60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
2e70: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
2e80: 49 47 5f 4d 55 4c 54 49 54 48 52 45 41 44 3a 20  IG_MULTITHREAD: 
2e90: 7b 0a 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62  {.      /* Disab
2ea0: 6c 65 20 6d 75 74 65 78 69 6e 67 20 6f 66 20 64  le mutexing of d
2eb0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
2ec0: 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 2f 2a 20  ons */.      /* 
2ed0: 45 6e 61 62 6c 65 20 6d 75 74 65 78 69 6e 67 20  Enable mutexing 
2ee0: 6f 66 20 63 6f 72 65 20 64 61 74 61 20 73 74 72  of core data str
2ef0: 75 63 74 75 72 65 73 20 2a 2f 0a 20 20 20 20 20  uctures */.     
2f00: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
2f10: 6e 66 69 67 2e 62 43 6f 72 65 4d 75 74 65 78 20  nfig.bCoreMutex 
2f20: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
2f30: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
2f40: 46 75 6c 6c 4d 75 74 65 78 20 3d 20 30 3b 0a 20  FullMutex = 0;. 
2f50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2f60: 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  }.    case SQLIT
2f70: 45 5f 43 4f 4e 46 49 47 5f 53 45 52 49 41 4c 49  E_CONFIG_SERIALI
2f80: 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ZED: {.      /* 
2f90: 45 6e 61 62 6c 65 20 61 6c 6c 20 6d 75 74 65 78  Enable all mutex
2fa0: 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ing */.      sql
2fb0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
2fc0: 2e 62 43 6f 72 65 4d 75 74 65 78 20 3d 20 31 3b  .bCoreMutex = 1;
2fd0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
2fe0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c  obalConfig.bFull
2ff0: 4d 75 74 65 78 20 3d 20 31 3b 0a 20 20 20 20 20  Mutex = 1;.     
3000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3010: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
3020: 4e 46 49 47 5f 4d 55 54 45 58 3a 20 7b 0a 20 20  NFIG_MUTEX: {.  
3030: 20 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61      /* Specify a
3040: 6e 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 75  n alternative mu
3050: 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tex implementati
3060: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
3070: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3080: 6d 75 74 65 78 20 3d 20 2a 76 61 5f 61 72 67 28  mutex = *va_arg(
3090: 61 70 2c 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ap, sqlite3_mute
30a0: 78 5f 6d 65 74 68 6f 64 73 2a 29 3b 0a 20 20 20  x_methods*);.   
30b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
30c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
30d0: 43 4f 4e 46 49 47 5f 47 45 54 4d 55 54 45 58 3a  CONFIG_GETMUTEX:
30e0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 52 65 74 72   {.      /* Retr
30f0: 69 65 76 65 20 74 68 65 20 63 75 72 72 65 6e 74  ieve the current
3100: 20 6d 75 74 65 78 20 69 6d 70 6c 65 6d 65 6e 74   mutex implement
3110: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 2a  ation */.      *
3120: 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
3130: 65 33 5f 6d 75 74 65 78 5f 6d 65 74 68 6f 64 73  e3_mutex_methods
3140: 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62  *) = sqlite3Glob
3150: 61 6c 43 6f 6e 66 69 67 2e 6d 75 74 65 78 3b 0a  alConfig.mutex;.
3160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3170: 20 7d 0a 23 65 6e 64 69 66 0a 0a 0a 20 20 20 20   }.#endif...    
3180: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3190: 49 47 5f 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20 20  IG_MALLOC: {.   
31a0: 20 20 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e     /* Specify an
31b0: 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d 61 6c   alternative mal
31c0: 6c 6f 63 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  loc implementati
31d0: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
31e0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
31f0: 6d 20 3d 20 2a 76 61 5f 61 72 67 28 61 70 2c 20  m = *va_arg(ap, 
3200: 73 71 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68  sqlite3_mem_meth
3210: 6f 64 73 2a 29 3b 0a 20 20 20 20 20 20 62 72 65  ods*);.      bre
3220: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3230: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
3240: 5f 47 45 54 4d 41 4c 4c 4f 43 3a 20 7b 0a 20 20  _GETMALLOC: {.  
3250: 20 20 20 20 2f 2a 20 52 65 74 72 69 65 76 65 20      /* Retrieve 
3260: 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 6c 6c  the current mall
3270: 6f 63 28 29 20 69 6d 70 6c 65 6d 65 6e 74 61 74  oc() implementat
3280: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ion */.      if(
3290: 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
32a0: 6e 66 69 67 2e 6d 2e 78 4d 61 6c 6c 6f 63 3d 3d  nfig.m.xMalloc==
32b0: 30 20 29 20 73 71 6c 69 74 65 33 4d 65 6d 53 65  0 ) sqlite3MemSe
32c0: 74 44 65 66 61 75 6c 74 28 29 3b 0a 20 20 20 20  tDefault();.    
32d0: 20 20 2a 76 61 5f 61 72 67 28 61 70 2c 20 73 71    *va_arg(ap, sq
32e0: 6c 69 74 65 33 5f 6d 65 6d 5f 6d 65 74 68 6f 64  lite3_mem_method
32f0: 73 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  s*) = sqlite3Glo
3300: 62 61 6c 43 6f 6e 66 69 67 2e 6d 3b 0a 20 20 20  balConfig.m;.   
3310: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3320: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
3330: 43 4f 4e 46 49 47 5f 4d 45 4d 53 54 41 54 55 53  CONFIG_MEMSTATUS
3340: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 45 6e 61  : {.      /* Ena
3350: 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74  ble or disable t
3360: 68 65 20 6d 61 6c 6c 6f 63 20 73 74 61 74 75 73  he malloc status
3370: 20 63 6f 6c 6c 65 63 74 69 6f 6e 20 2a 2f 0a 20   collection */. 
3380: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
3390: 61 6c 43 6f 6e 66 69 67 2e 62 4d 65 6d 73 74 61  alConfig.bMemsta
33a0: 74 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  t = va_arg(ap, i
33b0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
33c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
33d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53   SQLITE_CONFIG_S
33e0: 43 52 41 54 43 48 3a 20 7b 0a 20 20 20 20 20 20  CRATCH: {.      
33f0: 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20 62  /* Designate a b
3400: 75 66 66 65 72 20 66 6f 72 20 73 63 72 61 74 63  uffer for scratc
3410: 68 20 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a  h memory space *
3420: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  /.      sqlite3G
3430: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 53 63 72  lobalConfig.pScr
3440: 61 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  atch = va_arg(ap
3450: 2c 20 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20  , void*);.      
3460: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3470: 66 69 67 2e 73 7a 53 63 72 61 74 63 68 20 3d 20  fig.szScratch = 
3480: 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
3490: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c  .      sqlite3Gl
34a0: 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 53 63 72 61  obalConfig.nScra
34b0: 74 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70 2c  tch = va_arg(ap,
34c0: 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65   int);.      bre
34d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
34e0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
34f0: 5f 50 41 47 45 43 41 43 48 45 3a 20 7b 0a 20 20  _PAGECACHE: {.  
3500: 20 20 20 20 2f 2a 20 44 65 73 69 67 6e 61 74 65      /* Designate
3510: 20 61 20 62 75 66 66 65 72 20 66 6f 72 20 70 61   a buffer for pa
3520: 67 65 20 63 61 63 68 65 20 6d 65 6d 6f 72 79 20  ge cache memory 
3530: 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 73  space */.      s
3540: 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
3550: 69 67 2e 70 50 61 67 65 20 3d 20 76 61 5f 61 72  ig.pPage = va_ar
3560: 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20 20  g(ap, void*);.  
3570: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3580: 6c 43 6f 6e 66 69 67 2e 73 7a 50 61 67 65 20 3d  lConfig.szPage =
3590: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
35a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
35b0: 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 50 61 67  lobalConfig.nPag
35c0: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
35d0: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
35e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
35f0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
3600: 50 43 41 43 48 45 3a 20 7b 0a 20 20 20 20 20 20  PCACHE: {.      
3610: 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20 20 20  /* no-op */.    
3620: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3630: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
3640: 4f 4e 46 49 47 5f 47 45 54 50 43 41 43 48 45 3a  ONFIG_GETPCACHE:
3650: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 6e 6f 77 20   {.      /* now 
3660: 61 6e 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20  an error */.    
3670: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
3680: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
3690: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
36a0: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f  e SQLITE_CONFIG_
36b0: 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20  PCACHE2: {.     
36c0: 20 2f 2a 20 53 70 65 63 69 66 79 20 61 6e 20 61   /* Specify an a
36d0: 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65 20  lternative page 
36e0: 63 61 63 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  cache implementa
36f0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
3700: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3710: 67 2e 70 63 61 63 68 65 32 20 3d 20 2a 76 61 5f  g.pcache2 = *va_
3720: 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 5f  arg(ap, sqlite3_
3730: 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73 32 2a  pcache_methods2*
3740: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3750: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 53      }.    case S
3760: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 47 45 54  QLITE_CONFIG_GET
3770: 50 43 41 43 48 45 32 3a 20 7b 0a 20 20 20 20 20  PCACHE2: {.     
3780: 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
3790: 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65 32  alConfig.pcache2
37a0: 2e 78 49 6e 69 74 3d 3d 30 20 29 7b 0a 20 20 20  .xInit==0 ){.   
37b0: 20 20 20 20 20 73 71 6c 69 74 65 33 50 43 61 63       sqlite3PCac
37c0: 68 65 53 65 74 44 65 66 61 75 6c 74 28 29 3b 0a  heSetDefault();.
37d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 76        }.      *v
37e0: 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
37f0: 33 5f 70 63 61 63 68 65 5f 6d 65 74 68 6f 64 73  3_pcache_methods
3800: 32 2a 29 20 3d 20 73 71 6c 69 74 65 33 47 6c 6f  2*) = sqlite3Glo
3810: 62 61 6c 43 6f 6e 66 69 67 2e 70 63 61 63 68 65  balConfig.pcache
3820: 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  2;.      break;.
3830: 20 20 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e      }..#if defin
3840: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
3850: 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66  _MEMSYS3) || def
3860: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
3870: 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20  LE_MEMSYS5).    
3880: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3890: 49 47 5f 48 45 41 50 3a 20 7b 0a 20 20 20 20 20  IG_HEAP: {.     
38a0: 20 2f 2a 20 44 65 73 69 67 6e 61 74 65 20 61 20   /* Designate a 
38b0: 62 75 66 66 65 72 20 66 6f 72 20 68 65 61 70 20  buffer for heap 
38c0: 6d 65 6d 6f 72 79 20 73 70 61 63 65 20 2a 2f 0a  memory space */.
38d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
38e0: 62 61 6c 43 6f 6e 66 69 67 2e 70 48 65 61 70 20  balConfig.pHeap 
38f0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69  = va_arg(ap, voi
3900: 64 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  d*);.      sqlit
3910: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3920: 48 65 61 70 20 3d 20 76 61 5f 61 72 67 28 61 70  Heap = va_arg(ap
3930: 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  , int);.      sq
3940: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
3950: 67 2e 6d 6e 52 65 71 20 3d 20 76 61 5f 61 72 67  g.mnReq = va_arg
3960: 28 61 70 2c 20 69 6e 74 29 3b 0a 0a 20 20 20 20  (ap, int);..    
3970: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f    if( sqlite3Glo
3980: 62 61 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 3c  balConfig.mnReq<
3990: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  1 ){.        sql
39a0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
39b0: 2e 6d 6e 52 65 71 20 3d 20 31 3b 0a 20 20 20 20  .mnReq = 1;.    
39c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
39d0: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
39e0: 6d 6e 52 65 71 3e 28 31 3c 3c 31 32 29 20 29 7b  mnReq>(1<<12) ){
39f0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 63 61 70 20  .        /* cap 
3a00: 6d 69 6e 20 72 65 71 75 65 73 74 20 73 69 7a 65  min request size
3a10: 20 61 74 20 32 5e 31 32 20 2a 2f 0a 20 20 20 20   at 2^12 */.    
3a20: 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61      sqlite3Globa
3a30: 6c 43 6f 6e 66 69 67 2e 6d 6e 52 65 71 20 3d 20  lConfig.mnReq = 
3a40: 28 31 3c 3c 31 32 29 3b 0a 20 20 20 20 20 20 7d  (1<<12);.      }
3a50: 0a 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ..      if( sqli
3a60: 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
3a70: 70 48 65 61 70 3d 3d 30 20 29 7b 0a 20 20 20 20  pHeap==0 ){.    
3a80: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 68 65      /* If the he
3a90: 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 4e 55  ap pointer is NU
3aa0: 4c 4c 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65  LL, then restore
3ab0: 20 74 68 65 20 6d 61 6c 6c 6f 63 20 69 6d 70 6c   the malloc impl
3ac0: 65 6d 65 6e 74 61 74 69 6f 6e 0a 20 20 20 20 20  ementation.     
3ad0: 20 20 20 2a 2a 20 62 61 63 6b 20 74 6f 20 4e 55     ** back to NU
3ae0: 4c 4c 20 70 6f 69 6e 74 65 72 73 20 74 6f 6f 2e  LL pointers too.
3af0: 20 20 54 68 69 73 20 77 69 6c 6c 20 63 61 75 73    This will caus
3b00: 65 20 74 68 65 20 6d 61 6c 6c 6f 63 20 74 6f 20  e the malloc to 
3b10: 67 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 61  go.        ** ba
3b20: 63 6b 20 74 6f 20 69 74 73 20 64 65 66 61 75 6c  ck to its defaul
3b30: 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  t implementation
3b40: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 5f 69 6e   when sqlite3_in
3b50: 69 74 69 61 6c 69 7a 65 28 29 20 69 73 0a 20 20  itialize() is.  
3b60: 20 20 20 20 20 20 2a 2a 20 72 75 6e 2e 0a 20 20        ** run..  
3b70: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
3b80: 20 6d 65 6d 73 65 74 28 26 73 71 6c 69 74 65 33   memset(&sqlite3
3b90: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 2c 20  GlobalConfig.m, 
3ba0: 30 2c 20 73 69 7a 65 6f 66 28 73 71 6c 69 74 65  0, sizeof(sqlite
3bb0: 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6d 29  3GlobalConfig.m)
3bc0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3bd0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 68          /* The h
3be0: 65 61 70 20 70 6f 69 6e 74 65 72 20 69 73 20 6e  eap pointer is n
3bf0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 6e  ot NULL, then in
3c00: 73 74 61 6c 6c 20 6f 6e 65 20 6f 66 20 74 68 65  stall one of the
3c10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 6d 65 6d 35  .        ** mem5
3c20: 2e 63 2f 6d 65 6d 33 2e 63 20 6d 65 74 68 6f 64  .c/mem3.c method
3c30: 73 2e 20 20 54 68 65 20 65 6e 63 6c 6f 73 69 6e  s.  The enclosin
3c40: 67 20 23 69 66 20 67 75 61 72 61 6e 74 65 65 73  g #if guarantees
3c50: 20 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c   at.        ** l
3c60: 65 61 73 74 20 6f 6e 65 20 6f 66 20 74 68 65 73  east one of thes
3c70: 65 20 6d 65 74 68 6f 64 73 20 69 73 20 63 75 72  e methods is cur
3c80: 72 65 6e 74 6c 79 20 65 6e 61 62 6c 65 64 2e 0a  rently enabled..
3c90: 20 20 20 20 20 20 20 20 2a 2f 0a 23 69 66 64 65          */.#ifde
3ca0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3cb0: 4d 45 4d 53 59 53 33 0a 20 20 20 20 20 20 20 20  MEMSYS3.        
3cc0: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3cd0: 66 69 67 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33  fig.m = *sqlite3
3ce0: 4d 65 6d 47 65 74 4d 65 6d 73 79 73 33 28 29 3b  MemGetMemsys3();
3cf0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
3d00: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
3d10: 53 59 53 35 0a 20 20 20 20 20 20 20 20 73 71 6c  SYS5.        sql
3d20: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
3d30: 2e 6d 20 3d 20 2a 73 71 6c 69 74 65 33 4d 65 6d  .m = *sqlite3Mem
3d40: 47 65 74 4d 65 6d 73 79 73 35 28 29 3b 0a 23 65  GetMemsys5();.#e
3d50: 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
3d60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3d70: 23 65 6e 64 69 66 0a 0a 20 20 20 20 63 61 73 65  #endif..    case
3d80: 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c   SQLITE_CONFIG_L
3d90: 4f 4f 4b 41 53 49 44 45 3a 20 7b 0a 20 20 20 20  OOKASIDE: {.    
3da0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
3db0: 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64  onfig.szLookasid
3dc0: 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  e = va_arg(ap, i
3dd0: 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  nt);.      sqlit
3de0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e  e3GlobalConfig.n
3df0: 4c 6f 6f 6b 61 73 69 64 65 20 3d 20 76 61 5f 61  Lookaside = va_a
3e00: 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20  rg(ap, int);.   
3e10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3e20: 20 20 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 6f      .    /* Reco
3e30: 72 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rd a pointer to 
3e40: 74 68 65 20 6c 6f 67 67 65 72 20 66 75 6e 63 74  the logger funct
3e50: 69 6f 6e 20 61 6e 64 20 69 74 73 20 66 69 72 73  ion and its firs
3e60: 74 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20  t argument..    
3e70: 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  ** The default i
3e80: 73 20 4e 55 4c 4c 2e 20 20 4c 6f 67 67 69 6e 67  s NULL.  Logging
3e90: 20 69 73 20 64 69 73 61 62 6c 65 64 20 69 66 20   is disabled if 
3ea0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 6f 69  the function poi
3eb0: 6e 74 65 72 20 69 73 0a 20 20 20 20 2a 2a 20 4e  nter is.    ** N
3ec0: 55 4c 4c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ULL..    */.    
3ed0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46  case SQLITE_CONF
3ee0: 49 47 5f 4c 4f 47 3a 20 7b 0a 20 20 20 20 20 20  IG_LOG: {.      
3ef0: 2f 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79  /* MSVC is picky
3f00: 20 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66   about pulling f
3f10: 75 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61  unc ptrs from va
3f20: 20 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a   lists..      **
3f30: 20 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e   http://support.
3f40: 6d 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62  microsoft.com/kb
3f50: 2f 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20  /47961.      ** 
3f60: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
3f70: 66 69 67 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72  fig.xLog = va_ar
3f80: 67 28 61 70 2c 20 76 6f 69 64 28 2a 29 28 76 6f  g(ap, void(*)(vo
3f90: 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63 68  id*,int,const ch
3fa0: 61 72 2a 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a  ar*));.      */.
3fb0: 20 20 20 20 20 20 74 79 70 65 64 65 66 20 76 6f        typedef vo
3fc0: 69 64 28 2a 4c 4f 47 46 55 4e 43 5f 74 29 28 76  id(*LOGFUNC_t)(v
3fd0: 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 63  oid*,int,const c
3fe0: 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 73 71 6c  har*);.      sql
3ff0: 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
4000: 2e 78 4c 6f 67 20 3d 20 76 61 5f 61 72 67 28 61  .xLog = va_arg(a
4010: 70 2c 20 4c 4f 47 46 55 4e 43 5f 74 29 3b 0a 20  p, LOGFUNC_t);. 
4020: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4030: 61 6c 43 6f 6e 66 69 67 2e 70 4c 6f 67 41 72 67  alConfig.pLogArg
4040: 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
4050: 69 64 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61  id*);.      brea
4060: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
4070: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4080: 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 73 71  _URI: {.      sq
4090: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
40a0: 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f  g.bOpenUri = va_
40b0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
40c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
40d0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
40e0: 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e  E_CONFIG_COVERIN
40f0: 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a  G_INDEX_SCAN: {.
4100: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4110: 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
4120: 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  s = va_arg(ap, i
4130: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
4140: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
4150: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
4160: 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51  LLOG.    case SQ
4170: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
4180: 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  OG: {.      type
4190: 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47  def void(*SQLLOG
41a0: 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73  FUNC_t)(void*, s
41b0: 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
41c0: 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20  har*, int);.    
41d0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
41e0: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20  onfig.xSqllog = 
41f0: 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f  va_arg(ap, SQLLO
4200: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
4210: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4220: 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d  fig.pSqllogArg =
4230: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
4240: 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   *);.      break
4250: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
4260: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4270: 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45  CONFIG_MMAP_SIZE
4280: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4290: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d  3_int64 szMmap =
42a0: 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
42b0: 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20  te3_int64);.    
42c0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
42d0: 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  mxMmap = va_arg(
42e0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ap, sqlite3_int6
42f0: 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  4);.      if( mx
4300: 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70  Mmap<0 || mxMmap
4310: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50  >SQLITE_MAX_MMAP
4320: 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
4330: 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45   mxMmap = SQLITE
4340: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a  _MAX_MMAP_SIZE;.
4350: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
4360: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4370: 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61  g.mxMmap = mxMma
4380: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d  p;.      if( szM
4390: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
43a0: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
43b0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
43c0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
43d0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
43e0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
43f0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
4400: 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
4410: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4420: 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   }..#if SQLITE_O
4430: 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e 65 64  S_WIN && defined
4440: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
4450: 4c 4c 4f 43 29 0a 20 20 20 20 63 61 73 65 20 53  LLOC).    case S
4460: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e  QLITE_CONFIG_WIN
4470: 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20  32_HEAPSIZE: {. 
4480: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4490: 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d  alConfig.nHeap =
44a0: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
44b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
44c0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
44d0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
44e0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
44f0: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
4500: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
4510: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
4520: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4530: 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61  Set up the looka
4540: 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f 72  side buffers for
4550: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
4560: 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72  ection..** Retur
4570: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
4580: 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20  uccess.  .** If 
4590: 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72  lookaside is alr
45a0: 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65 74  eady active, ret
45b0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
45c0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61  .**.** The sz pa
45d0: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e  rameter is the n
45e0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
45f0: 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65  n each lookaside
4600: 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e   slot..** The cn
4610: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
4620: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  he number of slo
4630: 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20 69  ts.  If pStart i
4640: 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70  s NULL the.** sp
4650: 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b  ace for the look
4660: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20  aside memory is 
4670: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4680: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
4690: 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73 20  ** If pStart is 
46a0: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
46b0: 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73   is sz*cnt bytes
46c0: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73   of memory to us
46d0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f  e for.** the loo
46e0: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a  kaside memory..*
46f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
4700: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69  upLookaside(sqli
4710: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  te3 *db, void *p
4720: 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  Buf, int sz, int
4730: 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20 2a 70   cnt){.  void *p
4740: 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64 62 2d  Start;.  if( db-
4750: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
4760: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4770: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
4780: 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65 78 69   /* Free any exi
4790: 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  sting lookaside 
47a0: 62 75 66 66 65 72 20 66 6f 72 20 74 68 69 73 20  buffer for this 
47b0: 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20 20  handle before.  
47c0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** allocating a 
47d0: 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20 64 6f  new one so we do
47e0: 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61 76 65  n't have to have
47f0: 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20 2a 2a   space for .  **
4800: 20 62 6f 74 68 20 61 74 20 74 68 65 20 73 61 6d   both at the sam
4810: 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  e time..  */.  i
4820: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
4830: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
4840: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
4850: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
4860: 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  art);.  }.  /* T
4870: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c 6f 6f  he size of a loo
4880: 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66 74 65  kaside slot afte
4890: 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e 65 65  r ROUNDDOWN8 nee
48a0: 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65 72 0a  ds to be larger.
48b0: 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f 69 6e    ** than a poin
48c0: 74 65 72 20 74 6f 20 62 65 20 75 73 65 66 75 6c  ter to be useful
48d0: 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f  ..  */.  sz = RO
48e0: 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20 20 2f  UNDDOWN8(sz);  /
48f0: 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d 30  * IMP: R-33038-0
4900: 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20 73 7a  9382 */.  if( sz
4910: 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f  <=(int)sizeof(Lo
4920: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 20  okasideSlot*) ) 
4930: 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 6e  sz = 0;.  if( cn
4940: 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a 20  t<0 ) cnt = 0;. 
4950: 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e   if( sz==0 || cn
4960: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d  t==0 ){.    sz =
4970: 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d   0;.    pStart =
4980: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
4990: 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pBuf==0 ){.    s
49a0: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
49b0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 70  nMalloc();.    p
49c0: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 4d  Start = sqlite3M
49d0: 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20 29 3b  alloc( sz*cnt );
49e0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 34    /* IMP: R-6194
49f0: 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20 20 73  9-35727 */.    s
4a00: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
4a10: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28  alloc();.    if(
4a20: 20 70 53 74 61 72 74 20 29 20 63 6e 74 20 3d 20   pStart ) cnt = 
4a30: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a  sqlite3MallocSiz
4a40: 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a 20 20  e(pStart)/sz;.  
4a50: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 61 72  }else{.    pStar
4a60: 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20 20  t = pBuf;.  }.  
4a70: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
4a80: 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20  tart = pStart;. 
4a90: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4aa0: 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Free = 0;.  db->
4ab0: 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28  lookaside.sz = (
4ac0: 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53  u16)sz;.  if( pS
4ad0: 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tart ){.    int 
4ae0: 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  i;.    Lookaside
4af0: 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73  Slot *p;.    ass
4b00: 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73  ert( sz > (int)s
4b10: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
4b20: 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20 3d  lot*) );.    p =
4b30: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
4b40: 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72  )pStart;.    for
4b50: 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20  (i=cnt-1; i>=0; 
4b60: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  i--){.      p->p
4b70: 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  Next = db->looka
4b80: 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20 20  side.pFree;.    
4b90: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4ba0: 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20  pFree = p;.     
4bb0: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
4bc0: 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73  lot*)&((u8*)p)[s
4bd0: 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  z];.    }.    db
4be0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
4bf0: 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = p;.    db->lo
4c00: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
4c10: 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 1;.    db->lo
4c20: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
4c30: 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30  d = pBuf==0 ?1:0
4c40: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
4c50: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
4c60: 61 72 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62  art = db;.    db
4c70: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
4c80: 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c   = db;.    db->l
4c90: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
4ca0: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
4cb0: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
4cc0: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ed = 0;.  }.  re
4cd0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4ce0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4cf0: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
4d00: 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
4d10: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
4d20: 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65  .*/.sqlite3_mute
4d30: 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75  x *sqlite3_db_mu
4d40: 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29  tex(sqlite3 *db)
4d50: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d  {.  return db->m
4d60: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  utex;.}../*.** F
4d70: 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
4d80: 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20  emory as we can 
4d90: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64  from the given d
4da0: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
4db0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
4dc0: 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
4dd0: 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20  _memory(sqlite3 
4de0: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
4df0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
4e00: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
4e10: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
4e20: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
4e30: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
4e40: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
4e50: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
4e60: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
4e70: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 50  ( pBt ){.      P
4e80: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
4e90: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4ea0: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pBt);.      sql
4eb0: 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
4ec0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
4ed0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
4ee0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
4ef0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
4f00: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
4f10: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
4f20: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
4f30: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74  nfiguration sett
4f40: 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69  ings for an indi
4f50: 76 69 64 75 61 6c 20 64 61 74 61 62 61 73 65 20  vidual database 
4f60: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e  connection.*/.in
4f70: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  t sqlite3_db_con
4f80: 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  fig(sqlite3 *db,
4f90: 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20   int op, ...){. 
4fa0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
4fb0: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72  nt rc;.  va_star
4fc0: 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
4fd0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
4fe0: 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ase SQLITE_DBCON
4ff0: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
5000: 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75  .      void *pBu
5010: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  f = va_arg(ap, v
5020: 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52  oid*); /* IMP: R
5030: 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a  -26835-10964 */.
5040: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
5050: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
5060: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
5070: 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20  47871-25994 */. 
5080: 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76       int cnt = v
5090: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
50a0: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30       /* IMP: R-0
50b0: 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20  4460-53386 */.  
50c0: 20 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f      rc = setupLo
50d0: 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66  okaside(db, pBuf
50e0: 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20  , sz, cnt);.    
50f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5100: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5110: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
5120: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
5130: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f    int op;      /
5140: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a  * The opcode */.
5150: 20 20 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b          u32 mask
5160: 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
5170: 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74  the bit in sqlit
5180: 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f  e3.flags to set/
5190: 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d  clear */.      }
51a0: 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20   aFlagOp[] = {. 
51b0: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
51c0: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
51d0: 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54 45 5f  FKEY,    SQLITE_
51e0: 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d  ForeignKeys    }
51f0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
5200: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
5210: 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51 4c 49  LE_TRIGGER, SQLI
5220: 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
5230: 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20    },.      };.  
5240: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
5250: 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   i;.      rc = S
5260: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
5270: 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33  IMP: R-42790-233
5280: 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  72 */.      for(
5290: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
52a0: 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b  (aFlagOp); i++){
52b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 6c  .        if( aFl
52c0: 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29  agOp[i].op==op )
52d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
52e0: 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61  onoff = va_arg(a
52f0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  p, int);.       
5300: 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76     int *pRes = v
5310: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
5320: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
5330: 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  ldFlags = db->fl
5340: 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ags;.          i
5350: 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20  f( onoff>0 ){.  
5360: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
5370: 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69  ags |= aFlagOp[i
5380: 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  ].mask;.        
5390: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66    }else if( onof
53a0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
53b0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
53c0: 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73   ~aFlagOp[i].mas
53d0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
53e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64           if( old
53f0: 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73  Flags!=db->flags
5400: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5410: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
5420: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
5430: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  db);.          }
5440: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5450: 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Res ){.         
5460: 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e     *pRes = (db->
5470: 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b  flags & aFlagOp[
5480: 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20  i].mask)!=0;.   
5490: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
54a0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
54b0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  K;.          bre
54c0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
54d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
54e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
54f0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
5500: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
5510: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
5520: 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e   the buffer z[0.
5530: 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61  .n-1] contains a
5540: 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74  ll spaces..*/.st
5550: 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63  atic int allSpac
5560: 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  es(const char *z
5570: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c  , int n){.  whil
5580: 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>0 && z[n-1]
5590: 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  ==' ' ){ n--; }.
55a0: 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d    return n==0;.}
55b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
55c0: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
55d0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  ating function n
55e0: 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68  amed "BINARY" wh
55f0: 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ich is always.**
5600: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
5610: 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61 67  * If the padFlag
5620: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
5630: 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65   NULL then space
5640: 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65 20   padding at the 
5650: 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67  end.** of string
5660: 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54  s is ignored.  T
5670: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  his implements t
5680: 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69  he RTRIM collati
5690: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
56a0: 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20  t binCollFunc(. 
56b0: 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a   void *padFlag,.
56c0: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
56d0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
56e0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
56f0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
5700: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20  {.  int rc, n;. 
5710: 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32   n = nKey1<nKey2
5720: 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32   ? nKey1 : nKey2
5730: 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  ;.  rc = memcmp(
5740: 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29  pKey1, pKey2, n)
5750: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
5760: 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61 67  .    if( padFlag
5770: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
5780: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31  es(((char*)pKey1
5790: 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20  )+n, nKey1-n).  
57a0: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
57b0: 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e  ((char*)pKey2)+n
57c0: 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29  , nKey2-n).    )
57d0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65  {.      /* Leave
57e0: 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20 61 74   rc unchanged at
57f0: 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b   0 */.    }else{
5800: 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  .      rc = nKey
5810: 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d  1 - nKey2;.    }
5820: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5830: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
5840: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
5850: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
5860: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
5870: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
5880: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
5890: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
58a0: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
58b0: 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ent.** compariso
58c0: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
58d0: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
58e0: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
58f0: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
5900: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
5910: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
5920: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
5930: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
5940: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
5950: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
5960: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
5970: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
5980: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
5990: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
59a0: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
59b0: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
59c0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
59d0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
59e0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
59f0: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
5a00: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
5a10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
5a20: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
5a30: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
5a40: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
5a50: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
5a60: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
5a70: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
5a80: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
5a90: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
5aa0: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
5ab0: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
5ac0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
5ad0: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
5ae0: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
5af0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
5b00: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
5b10: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61  .  return db->la
5b20: 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  stRowid;.}../*.*
5b30: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
5b40: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69  ber of changes i
5b50: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
5b60: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
5b70: 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74  3_exec()..*/.int
5b80: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
5b90: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
5ba0: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61   return db->nCha
5bb0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nge;.}../*.** Re
5bc0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
5bd0: 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65  of changes since
5be0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
5bf0: 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e  ndle was opened.
5c00: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
5c10: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71  total_changes(sq
5c20: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
5c30: 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  turn db->nTotalC
5c40: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5c50: 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73  Close all open s
5c60: 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73 20  avepoints. This 
5c70: 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61  function only ma
5c80: 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64 73  nipulates fields
5c90: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
5ca0: 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ase handle objec
5cb0: 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63  t, it does not c
5cc0: 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f 69  lose any savepoi
5cd0: 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  nts that may be 
5ce0: 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62  open.** at the b
5cf0: 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76 65  -tree/pager leve
5d00: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
5d10: 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
5d20: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
5d30: 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61    while( db->pSa
5d40: 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53  vepoint ){.    S
5d50: 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d  avepoint *pTmp =
5d60: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
5d70: 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f  .    db->pSavepo
5d80: 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78  int = pTmp->pNex
5d90: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  t;.    sqlite3Db
5da0: 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a  Free(db, pTmp);.
5db0: 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70    }.  db->nSavep
5dc0: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  oint = 0;.  db->
5dd0: 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
5de0: 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74    db->isTransact
5df0: 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ionSavepoint = 0
5e00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
5e10: 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
5e20: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69   function associ
5e30: 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44 65  ated with FuncDe
5e40: 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78 63  f p, if any. Exc
5e50: 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20  ept,.** if this 
5e60: 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20  is not the last 
5e70: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e 63  copy of the func
5e80: 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76  tion, do not inv
5e90: 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65  oke it. Multiple
5ea0: 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61 20  .** copies of a 
5eb0: 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20  single function 
5ec0: 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65 6e  are created when
5ed0: 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e   create_function
5ee0: 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  () is called.** 
5ef0: 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59 20  with SQLITE_ANY 
5f00: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e  as the encoding.
5f10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5f20: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
5f30: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
5f40: 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63  cDef *p){.  Func
5f50: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
5f60: 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65  tructor = p->pDe
5f70: 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20  structor;.  if( 
5f80: 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  pDestructor ){. 
5f90: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
5fa0: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
5fb0: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
5fc0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44  f==0 ){.      pD
5fd0: 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74  estructor->xDest
5fe0: 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d  roy(pDestructor-
5ff0: 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20  >pUserData);.   
6000: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6010: 28 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72  (db, pDestructor
6020: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
6030: 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74  /*.** Disconnect
6040: 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61   all sqlite3_vta
6050: 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62  b objects that b
6060: 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73  elong to databas
6070: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
6080: 64 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  db. This is call
6090: 65 64 20 77 68 65 6e 20 64 62 20 69 73 20 62 65  ed when db is be
60a0: 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  ing closed..*/.s
60b0: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f  tatic void disco
60c0: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c  nnectAllVtab(sql
60d0: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64  ite3 *db){.#ifnd
60e0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
60f0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e  IRTUALTABLE.  in
6100: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t i;.  sqlite3Bt
6110: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6120: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
6130: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6140: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
6150: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53   = db->aDb[i].pS
6160: 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 64  chema;.    if( d
6170: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
6180: 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45  a ){.      HashE
6190: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  lem *p;.      fo
61a0: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
61b0: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  rst(&pSchema->tb
61c0: 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  lHash); p; p=sql
61d0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
61e0: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
61f0: 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29  pTab = (Table *)
6200: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
6210: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
6220: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
6230: 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63   sqlite3VtabDisc
6240: 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29  onnect(db, pTab)
6250: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6260: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61    }.  sqlite3Vta
6270: 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b  bUnlockList(db);
6280: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
6290: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c  eaveAll(db);.#el
62a0: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
62b0: 4d 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64 69  METER(db);.#endi
62c0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
62d0: 6e 20 54 52 55 45 20 69 66 20 64 61 74 61 62 61  n TRUE if databa
62e0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
62f0: 20 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64   has unfinalized
6300: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
6310: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
6320: 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61  ished sqlite3_ba
6330: 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a  ckup objects.  .
6340: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
6350: 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 73  nnectionIsBusy(s
6360: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
6370: 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20  nt j;.  assert( 
6380: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6390: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
63a0: 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65  .  if( db->pVdbe
63b0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
63c0: 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44  or(j=0; j<db->nD
63d0: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; j++){.    Btr
63e0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
63f0: 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[j].pBt;.    if
6400: 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33  ( pBt && sqlite3
6410: 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28  BtreeIsInBackup(
6420: 70 42 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b  pBt) ) return 1;
6430: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
6440: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
6450: 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69  an existing SQLi
6460: 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73  te database.*/.s
6470: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
6480: 33 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  3Close(sqlite3 *
6490: 64 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d  db, int forceZom
64a0: 62 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62 20  bie){.  if( !db 
64b0: 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
64c0: 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d 31  CE-OF: R-63257-1
64d0: 31 37 34 30 20 43 61 6c 6c 69 6e 67 20 73 71 6c  1740 Calling sql
64e0: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72 0a  ite3_close() or.
64f0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
6500: 6c 6f 73 65 5f 76 32 28 29 20 77 69 74 68 20 61  lose_v2() with a
6510: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 72   NULL pointer ar
6520: 67 75 6d 65 6e 74 20 69 73 20 61 20 68 61 72 6d  gument is a harm
6530: 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  less no-op. */. 
6540: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6550: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
6560: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
6570: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
6580: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6590: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
65a0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
65b0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
65c0: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72  utex);..  /* For
65d0: 63 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63  ce xDisconnect c
65e0: 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74  alls on all virt
65f0: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
6600: 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61  disconnectAllVta
6610: 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  b(db);..  /* If 
6620: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
6630: 20 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f   open, the disco
6640: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63  nnectAllVtab() c
6650: 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  all above.  ** w
6660: 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c  ill not have cal
6670: 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e  led the xDisconn
6680: 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20  ect() method on 
6690: 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a  any virtual.  **
66a0: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64   tables in the d
66b0: 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72  b->aVTrans[] arr
66c0: 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ay. The followin
66d0: 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c  g sqlite3VtabRol
66e0: 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c  lback().  ** cal
66f0: 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65  l will do so. We
6700: 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73   need to do this
6710: 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63   before the chec
6720: 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a  k for active.  *
6730: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
6740: 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76   below, as the v
6750: 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  -table implement
6760: 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f  ation may be sto
6770: 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70  ring.  ** some p
6780: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
6790: 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ts internally.. 
67a0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61   */.  sqlite3Vta
67b0: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a  bRollback(db);..
67c0: 20 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61    /* Legacy beha
67d0: 76 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c  vior (sqlite3_cl
67e0: 6f 73 65 28 29 20 62 65 68 61 76 69 6f 72 29 20  ose() behavior) 
67f0: 69 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a  is to return.  *
6800: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  * SQLITE_BUSY if
6810: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
6820: 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65  can not be close
6830: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
6840: 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65   */.  if( !force
6850: 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63  Zombie && connec
6860: 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29  tionIsBusy(db) )
6870: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
6880: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
6890: 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62  LITE_BUSY, "unab
68a0: 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20  le to close due 
68b0: 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22  to unfinalized "
68c0: 0a 20 20 20 20 20 20 20 22 73 74 61 74 65 6d 65  .       "stateme
68d0: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
68e0: 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20  d backups");.   
68f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
6900: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
6910: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6920: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69  TE_BUSY;.  }..#i
6930: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6940: 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20  LE_SQLLOG.  if( 
6950: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
6960: 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20  fig.xSqllog ){. 
6970: 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68     /* Closing th
6980: 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68  e handle. Fourth
6990: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61   parameter is pa
69a0: 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 32  ssed the value 2
69b0: 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
69c0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
69d0: 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62  llog(sqlite3Glob
69e0: 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
69f0: 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a  Arg, db, 0, 2);.
6a00: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
6a10: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e   Convert the con
6a20: 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a  nection into a z
6a30: 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63  ombie and then c
6a40: 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  lose it..  */.  
6a50: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
6a60: 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b  TE_MAGIC_ZOMBIE;
6a70: 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d  .  sqlite3LeaveM
6a80: 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62  utexAndCloseZomb
6a90: 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  ie(db);.  return
6aa0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6ab0: 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69  *.** Two variati
6ac0: 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69  ons on the publi
6ad0: 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20  c interface for 
6ae0: 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61  closing a databa
6af0: 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
6b00: 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c  . The sqlite3_cl
6b10: 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65  ose() version re
6b20: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
6b30: 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20  Y and.** leaves 
6b40: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
6b50: 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61  ption if there a
6b60: 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70  re unfinalized p
6b70: 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65  repared.** state
6b80: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
6b90: 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  hed sqlite3_back
6ba0: 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ups.  The sqlite
6bb0: 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20  3_close_v2().** 
6bc0: 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74  version forces t
6bd0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
6be0: 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65   become a zombie
6bf0: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
6c00: 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72   unclosed resour
6c10: 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65  ces, and arrange
6c20: 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69  s for deallocati
6c30: 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  on when the last
6c40: 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61 74  .** prepare stat
6c50: 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33  ement or sqlite3
6c60: 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a  _backup closes..
6c70: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
6c80: 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lose(sqlite3 *db
6c90: 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ){ return sqlite
6ca0: 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a  3Close(db,0); }.
6cb0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  int sqlite3_clos
6cc0: 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62  e_v2(sqlite3 *db
6cd0: 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ){ return sqlite
6ce0: 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a  3Close(db,1); }.
6cf0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
6d00: 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62  e mutex on datab
6d10: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
6d20: 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72  b..**.** Further
6d30: 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61 73  more, if databas
6d40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
6d50: 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61  is a zombie (mea
6d60: 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a  ning that there.
6d70: 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70 72  ** has been a pr
6d80: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
6d90: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72  te3_close(db) or
6da0: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
6db0: 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76  2(db)) and.** ev
6dc0: 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ery sqlite3_stmt
6dd0: 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69   has now been fi
6de0: 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72  nalized and ever
6df0: 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  y sqlite3_backup
6e00: 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64   has.** finished
6e10: 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20  , then free all 
6e20: 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f  resources..*/.vo
6e30: 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d  id sqlite3LeaveM
6e40: 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62  utexAndCloseZomb
6e50: 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ie(sqlite3 *db){
6e60: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20  .  HashElem *i; 
6e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e80: 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
6e90: 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   iterator */.  i
6ea0: 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  nt j;..  /* If t
6eb0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
6ec0: 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d  ding sqlite3_stm
6ed0: 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63  t or sqlite3_bac
6ee0: 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a  kup objects.  **
6ef0: 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65   or if the conne
6f00: 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  ction has not ye
6f10: 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79  t been closed by
6f20: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
6f30: 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a  2(),.  ** then j
6f40: 75 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75  ust leave the mu
6f50: 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  tex and return..
6f60: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
6f70: 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47  agic!=SQLITE_MAG
6f80: 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e  IC_ZOMBIE || con
6f90: 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62  nectionIsBusy(db
6fa0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
6fb0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
6fc0: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74  >mutex);.    ret
6fd0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  urn;.  }..  /* I
6fe0: 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
6ff0: 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
7000: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
7010: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  e connection has
7020: 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c  .  ** closed all
7030: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e   sqlite3_stmt an
7040: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
7050: 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73   objects and has
7060: 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65   been.  ** passe
7070: 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f  d to sqlite3_clo
7080: 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74  se (meaning that
7090: 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29   it is a zombie)
70a0: 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20  .  Therefore,.  
70b0: 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ** go ahead and 
70c0: 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63  free all resourc
70d0: 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49  es..  */..  /* I
70e0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
70f0: 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74  is open, roll it
7100: 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f   back. This also
7110: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 69 66   ensures that if
7120: 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61  .  ** any databa
7130: 73 65 20 73 63 68 65 6d 61 73 20 68 61 76 65 20  se schemas have 
7140: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79  been modified by
7150: 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20   an uncommitted 
7160: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
7170: 20 74 68 65 79 20 61 72 65 20 72 65 73 65 74 2e   they are reset.
7180: 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 72 65   And that the re
7190: 71 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75  quired b-tree mu
71a0: 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d  tex is held to m
71b0: 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ake.  ** the pag
71c0: 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  er rollback and 
71d0: 73 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20  schema reset an 
71e0: 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e  atomic operation
71f0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f  . */.  sqlite3Ro
7200: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
7210: 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20  LITE_OK);..  /* 
7220: 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e  Free any outstan
7230: 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73  ding Savepoint s
7240: 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20  tructures. */.  
7250: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
7260: 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f  points(db);..  /
7270: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61  * Close all data
7280: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
7290: 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   */.  for(j=0; j
72a0: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
72b0: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
72c0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d  Db = &db->aDb[j]
72d0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
72e0: 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Bt ){.      sqli
72f0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44  te3BtreeClose(pD
7300: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70  b->pBt);.      p
7310: 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20  Db->pBt = 0;.   
7320: 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20     if( j!=1 ){. 
7330: 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68         pDb->pSch
7340: 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ema = 0;.      }
7350: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
7360: 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20 73  Clear the TEMP s
7370: 63 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c 79  chema separately
7380: 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69   and last */.  i
7390: 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  f( db->aDb[1].pS
73a0: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c  chema ){.    sql
73b0: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
73c0: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
73d0: 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ma);.  }.  sqlit
73e0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
73f0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  (db);..  /* Free
7400: 20 75 70 20 74 68 65 20 61 72 72 61 79 20 6f 66   up the array of
7410: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
7420: 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ases */.  sqlite
7430: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
7440: 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61 73  eArray(db);.  as
7450: 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32  sert( db->nDb<=2
7460: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
7470: 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74  ->aDb==db->aDbSt
7480: 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65  atic );..  /* Te
7490: 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e  ll the code in n
74a0: 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74 68 65  otify.c that the
74b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c   connection no l
74c0: 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a  onger holds any.
74d0: 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64    ** locks and d
74e0: 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
74f0: 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f  any further unlo
7500: 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
7510: 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  cks..  */.  sqli
7520: 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f  te3ConnectionClo
7530: 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28  sed(db);..  for(
7540: 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=0; j<ArraySize
7550: 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a  (db->aFunc.a); j
7560: 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  ++){.    FuncDef
7570: 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c   *pNext, *pHash,
7580: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64   *p;.    for(p=d
7590: 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70  b->aFunc.a[j]; p
75a0: 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20 20  ; p=pHash){.    
75b0: 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61    pHash = p->pHa
75c0: 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  sh;.      while(
75d0: 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 75   p ){.        fu
75e0: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
75f0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , p);.        pN
7600: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
7610: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
7620: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
7630: 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b        p = pNext;
7640: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7650: 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74   }.  for(i=sqlit
7660: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
7670: 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d  aCollSeq); i; i=
7680: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
7690: 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  )){.    CollSeq 
76a0: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
76b0: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
76c0: 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  ta(i);.    /* In
76d0: 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63  voke any destruc
76e0: 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20  tors registered 
76f0: 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  for collation se
7700: 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61  quence user data
7710: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30  . */.    for(j=0
7720: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
7730: 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e     if( pColl[j].
7740: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
7750: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43  pColl[j].xDel(pC
7760: 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20  oll[j].pUser);. 
7770: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7780: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7790: 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, pColl);.  }. 
77a0: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
77b0: 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  r(&db->aCollSeq)
77c0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
77d0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
77e0: 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  LE.  for(i=sqlit
77f0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
7800: 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73  aModule); i; i=s
7810: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
7820: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
7830: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
7840: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
7850: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  );.    if( pMod-
7860: 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >xDestroy ){.   
7870: 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f     pMod->xDestro
7880: 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20  y(pMod->pAux);. 
7890: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
78a0: 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29  DbFree(db, pMod)
78b0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
78c0: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d  ashClear(&db->aM
78d0: 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
78e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
78f0: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f  b, SQLITE_OK); /
7900: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e  * Deallocates an
7910: 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73  y cached error s
7920: 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c  trings. */.  sql
7930: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62  ite3ValueFree(db
7940: 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74  ->pErr);.  sqlit
7950: 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e  e3CloseExtension
7960: 73 28 64 62 29 3b 0a 0a 20 20 64 62 2d 3e 6d 61  s(db);..  db->ma
7970: 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
7980: 49 43 5f 45 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20  IC_ERROR;..  /* 
7990: 54 68 65 20 74 65 6d 70 2d 64 61 74 61 62 61 73  The temp-databas
79a0: 65 20 73 63 68 65 6d 61 20 69 73 20 61 6c 6c 6f  e schema is allo
79b0: 63 61 74 65 64 20 64 69 66 66 65 72 65 6e 74 6c  cated differentl
79c0: 79 20 66 72 6f 6d 20 74 68 65 20 6f 74 68 65 72  y from the other
79d0: 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a   schema.  ** obj
79e0: 65 63 74 73 20 28 75 73 69 6e 67 20 73 71 6c 69  ects (using sqli
79f0: 74 65 4d 61 6c 6c 6f 63 28 29 20 64 69 72 65 63  teMalloc() direc
7a00: 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  tly, instead of 
7a10: 73 71 6c 69 74 65 33 42 74 72 65 65 53 63 68 65  sqlite3BtreeSche
7a20: 6d 61 28 29 29 2e 0a 20 20 2a 2a 20 53 6f 20 69  ma())..  ** So i
7a30: 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 66 72  t needs to be fr
7a40: 65 65 64 20 68 65 72 65 2e 20 54 6f 64 6f 3a 20  eed here. Todo: 
7a50: 57 68 79 20 6e 6f 74 20 72 6f 6c 6c 20 74 68 65  Why not roll the
7a60: 20 74 65 6d 70 20 73 63 68 65 6d 61 20 69 6e 74   temp schema int
7a70: 6f 0a 20 20 2a 2a 20 74 68 65 20 73 61 6d 65 20  o.  ** the same 
7a80: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61  sqliteMalloc() a
7a90: 73 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 61  s the one that a
7aa0: 6c 6c 6f 63 61 74 65 73 20 74 68 65 20 64 61 74  llocates the dat
7ab0: 61 62 61 73 65 20 0a 20 20 2a 2a 20 73 74 72 75  abase .  ** stru
7ac0: 63 74 75 72 65 3f 0a 20 20 2a 2f 0a 20 20 73 71  cture?.  */.  sq
7ad0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
7ae0: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
7af0: 6d 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ma);.  sqlite3_m
7b00: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
7b10: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 6d 61 67  utex);.  db->mag
7b20: 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49  ic = SQLITE_MAGI
7b30: 43 5f 43 4c 4f 53 45 44 3b 0a 20 20 73 71 6c 69  C_CLOSED;.  sqli
7b40: 74 65 33 5f 6d 75 74 65 78 5f 66 72 65 65 28 64  te3_mutex_free(d
7b50: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
7b60: 65 72 74 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69  ert( db->lookasi
7b70: 64 65 2e 6e 4f 75 74 3d 3d 30 20 29 3b 20 20 2f  de.nOut==0 );  /
7b80: 2a 20 46 61 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f  * Fails on a loo
7b90: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 6c 65  kaside memory le
7ba0: 61 6b 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e  ak */.  if( db->
7bb0: 6c 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f  lookaside.bMallo
7bc0: 63 65 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ced ){.    sqlit
7bd0: 65 33 5f 66 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b  e3_free(db->look
7be0: 61 73 69 64 65 2e 70 53 74 61 72 74 29 3b 0a 20  aside.pStart);. 
7bf0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
7c00: 65 28 64 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  e(db);.}../*.** 
7c10: 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 64 61 74  Rollback all dat
7c20: 61 62 61 73 65 20 66 69 6c 65 73 2e 20 20 49 66  abase files.  If
7c30: 20 74 72 69 70 43 6f 64 65 20 69 73 20 6e 6f 74   tripCode is not
7c40: 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 74 68 65 6e   SQLITE_OK, then
7c50: 0a 2a 2a 20 61 6e 79 20 6f 70 65 6e 20 63 75 72  .** any open cur
7c60: 73 6f 72 73 20 61 72 65 20 69 6e 76 61 6c 69 64  sors are invalid
7c70: 61 74 65 64 20 28 22 74 72 69 70 70 65 64 22 20  ated ("tripped" 
7c80: 2d 20 61 73 20 69 6e 20 22 74 72 69 70 70 69 6e  - as in "trippin
7c90: 67 20 61 20 63 69 72 63 75 69 74 0a 2a 2a 20 62  g a circuit.** b
7ca0: 72 65 61 6b 65 72 22 29 20 61 6e 64 20 6d 61 64  reaker") and mad
7cb0: 65 20 74 6f 20 72 65 74 75 72 6e 20 74 72 69 70  e to return trip
7cc0: 43 6f 64 65 20 69 66 20 74 68 65 72 65 20 61 72  Code if there ar
7cd0: 65 20 61 6e 79 20 66 75 72 74 68 65 72 0a 2a 2a  e any further.**
7ce0: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 75 73 65   attempts to use
7cf0: 20 74 68 61 74 20 63 75 72 73 6f 72 2e 0a 2a 2f   that cursor..*/
7d00: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 6f 6c  .void sqlite3Rol
7d10: 6c 62 61 63 6b 41 6c 6c 28 73 71 6c 69 74 65 33  lbackAll(sqlite3
7d20: 20 2a 64 62 2c 20 69 6e 74 20 74 72 69 70 43 6f   *db, int tripCo
7d30: 64 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  de){.  int i;.  
7d40: 69 6e 74 20 69 6e 54 72 61 6e 73 20 3d 20 30 3b  int inTrans = 0;
7d50: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
7d60: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
7d70: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 73 71  ->mutex) );.  sq
7d80: 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
7d90: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20  Malloc();..  /* 
7da0: 4f 62 74 61 69 6e 20 61 6c 6c 20 62 2d 74 72 65  Obtain all b-tre
7db0: 65 20 6d 75 74 65 78 65 73 20 62 65 66 6f 72 65  e mutexes before
7dc0: 20 6d 61 6b 69 6e 67 20 61 6e 79 20 63 61 6c 6c   making any call
7dd0: 73 20 74 6f 20 42 74 72 65 65 52 6f 6c 6c 62 61  s to BtreeRollba
7de0: 63 6b 28 29 2e 20 0a 20 20 2a 2a 20 54 68 69 73  ck(). .  ** This
7df0: 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 69 6e   is important in
7e00: 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73 61   case the transa
7e10: 63 74 69 6f 6e 20 62 65 69 6e 67 20 72 6f 6c 6c  ction being roll
7e20: 65 64 20 62 61 63 6b 20 68 61 73 0a 20 20 2a 2a  ed back has.  **
7e30: 20 6d 6f 64 69 66 69 65 64 20 74 68 65 20 64 61   modified the da
7e40: 74 61 62 61 73 65 20 73 63 68 65 6d 61 2e 20 49  tabase schema. I
7e50: 66 20 74 68 65 20 62 2d 74 72 65 65 20 6d 75 74  f the b-tree mut
7e60: 65 78 65 73 20 61 72 65 20 6e 6f 74 20 74 61 6b  exes are not tak
7e70: 65 6e 0a 20 20 2a 2a 20 68 65 72 65 2c 20 74 68  en.  ** here, th
7e80: 65 6e 20 61 6e 6f 74 68 65 72 20 73 68 61 72 65  en another share
7e90: 64 2d 63 61 63 68 65 20 63 6f 6e 6e 65 63 74 69  d-cache connecti
7ea0: 6f 6e 20 6d 69 67 68 74 20 73 6e 65 61 6b 20 69  on might sneak i
7eb0: 6e 20 62 65 74 77 65 65 6e 0a 20 20 2a 2a 20 74  n between.  ** t
7ec0: 68 65 20 64 61 74 61 62 61 73 65 20 72 6f 6c 6c  he database roll
7ed0: 62 61 63 6b 20 61 6e 64 20 73 63 68 65 6d 61 20  back and schema 
7ee0: 72 65 73 65 74 2c 20 77 68 69 63 68 20 63 61 6e  reset, which can
7ef0: 20 63 61 75 73 65 20 66 61 6c 73 65 0a 20 20 2a   cause false.  *
7f00: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 72 65 70  * corruption rep
7f10: 6f 72 74 73 20 69 6e 20 73 6f 6d 65 20 63 61 73  orts in some cas
7f20: 65 73 2e 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  es.  */.  sqlite
7f30: 33 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64  3BtreeEnterAll(d
7f40: 62 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20  b);..  for(i=0; 
7f50: 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b  i<db->nDb; i++){
7f60: 0a 20 20 20 20 42 74 72 65 65 20 2a 70 20 3d 20  .    Btree *p = 
7f70: 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
7f80: 20 20 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20      if( p ){.   
7f90: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 42 74     if( sqlite3Bt
7fa0: 72 65 65 49 73 49 6e 54 72 61 6e 73 28 70 29 20  reeIsInTrans(p) 
7fb0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 54 72 61  ){.        inTra
7fc0: 6e 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ns = 1;.      }.
7fd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 74 72        sqlite3Btr
7fe0: 65 65 52 6f 6c 6c 62 61 63 6b 28 70 2c 20 74 72  eeRollback(p, tr
7ff0: 69 70 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20  ipCode);.    }. 
8000: 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61 62   }.  sqlite3Vtab
8010: 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 20 20  Rollback(db);.  
8020: 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e  sqlite3EndBenign
8030: 4d 61 6c 6c 6f 63 28 29 3b 0a 0a 20 20 69 66 28  Malloc();..  if(
8040: 20 28 64 62 2d 3e 66 6c 61 67 73 26 53 51 4c 49   (db->flags&SQLI
8050: 54 45 5f 49 6e 74 65 72 6e 43 68 61 6e 67 65 73  TE_InternChanges
8060: 29 21 3d 30 20 26 26 20 64 62 2d 3e 69 6e 69 74  )!=0 && db->init
8070: 2e 62 75 73 79 3d 3d 30 20 29 7b 0a 20 20 20 20  .busy==0 ){.    
8080: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
8090: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
80a0: 64 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  db);.    sqlite3
80b0: 52 65 73 65 74 41 6c 6c 53 63 68 65 6d 61 73 4f  ResetAllSchemasO
80c0: 66 43 6f 6e 6e 65 63 74 69 6f 6e 28 64 62 29 3b  fConnection(db);
80d0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74  .  }.  sqlite3Bt
80e0: 72 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b  reeLeaveAll(db);
80f0: 0a 0a 20 20 2f 2a 20 41 6e 79 20 64 65 66 65 72  ..  /* Any defer
8100: 72 65 64 20 63 6f 6e 73 74 72 61 69 6e 74 20 76  red constraint v
8110: 69 6f 6c 61 74 69 6f 6e 73 20 68 61 76 65 20 6e  iolations have n
8120: 6f 77 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  ow been resolved
8130: 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6e 44 65 66 65  . */.  db->nDefe
8140: 72 72 65 64 43 6f 6e 73 20 3d 20 30 3b 0a 20 20  rredCons = 0;.  
8150: 64 62 2d 3e 6e 44 65 66 65 72 72 65 64 49 6d 6d  db->nDeferredImm
8160: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Cons = 0;.  db->
8170: 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54 45  flags &= ~SQLITE
8180: 5f 44 65 66 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a  _DeferFKs;..  /*
8190: 20 49 66 20 6f 6e 65 20 68 61 73 20 62 65 65 6e   If one has been
81a0: 20 63 6f 6e 66 69 67 75 72 65 64 2c 20 69 6e 76   configured, inv
81b0: 6f 6b 65 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  oke the rollback
81c0: 2d 68 6f 6f 6b 20 63 61 6c 6c 62 61 63 6b 20 2a  -hook callback *
81d0: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 78 52 6f 6c  /.  if( db->xRol
81e0: 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20 26 26  lbackCallback &&
81f0: 20 28 69 6e 54 72 61 6e 73 20 7c 7c 20 21 64 62   (inTrans || !db
8200: 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 29 20 29 7b  ->autoCommit) ){
8210: 0a 20 20 20 20 64 62 2d 3e 78 52 6f 6c 6c 62 61  .    db->xRollba
8220: 63 6b 43 61 6c 6c 62 61 63 6b 28 64 62 2d 3e 70  ckCallback(db->p
8230: 52 6f 6c 6c 62 61 63 6b 41 72 67 29 3b 0a 20 20  RollbackArg);.  
8240: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  }.}../*.** Retur
8250: 6e 20 61 20 73 74 61 74 69 63 20 73 74 72 69 6e  n a static strin
8260: 67 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  g containing the
8270: 20 6e 61 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64   name correspond
8280: 69 6e 67 20 74 6f 20 74 68 65 20 65 72 72 6f 72  ing to the error
8290: 20 63 6f 64 65 0a 2a 2a 20 73 70 65 63 69 66 69   code.** specifi
82a0: 65 64 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  ed in the argume
82b0: 6e 74 2e 0a 2a 2f 0a 23 69 66 20 28 64 65 66 69  nt..*/.#if (defi
82c0: 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
82d0: 29 20 26 26 20 53 51 4c 49 54 45 5f 4f 53 5f 57  ) && SQLITE_OS_W
82e0: 49 4e 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  IN) || defined(S
82f0: 51 4c 49 54 45 5f 54 45 53 54 29 0a 63 6f 6e 73  QLITE_TEST).cons
8300: 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 45  t char *sqlite3E
8310: 72 72 4e 61 6d 65 28 69 6e 74 20 72 63 29 7b 0a  rrName(int rc){.
8320: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
8330: 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ame = 0;.  int i
8340: 2c 20 6f 72 69 67 52 63 20 3d 20 72 63 3b 0a 20  , origRc = rc;. 
8350: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 32 20 26 26   for(i=0; i<2 &&
8360: 20 7a 4e 61 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20   zName==0; i++, 
8370: 72 63 20 26 3d 20 30 78 66 66 29 7b 0a 20 20 20  rc &= 0xff){.   
8380: 20 73 77 69 74 63 68 28 20 72 63 20 29 7b 0a 20   switch( rc ){. 
8390: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
83a0: 5f 4f 4b 3a 20 20 20 20 20 20 20 20 20 20 20 20  _OK:            
83b0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
83c0: 4c 49 54 45 5f 4f 4b 22 3b 20 20 20 20 20 20 20  LITE_OK";       
83d0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
83e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
83f0: 45 5f 45 52 52 4f 52 3a 20 20 20 20 20 20 20 20  E_ERROR:        
8400: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8410: 51 4c 49 54 45 5f 45 52 52 4f 52 22 3b 20 20 20  QLITE_ERROR";   
8420: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
8430: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8440: 54 45 5f 49 4e 54 45 52 4e 41 4c 3a 20 20 20 20  TE_INTERNAL:    
8450: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8460: 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e 41 4c 22  SQLITE_INTERNAL"
8470: 3b 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  ;          break
8480: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8490: 49 54 45 5f 50 45 52 4d 3a 20 20 20 20 20 20 20  ITE_PERM:       
84a0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
84b0: 22 53 51 4c 49 54 45 5f 50 45 52 4d 22 3b 20 20  "SQLITE_PERM";  
84c0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
84d0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
84e0: 4c 49 54 45 5f 41 42 4f 52 54 3a 20 20 20 20 20  LITE_ABORT:     
84f0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8500: 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 22 3b   "SQLITE_ABORT";
8510: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
8520: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8530: 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
8540: 42 41 43 4b 3a 20 20 20 20 20 7a 4e 61 6d 65 20  BACK:     zName 
8550: 3d 20 22 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f  = "SQLITE_ABORT_
8560: 52 4f 4c 4c 42 41 43 4b 22 3b 20 20 20 20 62 72  ROLLBACK";    br
8570: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8580: 53 51 4c 49 54 45 5f 42 55 53 59 3a 20 20 20 20  SQLITE_BUSY:    
8590: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
85a0: 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59 22   = "SQLITE_BUSY"
85b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
85c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
85d0: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43   SQLITE_BUSY_REC
85e0: 4f 56 45 52 59 3a 20 20 20 20 20 20 7a 4e 61 6d  OVERY:      zNam
85f0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53 59  e = "SQLITE_BUSY
8600: 5f 52 45 43 4f 56 45 52 59 22 3b 20 20 20 20 20  _RECOVERY";     
8610: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8620: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e  e SQLITE_BUSY_SN
8630: 41 50 53 48 4f 54 3a 20 20 20 20 20 20 7a 4e 61  APSHOT:      zNa
8640: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 42 55 53  me = "SQLITE_BUS
8650: 59 5f 53 4e 41 50 53 48 4f 54 22 3b 20 20 20 20  Y_SNAPSHOT";    
8660: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8670: 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  se SQLITE_LOCKED
8680: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
8690: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f  ame = "SQLITE_LO
86a0: 43 4b 45 44 22 3b 20 20 20 20 20 20 20 20 20 20  CKED";          
86b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
86c0: 61 73 65 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  ase SQLITE_LOCKE
86d0: 44 5f 53 48 41 52 45 44 43 41 43 48 45 3a 20 7a  D_SHAREDCACHE: z
86e0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4c  Name = "SQLITE_L
86f0: 4f 43 4b 45 44 5f 53 48 41 52 45 44 43 41 43 48  OCKED_SHAREDCACH
8700: 45 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  E";break;.      
8710: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  case SQLITE_NOME
8720: 4d 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  M:              
8730: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8740: 4e 4f 4d 45 4d 22 3b 20 20 20 20 20 20 20 20 20  NOMEM";         
8750: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8760: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
8770: 44 4f 4e 4c 59 3a 20 20 20 20 20 20 20 20 20 20  DONLY:          
8780: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8790: 5f 52 45 41 44 4f 4e 4c 59 22 3b 20 20 20 20 20  _READONLY";     
87a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
87b0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45    case SQLITE_RE
87c0: 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 3a  ADONLY_RECOVERY:
87d0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
87e0: 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 45 43 4f 56  E_READONLY_RECOV
87f0: 45 52 59 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ERY"; break;.   
8800: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52     case SQLITE_R
8810: 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b  EADONLY_CANTLOCK
8820: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
8830: 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 43 41 4e 54  TE_READONLY_CANT
8840: 4c 4f 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20  LOCK"; break;.  
8850: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8860: 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43  READONLY_ROLLBAC
8870: 4b 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  K:  zName = "SQL
8880: 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c  ITE_READONLY_ROL
8890: 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b 3b 0a 20  LBACK"; break;. 
88a0: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
88b0: 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
88c0: 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  D:   zName = "SQ
88d0: 4c 49 54 45 5f 52 45 41 44 4f 4e 4c 59 5f 44 42  LITE_READONLY_DB
88e0: 4d 4f 56 45 44 22 3b 20 20 62 72 65 61 6b 3b 0a  MOVED";  break;.
88f0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8900: 45 5f 49 4e 54 45 52 52 55 50 54 3a 20 20 20 20  E_INTERRUPT:    
8910: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8920: 51 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 22  QLITE_INTERRUPT"
8930: 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;         break;
8940: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8950: 54 45 5f 49 4f 45 52 52 3a 20 20 20 20 20 20 20  TE_IOERR:       
8960: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8970: 53 51 4c 49 54 45 5f 49 4f 45 52 52 22 3b 20 20  SQLITE_IOERR";  
8980: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8990: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
89a0: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 3a 20  ITE_IOERR_READ: 
89b0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
89c0: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 45  "SQLITE_IOERR_RE
89d0: 41 44 22 3b 20 20 20 20 20 20 20 20 62 72 65 61  AD";        brea
89e0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
89f0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
8a00: 5f 52 45 41 44 3a 20 20 20 7a 4e 61 6d 65 20 3d  _READ:   zName =
8a10: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53   "SQLITE_IOERR_S
8a20: 48 4f 52 54 5f 52 45 41 44 22 3b 20 20 62 72 65  HORT_READ";  bre
8a30: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8a40: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
8a50: 45 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  E:        zName 
8a60: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8a70: 57 52 49 54 45 22 3b 20 20 20 20 20 20 20 62 72  WRITE";       br
8a80: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8a90: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
8aa0: 4e 43 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65  NC:        zName
8ab0: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8ac0: 5f 46 53 59 4e 43 22 3b 20 20 20 20 20 20 20 62  _FSYNC";       b
8ad0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8ae0: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49   SQLITE_IOERR_DI
8af0: 52 5f 46 53 59 4e 43 3a 20 20 20 20 7a 4e 61 6d  R_FSYNC:    zNam
8b00: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8b10: 52 5f 44 49 52 5f 46 53 59 4e 43 22 3b 20 20 20  R_DIR_FSYNC";   
8b20: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8b30: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54  e SQLITE_IOERR_T
8b40: 52 55 4e 43 41 54 45 3a 20 20 20 20 20 7a 4e 61  RUNCATE:     zNa
8b50: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8b60: 52 52 5f 54 52 55 4e 43 41 54 45 22 3b 20 20 20  RR_TRUNCATE";   
8b70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8b80: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8b90: 46 53 54 41 54 3a 20 20 20 20 20 20 20 20 7a 4e  FSTAT:        zN
8ba0: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8bb0: 45 52 52 5f 46 53 54 41 54 22 3b 20 20 20 20 20  ERR_FSTAT";     
8bc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8bd0: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8be0: 5f 55 4e 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a  _UNLOCK:       z
8bf0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8c00: 4f 45 52 52 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20  OERR_UNLOCK";   
8c10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8c20: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8c30: 52 5f 52 44 4c 4f 43 4b 3a 20 20 20 20 20 20 20  R_RDLOCK:       
8c40: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8c50: 49 4f 45 52 52 5f 52 44 4c 4f 43 4b 22 3b 20 20  IOERR_RDLOCK";  
8c60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8c70: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8c80: 52 52 5f 44 45 4c 45 54 45 3a 20 20 20 20 20 20  RR_DELETE:      
8c90: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8ca0: 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45 22 3b 20  _IOERR_DELETE"; 
8cb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8cc0: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8cd0: 45 52 52 5f 4e 4f 4d 45 4d 3a 20 20 20 20 20 20  ERR_NOMEM:      
8ce0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8cf0: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20  E_IOERR_NOMEM"; 
8d00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8d10: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8d20: 4f 45 52 52 5f 41 43 43 45 53 53 3a 20 20 20 20  OERR_ACCESS:    
8d30: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8d40: 54 45 5f 49 4f 45 52 52 5f 41 43 43 45 53 53 22  TE_IOERR_ACCESS"
8d50: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
8d60: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8d70: 49 4f 45 52 52 5f 43 48 45 43 4b 52 45 53 45 52  IOERR_CHECKRESER
8d80: 56 45 44 4c 4f 43 4b 3a 0a 20 20 20 20 20 20 20  VEDLOCK:.       
8d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8da0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
8db0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43   "SQLITE_IOERR_C
8dc0: 48 45 43 4b 52 45 53 45 52 56 45 44 4c 4f 43 4b  HECKRESERVEDLOCK
8dd0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
8de0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8df0: 52 5f 4c 4f 43 4b 3a 20 20 20 20 20 20 20 20 20  R_LOCK:         
8e00: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
8e10: 49 4f 45 52 52 5f 4c 4f 43 4b 22 3b 20 20 20 20  IOERR_LOCK";    
8e20: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
8e30: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
8e40: 52 52 5f 43 4c 4f 53 45 3a 20 20 20 20 20 20 20  RR_CLOSE:       
8e50: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8e60: 5f 49 4f 45 52 52 5f 43 4c 4f 53 45 22 3b 20 20  _IOERR_CLOSE";  
8e70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8e80: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
8e90: 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 3a 20 20  ERR_DIR_CLOSE:  
8ea0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8eb0: 45 5f 49 4f 45 52 52 5f 44 49 52 5f 43 4c 4f 53  E_IOERR_DIR_CLOS
8ec0: 45 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  E";   break;.   
8ed0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8ee0: 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 3a 20 20 20  OERR_SHMOPEN:   
8ef0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8f00: 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4f 50 45 4e  TE_IOERR_SHMOPEN
8f10: 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
8f20: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8f30: 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 3a 20 20  IOERR_SHMSIZE:  
8f40: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8f50: 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 53 49 5a  ITE_IOERR_SHMSIZ
8f60: 45 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  E";     break;. 
8f70: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8f80: 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20  _IOERR_SHMLOCK: 
8f90: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8fa0: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f  LITE_IOERR_SHMLO
8fb0: 43 4b 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  CK";     break;.
8fc0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8fd0: 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 3a 20  E_IOERR_SHMMAP: 
8fe0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8ff0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4d 4d  QLITE_IOERR_SHMM
9000: 41 50 22 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  AP";      break;
9010: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9020: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 3a 20 20  TE_IOERR_SEEK:  
9030: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9040: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 45 45  SQLITE_IOERR_SEE
9050: 4b 22 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b  K";        break
9060: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9070: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
9080: 5f 4e 4f 45 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20  _NOENT: zName = 
9090: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 45  "SQLITE_IOERR_DE
90a0: 4c 45 54 45 5f 4e 4f 45 4e 54 22 3b 62 72 65 61  LETE_NOENT";brea
90b0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
90c0: 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a  LITE_IOERR_MMAP:
90d0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
90e0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4d   "SQLITE_IOERR_M
90f0: 4d 41 50 22 3b 20 20 20 20 20 20 20 20 62 72 65  MAP";        bre
9100: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9110: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
9120: 45 4d 50 50 41 54 48 3a 20 20 7a 4e 61 6d 65 20  EMPPATH:  zName 
9130: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
9140: 47 45 54 54 45 4d 50 50 41 54 48 22 3b 20 62 72  GETTEMPPATH"; br
9150: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9160: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
9170: 56 50 41 54 48 3a 20 20 20 20 20 7a 4e 61 6d 65  VPATH:     zName
9180: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
9190: 5f 43 4f 4e 56 50 41 54 48 22 3b 20 20 20 20 62  _CONVPATH";    b
91a0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
91b0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3a   SQLITE_CORRUPT:
91c0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
91d0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52 52  e = "SQLITE_CORR
91e0: 55 50 54 22 3b 20 20 20 20 20 20 20 20 20 20 20  UPT";           
91f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9200: 65 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  e SQLITE_CORRUPT
9210: 5f 56 54 41 42 3a 20 20 20 20 20 20 20 7a 4e 61  _VTAB:       zNa
9220: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 52  me = "SQLITE_COR
9230: 52 55 50 54 5f 56 54 41 42 22 3b 20 20 20 20 20  RUPT_VTAB";     
9240: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9250: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  se SQLITE_NOTFOU
9260: 4e 44 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e  ND:           zN
9270: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
9280: 54 46 4f 55 4e 44 22 3b 20 20 20 20 20 20 20 20  TFOUND";        
9290: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
92a0: 61 73 65 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3a  ase SQLITE_FULL:
92b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
92c0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 46  Name = "SQLITE_F
92d0: 55 4c 4c 22 3b 20 20 20 20 20 20 20 20 20 20 20  ULL";           
92e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
92f0: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
9300: 4f 50 45 4e 3a 20 20 20 20 20 20 20 20 20 20 20  OPEN:           
9310: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
9320: 43 41 4e 54 4f 50 45 4e 22 3b 20 20 20 20 20 20  CANTOPEN";      
9330: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9340: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e   case SQLITE_CAN
9350: 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a  TOPEN_NOTEMPDIR:
9360: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9370: 5f 43 41 4e 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50  _CANTOPEN_NOTEMP
9380: 44 49 52 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  DIR";break;.    
9390: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41    case SQLITE_CA
93a0: 4e 54 4f 50 45 4e 5f 49 53 44 49 52 3a 20 20 20  NTOPEN_ISDIR:   
93b0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
93c0: 45 5f 43 41 4e 54 4f 50 45 4e 5f 49 53 44 49 52  E_CANTOPEN_ISDIR
93d0: 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ";    break;.   
93e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
93f0: 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
9400: 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49  :  zName = "SQLI
9410: 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c  TE_CANTOPEN_FULL
9420: 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20  PATH"; break;.  
9430: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9440: 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
9450: 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  H:  zName = "SQL
9460: 49 54 45 5f 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e  ITE_CANTOPEN_CON
9470: 56 50 41 54 48 22 3b 20 62 72 65 61 6b 3b 0a 20  VPATH"; break;. 
9480: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9490: 5f 50 52 4f 54 4f 43 4f 4c 3a 20 20 20 20 20 20  _PROTOCOL:      
94a0: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
94b0: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20  LITE_PROTOCOL"; 
94c0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
94d0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
94e0: 45 5f 45 4d 50 54 59 3a 20 20 20 20 20 20 20 20  E_EMPTY:        
94f0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9500: 51 4c 49 54 45 5f 45 4d 50 54 59 22 3b 20 20 20  QLITE_EMPTY";   
9510: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9520: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9530: 54 45 5f 53 43 48 45 4d 41 3a 20 20 20 20 20 20  TE_SCHEMA:      
9540: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9550: 53 51 4c 49 54 45 5f 53 43 48 45 4d 41 22 3b 20  SQLITE_SCHEMA"; 
9560: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9570: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9580: 49 54 45 5f 54 4f 4f 42 49 47 3a 20 20 20 20 20  ITE_TOOBIG:     
9590: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
95a0: 22 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 22 3b  "SQLITE_TOOBIG";
95b0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
95c0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
95d0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 3a  LITE_CONSTRAINT:
95e0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
95f0: 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41   "SQLITE_CONSTRA
9600: 49 4e 54 22 3b 20 20 20 20 20 20 20 20 62 72 65  INT";        bre
9610: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9620: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9630: 5f 55 4e 49 51 55 45 3a 20 20 7a 4e 61 6d 65 20  _UNIQUE:  zName 
9640: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
9650: 41 49 4e 54 5f 55 4e 49 51 55 45 22 3b 20 62 72  AINT_UNIQUE"; br
9660: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9670: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9680: 54 5f 54 52 49 47 47 45 52 3a 20 7a 4e 61 6d 65  T_TRIGGER: zName
9690: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
96a0: 52 41 49 4e 54 5f 54 52 49 47 47 45 52 22 3b 62  RAINT_TRIGGER";b
96b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
96c0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
96d0: 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59 3a 0a 20  NT_FOREIGNKEY:. 
96e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
96f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
9700: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9710: 4f 4e 53 54 52 41 49 4e 54 5f 46 4f 52 45 49 47  ONSTRAINT_FOREIG
9720: 4e 4b 45 59 22 3b 20 20 20 62 72 65 61 6b 3b 0a  NKEY";   break;.
9730: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9740: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45  E_CONSTRAINT_CHE
9750: 43 4b 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  CK:   zName = "S
9760: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9770: 5f 43 48 45 43 4b 22 3b 20 20 62 72 65 61 6b 3b  _CHECK";  break;
9780: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9790: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 50 52  TE_CONSTRAINT_PR
97a0: 49 4d 41 52 59 4b 45 59 3a 0a 20 20 20 20 20 20  IMARYKEY:.      
97b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97c0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
97d0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
97e0: 41 49 4e 54 5f 50 52 49 4d 41 52 59 4b 45 59 22  AINT_PRIMARYKEY"
97f0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ;   break;.     
9800: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
9810: 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a  STRAINT_NOTNULL:
9820: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9830: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 4e 4f 54 4e  _CONSTRAINT_NOTN
9840: 55 4c 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20  ULL";break;.    
9850: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
9860: 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d 49 54 48  NSTRAINT_COMMITH
9870: 4f 4f 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  OOK:.           
9880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9890: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
98a0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
98b0: 43 4f 4d 4d 49 54 48 4f 4f 4b 22 3b 20 20 20 62  COMMITHOOK";   b
98c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
98d0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
98e0: 4e 54 5f 56 54 41 42 3a 20 20 20 20 7a 4e 61 6d  NT_VTAB:    zNam
98f0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53  e = "SQLITE_CONS
9900: 54 52 41 49 4e 54 5f 56 54 41 42 22 3b 20 20 20  TRAINT_VTAB";   
9910: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9920: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
9930: 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20  INT_FUNCTION:.  
9940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
9960: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f  ame = "SQLITE_CO
9970: 4e 53 54 52 41 49 4e 54 5f 46 55 4e 43 54 49 4f  NSTRAINT_FUNCTIO
9980: 4e 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  N";     break;. 
9990: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
99a0: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
99b0: 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  D:   zName = "SQ
99c0: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
99d0: 52 4f 57 49 44 22 3b 20 20 62 72 65 61 6b 3b 0a  ROWID";  break;.
99e0: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
99f0: 45 5f 4d 49 53 4d 41 54 43 48 3a 20 20 20 20 20  E_MISMATCH:     
9a00: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9a10: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 22 3b  QLITE_MISMATCH";
9a20: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9a30: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9a40: 54 45 5f 4d 49 53 55 53 45 3a 20 20 20 20 20 20  TE_MISUSE:      
9a50: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9a60: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 22 3b 20  SQLITE_MISUSE"; 
9a70: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9a80: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9a90: 49 54 45 5f 4e 4f 4c 46 53 3a 20 20 20 20 20 20  ITE_NOLFS:      
9aa0: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9ab0: 22 53 51 4c 49 54 45 5f 4e 4f 4c 46 53 22 3b 20  "SQLITE_NOLFS"; 
9ac0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9ad0: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9ae0: 4c 49 54 45 5f 41 55 54 48 3a 20 20 20 20 20 20  LITE_AUTH:      
9af0: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9b00: 20 22 53 51 4c 49 54 45 5f 41 55 54 48 22 3b 20   "SQLITE_AUTH"; 
9b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
9b20: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9b30: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 3a 20 20 20  QLITE_FORMAT:   
9b40: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9b50: 3d 20 22 53 51 4c 49 54 45 5f 46 4f 52 4d 41 54  = "SQLITE_FORMAT
9b60: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
9b70: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9b80: 53 51 4c 49 54 45 5f 52 41 4e 47 45 3a 20 20 20  SQLITE_RANGE:   
9b90: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9ba0: 20 3d 20 22 53 51 4c 49 54 45 5f 52 41 4e 47 45   = "SQLITE_RANGE
9bb0: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ";             b
9bc0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9bd0: 20 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 3a 20   SQLITE_NOTADB: 
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9bf0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 41  e = "SQLITE_NOTA
9c00: 44 42 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  DB";            
9c10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9c20: 65 20 53 51 4c 49 54 45 5f 52 4f 57 3a 20 20 20  e SQLITE_ROW:   
9c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61               zNa
9c40: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 4f 57  me = "SQLITE_ROW
9c50: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ";              
9c60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9c70: 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  se SQLITE_NOTICE
9c80: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e  :             zN
9c90: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f  ame = "SQLITE_NO
9ca0: 54 49 43 45 22 3b 20 20 20 20 20 20 20 20 20 20  TICE";          
9cb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9cc0: 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43  ase SQLITE_NOTIC
9cd0: 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 3a 20 7a  E_RECOVER_WAL: z
9ce0: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e  Name = "SQLITE_N
9cf0: 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f 57 41  OTICE_RECOVER_WA
9d00: 4c 22 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  L";break;.      
9d10: 63 61 73 65 20 53 51 4c 49 54 45 5f 4e 4f 54 49  case SQLITE_NOTI
9d20: 43 45 5f 52 45 43 4f 56 45 52 5f 52 4f 4c 4c 42  CE_RECOVER_ROLLB
9d30: 41 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  ACK:.           
9d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9d50: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9d60: 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45 43 4f  LITE_NOTICE_RECO
9d70: 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 22 3b 20 62  VER_ROLLBACK"; b
9d80: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9d90: 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 3a   SQLITE_WARNING:
9da0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
9db0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52 4e  e = "SQLITE_WARN
9dc0: 49 4e 47 22 3b 20 20 20 20 20 20 20 20 20 20 20  ING";           
9dd0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9de0: 65 20 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  e SQLITE_WARNING
9df0: 5f 41 55 54 4f 49 4e 44 45 58 3a 20 20 7a 4e 61  _AUTOINDEX:  zNa
9e00: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 57 41 52  me = "SQLITE_WAR
9e10: 4e 49 4e 47 5f 41 55 54 4f 49 4e 44 45 58 22 3b  NING_AUTOINDEX";
9e20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
9e30: 73 65 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3a 20  se SQLITE_DONE: 
9e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e                zN
9e50: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 44 4f  ame = "SQLITE_DO
9e60: 4e 45 22 3b 20 20 20 20 20 20 20 20 20 20 20 20  NE";            
9e70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9e80: 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d   }.  if( zName==
9e90: 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
9ea0: 63 68 61 72 20 7a 42 75 66 5b 35 30 5d 3b 0a 20  char zBuf[50];. 
9eb0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
9ec0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
9ed0: 2c 20 7a 42 75 66 2c 20 22 53 51 4c 49 54 45 5f  , zBuf, "SQLITE_
9ee0: 55 4e 4b 4e 4f 57 4e 28 25 64 29 22 2c 20 6f 72  UNKNOWN(%d)", or
9ef0: 69 67 52 63 29 3b 0a 20 20 20 20 7a 4e 61 6d 65  igRc);.    zName
9f00: 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20 20 72   = zBuf;.  }.  r
9f10: 65 74 75 72 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23  eturn zName;.}.#
9f20: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
9f30: 75 72 6e 20 61 20 73 74 61 74 69 63 20 73 74 72  urn a static str
9f40: 69 6e 67 20 74 68 61 74 20 64 65 73 63 72 69 62  ing that describ
9f50: 65 73 20 74 68 65 20 6b 69 6e 64 20 6f 66 20 65  es the kind of e
9f60: 72 72 6f 72 20 73 70 65 63 69 66 69 65 64 20 69  rror specified i
9f70: 6e 20 74 68 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  n the.** argumen
9f80: 74 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  t..*/.const char
9f90: 20 2a 73 71 6c 69 74 65 33 45 72 72 53 74 72 28   *sqlite3ErrStr(
9fa0: 69 6e 74 20 72 63 29 7b 0a 20 20 73 74 61 74 69  int rc){.  stati
9fb0: 63 20 63 6f 6e 73 74 20 63 68 61 72 2a 20 63 6f  c const char* co
9fc0: 6e 73 74 20 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20  nst aMsg[] = {. 
9fd0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4b 20     /* SQLITE_OK 
9fe0: 20 20 20 20 20 20 20 20 20 2a 2f 20 22 6e 6f 74           */ "not
9ff0: 20 61 6e 20 65 72 72 6f 72 22 2c 0a 20 20 20 20   an error",.    
a000: 2f 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 20  /* SQLITE_ERROR 
a010: 20 20 20 20 20 20 2a 2f 20 22 53 51 4c 20 6c 6f        */ "SQL lo
a020: 67 69 63 20 65 72 72 6f 72 20 6f 72 20 6d 69 73  gic error or mis
a030: 73 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c 0a  sing database",.
a040: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4e      /* SQLITE_IN
a050: 54 45 52 4e 41 4c 20 20 20 20 2a 2f 20 30 2c 0a  TERNAL    */ 0,.
a060: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 50 45      /* SQLITE_PE
a070: 52 4d 20 20 20 20 20 20 20 20 2a 2f 20 22 61 63  RM        */ "ac
a080: 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 20  cess permission 
a090: 64 65 6e 69 65 64 22 2c 0a 20 20 20 20 2f 2a 20  denied",.    /* 
a0a0: 53 51 4c 49 54 45 5f 41 42 4f 52 54 20 20 20 20  SQLITE_ABORT    
a0b0: 20 20 20 2a 2f 20 22 63 61 6c 6c 62 61 63 6b 20     */ "callback 
a0c0: 72 65 71 75 65 73 74 65 64 20 71 75 65 72 79 20  requested query 
a0d0: 61 62 6f 72 74 22 2c 0a 20 20 20 20 2f 2a 20 53  abort",.    /* S
a0e0: 51 4c 49 54 45 5f 42 55 53 59 20 20 20 20 20 20  QLITE_BUSY      
a0f0: 20 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 69    */ "database i
a100: 73 20 6c 6f 63 6b 65 64 22 2c 0a 20 20 20 20 2f  s locked",.    /
a110: 2a 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20  * SQLITE_LOCKED 
a120: 20 20 20 20 20 2a 2f 20 22 64 61 74 61 62 61 73       */ "databas
a130: 65 20 74 61 62 6c 65 20 69 73 20 6c 6f 63 6b 65  e table is locke
a140: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
a150: 45 5f 4e 4f 4d 45 4d 20 20 20 20 20 20 20 2a 2f  E_NOMEM       */
a160: 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22   "out of memory"
a170: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a180: 52 45 41 44 4f 4e 4c 59 20 20 20 20 2a 2f 20 22  READONLY    */ "
a190: 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
a1a0: 20 61 20 72 65 61 64 6f 6e 6c 79 20 64 61 74 61   a readonly data
a1b0: 62 61 73 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  base",.    /* SQ
a1c0: 4c 49 54 45 5f 49 4e 54 45 52 52 55 50 54 20 20  LITE_INTERRUPT  
a1d0: 20 2a 2f 20 22 69 6e 74 65 72 72 75 70 74 65 64   */ "interrupted
a1e0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a1f0: 5f 49 4f 45 52 52 20 20 20 20 20 20 20 2a 2f 20  _IOERR       */ 
a200: 22 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 22  "disk I/O error"
a210: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a220: 43 4f 52 52 55 50 54 20 20 20 20 20 2a 2f 20 22  CORRUPT     */ "
a230: 64 61 74 61 62 61 73 65 20 64 69 73 6b 20 69 6d  database disk im
a240: 61 67 65 20 69 73 20 6d 61 6c 66 6f 72 6d 65 64  age is malformed
a250: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a260: 5f 4e 4f 54 46 4f 55 4e 44 20 20 20 20 2a 2f 20  _NOTFOUND    */ 
a270: 22 75 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69  "unknown operati
a280: 6f 6e 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  on",.    /* SQLI
a290: 54 45 5f 46 55 4c 4c 20 20 20 20 20 20 20 20 2a  TE_FULL        *
a2a0: 2f 20 22 64 61 74 61 62 61 73 65 20 6f 72 20 64  / "database or d
a2b0: 69 73 6b 20 69 73 20 66 75 6c 6c 22 2c 0a 20 20  isk is full",.  
a2c0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 41 4e 54    /* SQLITE_CANT
a2d0: 4f 50 45 4e 20 20 20 20 2a 2f 20 22 75 6e 61 62  OPEN    */ "unab
a2e0: 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62  le to open datab
a2f0: 61 73 65 20 66 69 6c 65 22 2c 0a 20 20 20 20 2f  ase file",.    /
a300: 2a 20 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f  * SQLITE_PROTOCO
a310: 4c 20 20 20 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67  L    */ "locking
a320: 20 70 72 6f 74 6f 63 6f 6c 22 2c 0a 20 20 20 20   protocol",.    
a330: 2f 2a 20 53 51 4c 49 54 45 5f 45 4d 50 54 59 20  /* SQLITE_EMPTY 
a340: 20 20 20 20 20 20 2a 2f 20 22 74 61 62 6c 65 20        */ "table 
a350: 63 6f 6e 74 61 69 6e 73 20 6e 6f 20 64 61 74 61  contains no data
a360: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a370: 5f 53 43 48 45 4d 41 20 20 20 20 20 20 2a 2f 20  _SCHEMA      */ 
a380: 22 64 61 74 61 62 61 73 65 20 73 63 68 65 6d 61  "database schema
a390: 20 68 61 73 20 63 68 61 6e 67 65 64 22 2c 0a 20   has changed",. 
a3a0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 54 4f 4f     /* SQLITE_TOO
a3b0: 42 49 47 20 20 20 20 20 20 2a 2f 20 22 73 74 72  BIG      */ "str
a3c0: 69 6e 67 20 6f 72 20 62 6c 6f 62 20 74 6f 6f 20  ing or blob too 
a3d0: 62 69 67 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  big",.    /* SQL
a3e0: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 20 20  ITE_CONSTRAINT  
a3f0: 2a 2f 20 22 63 6f 6e 73 74 72 61 69 6e 74 20 66  */ "constraint f
a400: 61 69 6c 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53  ailed",.    /* S
a410: 51 4c 49 54 45 5f 4d 49 53 4d 41 54 43 48 20 20  QLITE_MISMATCH  
a420: 20 20 2a 2f 20 22 64 61 74 61 74 79 70 65 20 6d    */ "datatype m
a430: 69 73 6d 61 74 63 68 22 2c 0a 20 20 20 20 2f 2a  ismatch",.    /*
a440: 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 20 20   SQLITE_MISUSE  
a450: 20 20 20 20 2a 2f 20 22 6c 69 62 72 61 72 79 20      */ "library 
a460: 72 6f 75 74 69 6e 65 20 63 61 6c 6c 65 64 20 6f  routine called o
a470: 75 74 20 6f 66 20 73 65 71 75 65 6e 63 65 22 2c  ut of sequence",
a480: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e  .    /* SQLITE_N
a490: 4f 4c 46 53 20 20 20 20 20 20 20 2a 2f 20 22 6c  OLFS       */ "l
a4a0: 61 72 67 65 20 66 69 6c 65 20 73 75 70 70 6f 72  arge file suppor
a4b0: 74 20 69 73 20 64 69 73 61 62 6c 65 64 22 2c 0a  t is disabled",.
a4c0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 41 55      /* SQLITE_AU
a4d0: 54 48 20 20 20 20 20 20 20 20 2a 2f 20 22 61 75  TH        */ "au
a4e0: 74 68 6f 72 69 7a 61 74 69 6f 6e 20 64 65 6e 69  thorization deni
a4f0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
a500: 54 45 5f 46 4f 52 4d 41 54 20 20 20 20 20 20 2a  TE_FORMAT      *
a510: 2f 20 22 61 75 78 69 6c 69 61 72 79 20 64 61 74  / "auxiliary dat
a520: 61 62 61 73 65 20 66 6f 72 6d 61 74 20 65 72 72  abase format err
a530: 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  or",.    /* SQLI
a540: 54 45 5f 52 41 4e 47 45 20 20 20 20 20 20 20 2a  TE_RANGE       *
a550: 2f 20 22 62 69 6e 64 20 6f 72 20 63 6f 6c 75 6d  / "bind or colum
a560: 6e 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72  n index out of r
a570: 61 6e 67 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  ange",.    /* SQ
a580: 4c 49 54 45 5f 4e 4f 54 41 44 42 20 20 20 20 20  LITE_NOTADB     
a590: 20 2a 2f 20 22 66 69 6c 65 20 69 73 20 65 6e 63   */ "file is enc
a5a0: 72 79 70 74 65 64 20 6f 72 20 69 73 20 6e 6f 74  rypted or is not
a5b0: 20 61 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20   a database",.  
a5c0: 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  };.  const char 
a5d0: 2a 7a 45 72 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e  *zErr = "unknown
a5e0: 20 65 72 72 6f 72 22 3b 0a 20 20 73 77 69 74 63   error";.  switc
a5f0: 68 28 20 72 63 20 29 7b 0a 20 20 20 20 63 61 73  h( rc ){.    cas
a600: 65 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52  e SQLITE_ABORT_R
a610: 4f 4c 4c 42 41 43 4b 3a 20 7b 0a 20 20 20 20 20  OLLBACK: {.     
a620: 20 7a 45 72 72 20 3d 20 22 61 62 6f 72 74 20 64   zErr = "abort d
a630: 75 65 20 74 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b  ue to ROLLBACK";
a640: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a650: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
a660: 20 7b 0a 20 20 20 20 20 20 72 63 20 26 3d 20 30   {.      rc &= 0
a670: 78 66 66 3b 0a 20 20 20 20 20 20 69 66 28 20 41  xff;.      if( A
a680: 4c 57 41 59 53 28 72 63 3e 3d 30 29 20 26 26 20  LWAYS(rc>=0) && 
a690: 72 63 3c 41 72 72 61 79 53 69 7a 65 28 61 4d 73  rc<ArraySize(aMs
a6a0: 67 29 20 26 26 20 61 4d 73 67 5b 72 63 5d 21 3d  g) && aMsg[rc]!=
a6b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 45 72  0 ){.        zEr
a6c0: 72 20 3d 20 61 4d 73 67 5b 72 63 5d 3b 0a 20 20  r = aMsg[rc];.  
a6d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
a6e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
a6f0: 65 74 75 72 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f  eturn zErr;.}../
a700: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
a710: 65 20 69 6d 70 6c 65 6d 65 6e 74 73 20 61 20 62  e implements a b
a720: 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 74 68 61  usy callback tha
a730: 74 20 73 6c 65 65 70 73 20 61 6e 64 20 74 72 69  t sleeps and tri
a740: 65 73 0a 2a 2a 20 61 67 61 69 6e 20 75 6e 74 69  es.** again unti
a750: 6c 20 61 20 74 69 6d 65 6f 75 74 20 76 61 6c 75  l a timeout valu
a760: 65 20 69 73 20 72 65 61 63 68 65 64 2e 20 20 54  e is reached.  T
a770: 68 65 20 74 69 6d 65 6f 75 74 20 76 61 6c 75 65  he timeout value
a780: 20 69 73 0a 2a 2a 20 61 6e 20 69 6e 74 65 67 65   is.** an intege
a790: 72 20 6e 75 6d 62 65 72 20 6f 66 20 6d 69 6c 6c  r number of mill
a7a0: 69 73 65 63 6f 6e 64 73 20 70 61 73 73 65 64 20  iseconds passed 
a7b0: 69 6e 20 61 73 20 74 68 65 20 66 69 72 73 74 0a  in as the first.
a7c0: 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ** argument..*/.
a7d0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
a7e0: 65 44 65 66 61 75 6c 74 42 75 73 79 43 61 6c 6c  eDefaultBusyCall
a7f0: 62 61 63 6b 28 0a 20 76 6f 69 64 20 2a 70 74 72  back(. void *ptr
a800: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
a810: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
a820: 65 63 74 69 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63  ection */. int c
a830: 6f 75 6e 74 20 20 20 20 20 20 20 20 20 20 20 20  ount            
a840: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a850: 20 74 69 6d 65 73 20 74 61 62 6c 65 20 68 61 73   times table has
a860: 20 62 65 65 6e 20 62 75 73 79 20 2a 2f 0a 29 7b   been busy */.){
a870: 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f 53 5f 57  .#if SQLITE_OS_W
a880: 49 4e 20 7c 7c 20 28 64 65 66 69 6e 65 64 28 48  IN || (defined(H
a890: 41 56 45 5f 55 53 4c 45 45 50 29 20 26 26 20 48  AVE_USLEEP) && H
a8a0: 41 56 45 5f 55 53 4c 45 45 50 29 0a 20 20 73 74  AVE_USLEEP).  st
a8b0: 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 64 65  atic const u8 de
a8c0: 6c 61 79 73 5b 5d 20 3d 0a 20 20 20 20 20 7b 20  lays[] =.     { 
a8d0: 31 2c 20 32 2c 20 35 2c 20 31 30 2c 20 31 35 2c  1, 2, 5, 10, 15,
a8e0: 20 32 30 2c 20 32 35 2c 20 32 35 2c 20 20 32 35   20, 25, 25,  25
a8f0: 2c 20 20 35 30 2c 20 20 35 30 2c 20 31 30 30 20  ,  50,  50, 100 
a900: 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
a910: 74 20 75 38 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a  t u8 totals[] =.
a920: 20 20 20 20 20 7b 20 30 2c 20 31 2c 20 33 2c 20       { 0, 1, 3, 
a930: 20 38 2c 20 31 38 2c 20 33 33 2c 20 35 33 2c 20   8, 18, 33, 53, 
a940: 37 38 2c 20 31 30 33 2c 20 31 32 38 2c 20 31 37  78, 103, 128, 17
a950: 38 2c 20 32 32 38 20 7d 3b 0a 23 20 64 65 66 69  8, 228 };.# defi
a960: 6e 65 20 4e 44 45 4c 41 59 20 41 72 72 61 79 53  ne NDELAY ArrayS
a970: 69 7a 65 28 64 65 6c 61 79 73 29 0a 20 20 73 71  ize(delays).  sq
a980: 6c 69 74 65 33 20 2a 64 62 20 3d 20 28 73 71 6c  lite3 *db = (sql
a990: 69 74 65 33 20 2a 29 70 74 72 3b 0a 20 20 69 6e  ite3 *)ptr;.  in
a9a0: 74 20 74 69 6d 65 6f 75 74 20 3d 20 64 62 2d 3e  t timeout = db->
a9b0: 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20 69  busyTimeout;.  i
a9c0: 6e 74 20 64 65 6c 61 79 2c 20 70 72 69 6f 72 3b  nt delay, prior;
a9d0: 0a 0a 20 20 61 73 73 65 72 74 28 20 63 6f 75 6e  ..  assert( coun
a9e0: 74 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 63 6f  t>=0 );.  if( co
a9f0: 75 6e 74 20 3c 20 4e 44 45 4c 41 59 20 29 7b 0a  unt < NDELAY ){.
aa00: 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61      delay = dela
aa10: 79 73 5b 63 6f 75 6e 74 5d 3b 0a 20 20 20 20 70  ys[count];.    p
aa20: 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 63 6f  rior = totals[co
aa30: 75 6e 74 5d 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  unt];.  }else{. 
aa40: 20 20 20 64 65 6c 61 79 20 3d 20 64 65 6c 61 79     delay = delay
aa50: 73 5b 4e 44 45 4c 41 59 2d 31 5d 3b 0a 20 20 20  s[NDELAY-1];.   
aa60: 20 70 72 69 6f 72 20 3d 20 74 6f 74 61 6c 73 5b   prior = totals[
aa70: 4e 44 45 4c 41 59 2d 31 5d 20 2b 20 64 65 6c 61  NDELAY-1] + dela
aa80: 79 2a 28 63 6f 75 6e 74 2d 28 4e 44 45 4c 41 59  y*(count-(NDELAY
aa90: 2d 31 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  -1));.  }.  if( 
aaa0: 70 72 69 6f 72 20 2b 20 64 65 6c 61 79 20 3e 20  prior + delay > 
aab0: 74 69 6d 65 6f 75 74 20 29 7b 0a 20 20 20 20 64  timeout ){.    d
aac0: 65 6c 61 79 20 3d 20 74 69 6d 65 6f 75 74 20 2d  elay = timeout -
aad0: 20 70 72 69 6f 72 3b 0a 20 20 20 20 69 66 28 20   prior;.    if( 
aae0: 64 65 6c 61 79 3c 3d 30 20 29 20 72 65 74 75 72  delay<=0 ) retur
aaf0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  n 0;.  }.  sqlit
ab00: 65 33 4f 73 53 6c 65 65 70 28 64 62 2d 3e 70 56  e3OsSleep(db->pV
ab10: 66 73 2c 20 64 65 6c 61 79 2a 31 30 30 30 29 3b  fs, delay*1000);
ab20: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c  .  return 1;.#el
ab30: 73 65 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  se.  sqlite3 *db
ab40: 20 3d 20 28 73 71 6c 69 74 65 33 20 2a 29 70 74   = (sqlite3 *)pt
ab50: 72 3b 0a 20 20 69 6e 74 20 74 69 6d 65 6f 75 74  r;.  int timeout
ab60: 20 3d 20 28 28 73 71 6c 69 74 65 33 20 2a 29 70   = ((sqlite3 *)p
ab70: 74 72 29 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74  tr)->busyTimeout
ab80: 3b 0a 20 20 69 66 28 20 28 63 6f 75 6e 74 2b 31  ;.  if( (count+1
ab90: 29 2a 31 30 30 30 20 3e 20 74 69 6d 65 6f 75 74  )*1000 > timeout
aba0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
abb0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
abc0: 73 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c  sSleep(db->pVfs,
abd0: 20 31 30 30 30 30 30 30 29 3b 0a 20 20 72 65 74   1000000);.  ret
abe0: 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a  urn 1;.#endif.}.
abf0: 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68  ./*.** Invoke th
ac00: 65 20 67 69 76 65 6e 20 62 75 73 79 20 68 61 6e  e given busy han
ac10: 64 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  dler..**.** This
ac20: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
ac30: 65 64 20 77 68 65 6e 20 61 6e 20 6f 70 65 72 61  ed when an opera
ac40: 74 69 6f 6e 20 66 61 69 6c 65 64 20 77 69 74 68  tion failed with
ac50: 20 61 20 6c 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74   a lock..** If t
ac60: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
ac70: 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68  rns non-zero, th
ac80: 65 20 6c 6f 63 6b 20 69 73 20 72 65 74 72 69 65  e lock is retrie
ac90: 64 2e 20 20 49 66 20 69 74 0a 2a 2a 20 72 65 74  d.  If it.** ret
aca0: 75 72 6e 73 20 30 2c 20 74 68 65 20 6f 70 65 72  urns 0, the oper
acb0: 61 74 69 6f 6e 20 61 62 6f 72 74 73 20 77 69 74  ation aborts wit
acc0: 68 20 61 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  h an SQLITE_BUSY
acd0: 20 65 72 72 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73   error..*/.int s
ace0: 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
acf0: 48 61 6e 64 6c 65 72 28 42 75 73 79 48 61 6e 64  Handler(BusyHand
ad00: 6c 65 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 72  ler *p){.  int r
ad10: 63 3b 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  c;.  if( NEVER(p
ad20: 3d 3d 30 29 20 7c 7c 20 70 2d 3e 78 46 75 6e 63  ==0) || p->xFunc
ad30: 3d 3d 30 20 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c  ==0 || p->nBusy<
ad40: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
ad50: 72 63 20 3d 20 70 2d 3e 78 46 75 6e 63 28 70 2d  rc = p->xFunc(p-
ad60: 3e 70 41 72 67 2c 20 70 2d 3e 6e 42 75 73 79 29  >pArg, p->nBusy)
ad70: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
ad80: 0a 20 20 20 20 70 2d 3e 6e 42 75 73 79 20 3d 20  .    p->nBusy = 
ad90: 2d 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  -1;.  }else{.   
ada0: 20 70 2d 3e 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d   p->nBusy++;.  }
adb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 0a 7d  .  return rc; .}
adc0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
add0: 74 69 6e 65 20 73 65 74 73 20 74 68 65 20 62 75  tine sets the bu
ade0: 73 79 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20  sy callback for 
adf0: 61 6e 20 53 71 6c 69 74 65 20 64 61 74 61 62 61  an Sqlite databa
ae00: 73 65 20 74 6f 20 74 68 65 0a 2a 2a 20 67 69 76  se to the.** giv
ae10: 65 6e 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63  en callback func
ae20: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 67 69  tion with the gi
ae30: 76 65 6e 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ven argument..*/
ae40: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 62 75 73  .int sqlite3_bus
ae50: 79 5f 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c  y_handler(.  sql
ae60: 69 74 65 33 20 2a 64 62 2c 0a 20 20 69 6e 74 20  ite3 *db,.  int 
ae70: 28 2a 78 42 75 73 79 29 28 76 6f 69 64 2a 2c 69  (*xBusy)(void*,i
ae80: 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  nt),.  void *pAr
ae90: 67 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  g.){.  sqlite3_m
aea0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
aeb0: 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e 62 75 73  utex);.  db->bus
aec0: 79 48 61 6e 64 6c 65 72 2e 78 46 75 6e 63 20 3d  yHandler.xFunc =
aed0: 20 78 42 75 73 79 3b 0a 20 20 64 62 2d 3e 62 75   xBusy;.  db->bu
aee0: 73 79 48 61 6e 64 6c 65 72 2e 70 41 72 67 20 3d  syHandler.pArg =
aef0: 20 70 41 72 67 3b 0a 20 20 64 62 2d 3e 62 75 73   pArg;.  db->bus
af00: 79 48 61 6e 64 6c 65 72 2e 6e 42 75 73 79 20 3d  yHandler.nBusy =
af10: 20 30 3b 0a 20 20 64 62 2d 3e 62 75 73 79 54 69   0;.  db->busyTi
af20: 6d 65 6f 75 74 20 3d 20 30 3b 0a 20 20 73 71 6c  meout = 0;.  sql
af30: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
af40: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
af50: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
af60: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
af70: 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53 53  TE_OMIT_PROGRESS
af80: 5f 43 41 4c 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20  _CALLBACK./*.** 
af90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 65 74  This routine set
afa0: 73 20 74 68 65 20 70 72 6f 67 72 65 73 73 20 63  s the progress c
afb0: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
afc0: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
afd0: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
afe0: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
aff0: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
b000: 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 20 70 72  argument. The pr
b010: 6f 67 72 65 73 73 20 63 61 6c 6c 62 61 63 6b 20  ogress callback 
b020: 77 69 6c 6c 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b  will.** be invok
b030: 65 64 20 65 76 65 72 79 20 6e 4f 70 73 20 6f 70  ed every nOps op
b040: 63 6f 64 65 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  codes..*/.void s
b050: 71 6c 69 74 65 33 5f 70 72 6f 67 72 65 73 73 5f  qlite3_progress_
b060: 68 61 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74  handler(.  sqlit
b070: 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 6e  e3 *db, .  int n
b080: 4f 70 73 2c 0a 20 20 69 6e 74 20 28 2a 78 50 72  Ops,.  int (*xPr
b090: 6f 67 72 65 73 73 29 28 76 6f 69 64 2a 29 2c 20  ogress)(void*), 
b0a0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
b0b0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
b0c0: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
b0d0: 29 3b 0a 20 20 69 66 28 20 6e 4f 70 73 3e 30 20  );.  if( nOps>0 
b0e0: 29 7b 0a 20 20 20 20 64 62 2d 3e 78 50 72 6f 67  ){.    db->xProg
b0f0: 72 65 73 73 20 3d 20 78 50 72 6f 67 72 65 73 73  ress = xProgress
b100: 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72  ;.    db->nProgr
b110: 65 73 73 4f 70 73 20 3d 20 28 75 6e 73 69 67 6e  essOps = (unsign
b120: 65 64 29 6e 4f 70 73 3b 0a 20 20 20 20 64 62 2d  ed)nOps;.    db-
b130: 3e 70 50 72 6f 67 72 65 73 73 41 72 67 20 3d 20  >pProgressArg = 
b140: 70 41 72 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  pArg;.  }else{. 
b150: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
b160: 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6e 50   = 0;.    db->nP
b170: 72 6f 67 72 65 73 73 4f 70 73 20 3d 20 30 3b 0a  rogressOps = 0;.
b180: 20 20 20 20 64 62 2d 3e 70 50 72 6f 67 72 65 73      db->pProgres
b190: 73 41 72 67 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  sArg = 0;.  }.  
b1a0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
b1b0: 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
b1c0: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
b1d0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e   This routine in
b1e0: 73 74 61 6c 6c 73 20 61 20 64 65 66 61 75 6c 74  stalls a default
b1f0: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 74 68   busy handler th
b200: 61 74 20 77 61 69 74 73 20 66 6f 72 20 74 68 65  at waits for the
b210: 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 6e 75  .** specified nu
b220: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
b230: 6f 6e 64 73 20 62 65 66 6f 72 65 20 72 65 74 75  onds before retu
b240: 72 6e 69 6e 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20  rning 0..*/.int 
b250: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74 69 6d  sqlite3_busy_tim
b260: 65 6f 75 74 28 73 71 6c 69 74 65 33 20 2a 64 62  eout(sqlite3 *db
b270: 2c 20 69 6e 74 20 6d 73 29 7b 0a 20 20 69 66 28  , int ms){.  if(
b280: 20 6d 73 3e 30 20 29 7b 0a 20 20 20 20 73 71 6c   ms>0 ){.    sql
b290: 69 74 65 33 5f 62 75 73 79 5f 68 61 6e 64 6c 65  ite3_busy_handle
b2a0: 72 28 64 62 2c 20 73 71 6c 69 74 65 44 65 66 61  r(db, sqliteDefa
b2b0: 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b 2c  ultBusyCallback,
b2c0: 20 28 76 6f 69 64 2a 29 64 62 29 3b 0a 20 20 20   (void*)db);.   
b2d0: 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75 74   db->busyTimeout
b2e0: 20 3d 20 6d 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a   = ms;.  }else{.
b2f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79      sqlite3_busy
b300: 5f 68 61 6e 64 6c 65 72 28 64 62 2c 20 30 2c 20  _handler(db, 0, 
b310: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
b320: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
b330: 2a 0a 2a 2a 20 43 61 75 73 65 20 61 6e 79 20 70  *.** Cause any p
b340: 65 6e 64 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ending operation
b350: 20 74 6f 20 73 74 6f 70 20 61 74 20 69 74 73 20   to stop at its 
b360: 65 61 72 6c 69 65 73 74 20 6f 70 70 6f 72 74 75  earliest opportu
b370: 6e 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  nity..*/.void sq
b380: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
b390: 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20  sqlite3 *db){.  
b3a0: 64 62 2d 3e 75 31 2e 69 73 49 6e 74 65 72 72 75  db->u1.isInterru
b3b0: 70 74 65 64 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a  pted = 1;.}.../*
b3c0: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
b3d0: 6e 20 69 73 20 65 78 61 63 74 6c 79 20 74 68 65  n is exactly the
b3e0: 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74 65 33   same as sqlite3
b3f0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
b400: 28 29 2c 20 65 78 63 65 70 74 0a 2a 2a 20 74 68  (), except.** th
b410: 61 74 20 69 74 20 69 73 20 64 65 73 69 67 6e 65  at it is designe
b420: 64 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 20 62  d to be called b
b430: 79 20 69 6e 74 65 72 6e 61 6c 20 63 6f 64 65 2e  y internal code.
b440: 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
b450: 69 73 0a 2a 2a 20 74 68 61 74 20 69 66 20 61 20  is.** that if a 
b460: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 69  malloc() fails i
b470: 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  n sqlite3_create
b480: 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20 61 6e 20  _function(), an 
b490: 65 72 72 6f 72 20 63 6f 64 65 0a 2a 2a 20 69 73  error code.** is
b4a0: 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 74 68   returned and th
b4b0: 65 20 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  e mallocFailed f
b4c0: 6c 61 67 20 63 6c 65 61 72 65 64 2e 20 0a 2a 2f  lag cleared. .*/
b4d0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 72 65 61  .int sqlite3Crea
b4e0: 74 65 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65  teFunc(.  sqlite
b4f0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
b500: 68 61 72 20 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61  har *zFunctionNa
b510: 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a  me,.  int nArg,.
b520: 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69    int enc,.  voi
b530: 64 20 2a 70 55 73 65 72 44 61 74 61 2c 0a 20 20  d *pUserData,.  
b540: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
b550: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
b560: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
b570: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
b580: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
b590: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
b5a0: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
b5b0: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
b5c0: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
b5d0: 2c 0a 20 20 46 75 6e 63 44 65 73 74 72 75 63 74  ,.  FuncDestruct
b5e0: 6f 72 20 2a 70 44 65 73 74 72 75 63 74 6f 72 0a  or *pDestructor.
b5f0: 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b  ){.  FuncDef *p;
b600: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20  .  int nName;.  
b610: 69 6e 74 20 65 78 74 72 61 46 6c 61 67 73 3b 0a  int extraFlags;.
b620: 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74  .  assert( sqlit
b630: 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64 62  e3_mutex_held(db
b640: 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 69 66  ->mutex) );.  if
b650: 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d  ( zFunctionName=
b660: 3d 30 20 7c 7c 0a 20 20 20 20 20 20 28 78 46 75  =0 ||.      (xFu
b670: 6e 63 20 26 26 20 28 78 46 69 6e 61 6c 20 7c 7c  nc && (xFinal ||
b680: 20 78 53 74 65 70 29 29 20 7c 7c 20 0a 20 20 20   xStep)) || .   
b690: 20 20 20 28 21 78 46 75 6e 63 20 26 26 20 28 78     (!xFunc && (x
b6a0: 46 69 6e 61 6c 20 26 26 20 21 78 53 74 65 70 29  Final && !xStep)
b6b0: 29 20 7c 7c 0a 20 20 20 20 20 20 28 21 78 46 75  ) ||.      (!xFu
b6c0: 6e 63 20 26 26 20 28 21 78 46 69 6e 61 6c 20 26  nc && (!xFinal &
b6d0: 26 20 78 53 74 65 70 29 29 20 7c 7c 0a 20 20 20  & xStep)) ||.   
b6e0: 20 20 20 28 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e     (nArg<-1 || n
b6f0: 41 72 67 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 46  Arg>SQLITE_MAX_F
b700: 55 4e 43 54 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a  UNCTION_ARG) ||.
b710: 20 20 20 20 20 20 28 32 35 35 3c 28 6e 4e 61 6d        (255<(nNam
b720: 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  e = sqlite3Strle
b730: 6e 33 30 28 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  n30( zFunctionNa
b740: 6d 65 29 29 29 20 29 7b 0a 20 20 20 20 72 65 74  me))) ){.    ret
b750: 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53  urn SQLITE_MISUS
b760: 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 61  E_BKPT;.  }..  a
b770: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
b780: 4e 43 5f 43 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c  NC_CONSTANT==SQL
b790: 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49  ITE_DETERMINISTI
b7a0: 43 20 29 3b 0a 20 20 65 78 74 72 61 46 6c 61 67  C );.  extraFlag
b7b0: 73 20 3d 20 65 6e 63 20 26 20 20 53 51 4c 49 54  s = enc &  SQLIT
b7c0: 45 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 3b  E_DETERMINISTIC;
b7d0: 0a 20 20 65 6e 63 20 26 3d 20 28 53 51 4c 49 54  .  enc &= (SQLIT
b7e0: 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53  E_FUNC_ENCMASK|S
b7f0: 51 4c 49 54 45 5f 41 4e 59 29 3b 0a 20 20 0a 23  QLITE_ANY);.  .#
b800: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b810: 49 54 5f 55 54 46 31 36 0a 20 20 2f 2a 20 49 66  IT_UTF16.  /* If
b820: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73   SQLITE_UTF16 is
b830: 20 73 70 65 63 69 66 69 65 64 20 61 73 20 74 68   specified as th
b840: 65 20 65 6e 63 6f 64 69 6e 67 20 74 79 70 65 2c  e encoding type,
b850: 20 74 72 61 6e 73 66 6f 72 6d 20 74 68 69 73 0a   transform this.
b860: 20 20 2a 2a 20 74 6f 20 6f 6e 65 20 6f 66 20 53    ** to one of S
b870: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 6f 72  QLITE_UTF16LE or
b880: 20 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20   SQLITE_UTF16BE 
b890: 75 73 69 6e 67 20 74 68 65 0a 20 20 2a 2a 20 53  using the.  ** S
b8a0: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
b8b0: 45 20 6d 61 63 72 6f 2e 20 53 51 4c 49 54 45 5f  E macro. SQLITE_
b8c0: 55 54 46 31 36 20 69 73 20 6e 6f 74 20 75 73 65  UTF16 is not use
b8d0: 64 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20 20  d internally..  
b8e0: 2a 2a 0a 20 20 2a 2a 20 49 66 20 53 51 4c 49 54  **.  ** If SQLIT
b8f0: 45 5f 41 4e 59 20 69 73 20 73 70 65 63 69 66 69  E_ANY is specifi
b900: 65 64 2c 20 61 64 64 20 74 68 72 65 65 20 76 65  ed, add three ve
b910: 72 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 75  rsions of the fu
b920: 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74  nction.  ** to t
b930: 68 65 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 20  he hash table.. 
b940: 20 2a 2f 0a 20 20 69 66 28 20 65 6e 63 3d 3d 53   */.  if( enc==S
b950: 51 4c 49 54 45 5f 55 54 46 31 36 20 29 7b 0a 20  QLITE_UTF16 ){. 
b960: 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54 45 5f     enc = SQLITE_
b970: 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
b980: 65 6c 73 65 20 69 66 28 20 65 6e 63 3d 3d 53 51  else if( enc==SQ
b990: 4c 49 54 45 5f 41 4e 59 20 29 7b 0a 20 20 20 20  LITE_ANY ){.    
b9a0: 69 6e 74 20 72 63 3b 0a 20 20 20 20 72 63 20 3d  int rc;.    rc =
b9b0: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
b9c0: 6e 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e  nc(db, zFunction
b9d0: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
b9e0: 54 45 5f 55 54 46 38 7c 65 78 74 72 61 46 6c 61  TE_UTF8|extraFla
b9f0: 67 73 2c 0a 20 20 20 20 20 20 20 20 20 70 55 73  gs,.         pUs
ba00: 65 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78  erData, xFunc, x
ba10: 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44  Step, xFinal, pD
ba20: 65 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20  estructor);.    
ba30: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
ba40: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
ba50: 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e  sqlite3CreateFun
ba60: 63 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e  c(db, zFunctionN
ba70: 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54  ame, nArg, SQLIT
ba80: 45 5f 55 54 46 31 36 4c 45 7c 65 78 74 72 61 46  E_UTF16LE|extraF
ba90: 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lags,.          
baa0: 70 55 73 65 72 44 61 74 61 2c 20 78 46 75 6e 63  pUserData, xFunc
bab0: 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c 2c  , xStep, xFinal,
bac0: 20 70 44 65 73 74 72 75 63 74 6f 72 29 3b 0a 20   pDestructor);. 
bad0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63 21     }.    if( rc!
bae0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
baf0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
bb00: 20 20 20 7d 0a 20 20 20 20 65 6e 63 20 3d 20 53     }.    enc = S
bb10: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 3b 0a 20  QLITE_UTF16BE;. 
bb20: 20 7d 0a 23 65 6c 73 65 0a 20 20 65 6e 63 20 3d   }.#else.  enc =
bb30: 20 53 51 4c 49 54 45 5f 55 54 46 38 3b 0a 23 65   SQLITE_UTF8;.#e
bb40: 6e 64 69 66 0a 20 20 0a 20 20 2f 2a 20 43 68 65  ndif.  .  /* Che
bb50: 63 6b 20 69 66 20 61 6e 20 65 78 69 73 74 69 6e  ck if an existin
bb60: 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 62 65  g function is be
bb70: 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e 20 6f  ing overridden o
bb80: 72 20 64 65 6c 65 74 65 64 2e 20 49 66 20 73 6f  r deleted. If so
bb90: 2c 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65  ,.  ** and there
bba0: 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73 2c   are active VMs,
bbb0: 20 74 68 65 6e 20 72 65 74 75 72 6e 20 53 51 4c   then return SQL
bbc0: 49 54 45 5f 42 55 53 59 2e 20 49 66 20 61 20 66  ITE_BUSY. If a f
bbd0: 75 6e 63 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20  unction.  ** is 
bbe0: 62 65 69 6e 67 20 6f 76 65 72 72 69 64 64 65 6e  being overridden
bbf0: 2f 64 65 6c 65 74 65 64 20 62 75 74 20 74 68 65  /deleted but the
bc00: 72 65 20 61 72 65 20 6e 6f 20 61 63 74 69 76 65  re are no active
bc10: 20 56 4d 73 2c 20 61 6c 6c 6f 77 20 74 68 65 0a   VMs, allow the.
bc20: 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74    ** operation t
bc30: 6f 20 63 6f 6e 74 69 6e 75 65 20 62 75 74 20 69  o continue but i
bc40: 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 70 72  nvalidate all pr
bc50: 65 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d  ecompiled statem
bc60: 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d  ents..  */.  p =
bc70: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
bc80: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
bc90: 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e  onName, nName, n
bca0: 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 30 29  Arg, (u8)enc, 0)
bcb0: 3b 0a 20 20 69 66 28 20 70 20 26 26 20 28 70 2d  ;.  if( p && (p-
bcc0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
bcd0: 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b  ITE_FUNC_ENCMASK
bce0: 29 3d 3d 65 6e 63 20 26 26 20 70 2d 3e 6e 41 72  )==enc && p->nAr
bcf0: 67 3d 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69  g==nArg ){.    i
bd00: 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63 74 69  f( db->nVdbeActi
bd10: 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ve ){.      sqli
bd20: 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73 67 28  te3ErrorWithMsg(
bd30: 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53 59 2c  db, SQLITE_BUSY,
bd40: 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61 62 6c   .        "unabl
bd50: 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f 64 69  e to delete/modi
bd60: 66 79 20 75 73 65 72 2d 66 75 6e 63 74 69 6f 6e  fy user-function
bd70: 20 64 75 65 20 74 6f 20 61 63 74 69 76 65 20 73   due to active s
bd80: 74 61 74 65 6d 65 6e 74 73 22 29 3b 0a 20 20 20  tatements");.   
bd90: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
bda0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
bdb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
bdc0: 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 7d 65  ITE_BUSY;.    }e
bdd0: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
bde0: 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65 64  e3ExpirePrepared
bdf0: 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a  Statements(db);.
be00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d      }.  }..  p =
be10: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
be20: 74 69 6f 6e 28 64 62 2c 20 7a 46 75 6e 63 74 69  tion(db, zFuncti
be30: 6f 6e 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e  onName, nName, n
be40: 41 72 67 2c 20 28 75 38 29 65 6e 63 2c 20 31 29  Arg, (u8)enc, 1)
be50: 3b 0a 20 20 61 73 73 65 72 74 28 70 20 7c 7c 20  ;.  assert(p || 
be60: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
be70: 29 3b 0a 20 20 69 66 28 20 21 70 20 29 7b 0a 20  );.  if( !p ){. 
be80: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
be90: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f  _NOMEM;.  }..  /
bea0: 2a 20 49 66 20 61 6e 20 6f 6c 64 65 72 20 76 65  * If an older ve
beb0: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 75 6e  rsion of the fun
bec0: 63 74 69 6f 6e 20 77 69 74 68 20 61 20 63 6f 6e  ction with a con
bed0: 66 69 67 75 72 65 64 20 64 65 73 74 72 75 63 74  figured destruct
bee0: 6f 72 20 69 73 0a 20 20 2a 2a 20 62 65 69 6e 67  or is.  ** being
bef0: 20 72 65 70 6c 61 63 65 64 20 69 6e 76 6f 6b 65   replaced invoke
bf00: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
bf10: 66 75 6e 63 74 69 6f 6e 20 68 65 72 65 2e 20 2a  function here. *
bf20: 2f 0a 20 20 66 75 6e 63 74 69 6f 6e 44 65 73 74  /.  functionDest
bf30: 72 6f 79 28 64 62 2c 20 70 29 3b 0a 0a 20 20 69  roy(db, p);..  i
bf40: 66 28 20 70 44 65 73 74 72 75 63 74 6f 72 20 29  f( pDestructor )
bf50: 7b 0a 20 20 20 20 70 44 65 73 74 72 75 63 74 6f  {.    pDestructo
bf60: 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20  r->nRef++;.  }. 
bf70: 20 70 2d 3e 70 44 65 73 74 72 75 63 74 6f 72 20   p->pDestructor 
bf80: 3d 20 70 44 65 73 74 72 75 63 74 6f 72 3b 0a 20  = pDestructor;. 
bf90: 20 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 3d 20   p->funcFlags = 
bfa0: 28 70 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  (p->funcFlags & 
bfb0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 45 4e 43 4d  SQLITE_FUNC_ENCM
bfc0: 41 53 4b 29 20 7c 20 65 78 74 72 61 46 6c 61 67  ASK) | extraFlag
bfd0: 73 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 70  s;.  testcase( p
bfe0: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
bff0: 4c 49 54 45 5f 44 45 54 45 52 4d 49 4e 49 53 54  LITE_DETERMINIST
c000: 49 43 20 29 3b 0a 20 20 70 2d 3e 78 46 75 6e 63  IC );.  p->xFunc
c010: 20 3d 20 78 46 75 6e 63 3b 0a 20 20 70 2d 3e 78   = xFunc;.  p->x
c020: 53 74 65 70 20 3d 20 78 53 74 65 70 3b 0a 20 20  Step = xStep;.  
c030: 70 2d 3e 78 46 69 6e 61 6c 69 7a 65 20 3d 20 78  p->xFinalize = x
c040: 46 69 6e 61 6c 3b 0a 20 20 70 2d 3e 70 55 73 65  Final;.  p->pUse
c050: 72 44 61 74 61 20 3d 20 70 55 73 65 72 44 61 74  rData = pUserDat
c060: 61 3b 0a 20 20 70 2d 3e 6e 41 72 67 20 3d 20 28  a;.  p->nArg = (
c070: 75 31 36 29 6e 41 72 67 3b 0a 20 20 72 65 74 75  u16)nArg;.  retu
c080: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
c090: 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 6e 65  ./*.** Create ne
c0a0: 77 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 73  w user functions
c0b0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
c0c0: 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
c0d0: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
c0e0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
c0f0: 46 75 6e 63 2c 0a 20 20 69 6e 74 20 6e 41 72 67  Func,.  int nArg
c100: 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 0a 20 20 76  ,.  int enc,.  v
c110: 6f 69 64 20 2a 70 2c 0a 20 20 76 6f 69 64 20 28  oid *p,.  void (
c120: 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65 33 5f  *xFunc)(sqlite3_
c130: 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c  context*,int,sql
c140: 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a  ite3_value **),.
c150: 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70 29 28    void (*xStep)(
c160: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a  sqlite3_context*
c170: 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c  ,int,sqlite3_val
c180: 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28  ue **),.  void (
c190: 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74 65 33  *xFinal)(sqlite3
c1a0: 5f 63 6f 6e 74 65 78 74 2a 29 0a 29 7b 0a 20 20  _context*).){.  
c1b0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 63  return sqlite3_c
c1c0: 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 5f 76  reate_function_v
c1d0: 32 28 64 62 2c 20 7a 46 75 6e 63 2c 20 6e 41 72  2(db, zFunc, nAr
c1e0: 67 2c 20 65 6e 63 2c 20 70 2c 20 78 46 75 6e 63  g, enc, p, xFunc
c1f0: 2c 20 78 53 74 65 70 2c 0a 20 20 20 20 20 20 20  , xStep,.       
c200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 78 46 69               xFi
c220: 6e 61 6c 2c 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20  nal, 0);.}..int 
c230: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
c240: 75 6e 63 74 69 6f 6e 5f 76 32 28 0a 20 20 73 71  unction_v2(.  sq
c250: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
c260: 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63 2c 0a  st char *zFunc,.
c270: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
c280: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
c290: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63  ,.  void (*xFunc
c2a0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
c2b0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
c2c0: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
c2d0: 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65   (*xStep)(sqlite
c2e0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
c2f0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
c300: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61  ,.  void (*xFina
c310: 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  l)(sqlite3_conte
c320: 78 74 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78  xt*),.  void (*x
c330: 44 65 73 74 72 6f 79 29 28 76 6f 69 64 20 2a 29  Destroy)(void *)
c340: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
c350: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 46  QLITE_ERROR;.  F
c360: 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a 70  uncDestructor *p
c370: 41 72 67 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  Arg = 0;.  sqlit
c380: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
c390: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28  b->mutex);.  if(
c3a0: 20 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20   xDestroy ){.   
c3b0: 20 70 41 72 67 20 3d 20 28 46 75 6e 63 44 65 73   pArg = (FuncDes
c3c0: 74 72 75 63 74 6f 72 20 2a 29 73 71 6c 69 74 65  tructor *)sqlite
c3d0: 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28 64 62  3DbMallocZero(db
c3e0: 2c 20 73 69 7a 65 6f 66 28 46 75 6e 63 44 65 73  , sizeof(FuncDes
c3f0: 74 72 75 63 74 6f 72 29 29 3b 0a 20 20 20 20 69  tructor));.    i
c400: 66 28 20 21 70 41 72 67 20 29 7b 0a 20 20 20 20  f( !pArg ){.    
c410: 20 20 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20    xDestroy(p);. 
c420: 20 20 20 20 20 67 6f 74 6f 20 6f 75 74 3b 0a 20       goto out;. 
c430: 20 20 20 7d 0a 20 20 20 20 70 41 72 67 2d 3e 78     }.    pArg->x
c440: 44 65 73 74 72 6f 79 20 3d 20 78 44 65 73 74 72  Destroy = xDestr
c450: 6f 79 3b 0a 20 20 20 20 70 41 72 67 2d 3e 70 55  oy;.    pArg->pU
c460: 73 65 72 44 61 74 61 20 3d 20 70 3b 0a 20 20 7d  serData = p;.  }
c470: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 43  .  rc = sqlite3C
c480: 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a 46  reateFunc(db, zF
c490: 75 6e 63 2c 20 6e 41 72 67 2c 20 65 6e 63 2c 20  unc, nArg, enc, 
c4a0: 70 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70 2c  p, xFunc, xStep,
c4b0: 20 78 46 69 6e 61 6c 2c 20 70 41 72 67 29 3b 0a   xFinal, pArg);.
c4c0: 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
c4d0: 72 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  rg->nRef==0 ){. 
c4e0: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
c4f0: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
c500: 78 44 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20  xDestroy(p);.   
c510: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
c520: 62 2c 20 70 41 72 67 29 3b 0a 20 20 7d 0a 0a 20  b, pArg);.  }.. 
c530: 6f 75 74 3a 0a 20 20 72 63 20 3d 20 73 71 6c 69  out:.  rc = sqli
c540: 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
c550: 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
c560: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
c570: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
c580: 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
c590: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
c5a0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
c5b0: 74 65 5f 66 75 6e 63 74 69 6f 6e 31 36 28 0a 20  te_function16(. 
c5c0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20   sqlite3 *db,.  
c5d0: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 75 6e  const void *zFun
c5e0: 63 74 69 6f 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74  ctionName,.  int
c5f0: 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 54 65   nArg,.  int eTe
c600: 78 74 52 65 70 2c 0a 20 20 76 6f 69 64 20 2a 70  xtRep,.  void *p
c610: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75 6e 63  ,.  void (*xFunc
c620: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
c630: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
c640: 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f 69 64 20  alue**),.  void 
c650: 28 2a 78 53 74 65 70 29 28 73 71 6c 69 74 65 33  (*xStep)(sqlite3
c660: 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71  _context*,int,sq
c670: 6c 69 74 65 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a  lite3_value**),.
c680: 20 20 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29    void (*xFinal)
c690: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
c6a0: 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  *).){.  int rc;.
c6b0: 20 20 63 68 61 72 20 2a 7a 46 75 6e 63 38 3b 0a    char *zFunc8;.
c6c0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
c6d0: 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29  enter(db->mutex)
c6e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d  ;.  assert( !db-
c6f0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b  >mallocFailed );
c700: 0a 20 20 7a 46 75 6e 63 38 20 3d 20 73 71 6c 69  .  zFunc8 = sqli
c710: 74 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20  te3Utf16to8(db, 
c720: 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d  zFunctionName, -
c730: 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  1, SQLITE_UTF16N
c740: 41 54 49 56 45 29 3b 0a 20 20 72 63 20 3d 20 73  ATIVE);.  rc = s
c750: 71 6c 69 74 65 33 43 72 65 61 74 65 46 75 6e 63  qlite3CreateFunc
c760: 28 64 62 2c 20 7a 46 75 6e 63 38 2c 20 6e 41 72  (db, zFunc8, nAr
c770: 67 2c 20 65 54 65 78 74 52 65 70 2c 20 70 2c 20  g, eTextRep, p, 
c780: 78 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46  xFunc, xStep, xF
c790: 69 6e 61 6c 2c 30 29 3b 0a 20 20 73 71 6c 69 74  inal,0);.  sqlit
c7a0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 7a 46 75  e3DbFree(db, zFu
c7b0: 6e 63 38 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  nc8);.  rc = sql
c7c0: 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
c7d0: 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
c7e0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
c7f0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
c800: 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f  rc;.}.#endif.../
c810: 2a 0a 2a 2a 20 44 65 63 6c 61 72 65 20 74 68 61  *.** Declare tha
c820: 74 20 61 20 66 75 6e 63 74 69 6f 6e 20 68 61 73  t a function has
c830: 20 62 65 65 6e 20 6f 76 65 72 6c 6f 61 64 65 64   been overloaded
c840: 20 62 79 20 61 20 76 69 72 74 75 61 6c 20 74 61   by a virtual ta
c850: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ble..**.** If th
c860: 65 20 66 75 6e 63 74 69 6f 6e 20 61 6c 72 65 61  e function alrea
c870: 64 79 20 65 78 69 73 74 73 20 61 73 20 61 20 72  dy exists as a r
c880: 65 67 75 6c 61 72 20 67 6c 6f 62 61 6c 20 66 75  egular global fu
c890: 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20  nction, then.** 
c8a0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
c8b0: 61 20 6e 6f 2d 6f 70 2e 20 20 49 66 20 74 68 65  a no-op.  If the
c8c0: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
c8d0: 6f 74 20 65 78 69 73 74 2c 20 74 68 65 6e 20 63  ot exist, then c
c8e0: 72 65 61 74 65 0a 2a 2a 20 61 20 6e 65 77 20 6f  reate.** a new o
c8f0: 6e 65 20 74 68 61 74 20 61 6c 77 61 79 73 20 74  ne that always t
c900: 68 72 6f 77 73 20 61 20 72 75 6e 2d 74 69 6d 65  hrows a run-time
c910: 20 65 72 72 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20   error.  .**.** 
c920: 57 68 65 6e 20 76 69 72 74 75 61 6c 20 74 61 62  When virtual tab
c930: 6c 65 73 20 69 6e 74 65 6e 64 20 74 6f 20 70 72  les intend to pr
c940: 6f 76 69 64 65 20 61 6e 20 6f 76 65 72 6c 6f 61  ovide an overloa
c950: 64 65 64 20 66 75 6e 63 74 69 6f 6e 2c 20 74 68  ded function, th
c960: 65 79 0a 2a 2a 20 73 68 6f 75 6c 64 20 63 61 6c  ey.** should cal
c970: 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  l this routine t
c980: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20  o make sure the 
c990: 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20  global function 
c9a0: 65 78 69 73 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f  exists..** A glo
c9b0: 62 61 6c 20 66 75 6e 63 74 69 6f 6e 20 6d 75 73  bal function mus
c9c0: 74 20 65 78 69 73 74 20 69 6e 20 6f 72 64 65 72  t exist in order
c9d0: 20 66 6f 72 20 6e 61 6d 65 20 72 65 73 6f 6c 75   for name resolu
c9e0: 74 69 6f 6e 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20  tion to work.** 
c9f0: 70 72 6f 70 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74  properly..*/.int
ca00: 20 73 71 6c 69 74 65 33 5f 6f 76 65 72 6c 6f 61   sqlite3_overloa
ca10: 64 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71  d_function(.  sq
ca20: 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e  lite3 *db,.  con
ca30: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a  st char *zName,.
ca40: 20 20 69 6e 74 20 6e 41 72 67 0a 29 7b 0a 20 20    int nArg.){.  
ca50: 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 71 6c 69  int nName = sqli
ca60: 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 4e 61 6d  te3Strlen30(zNam
ca70: 65 29 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e);.  int rc = S
ca80: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
ca90: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
caa0: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66  db->mutex);.  if
cab0: 28 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  ( sqlite3FindFun
cac0: 63 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c  ction(db, zName,
cad0: 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51   nName, nArg, SQ
cae0: 4c 49 54 45 5f 55 54 46 38 2c 20 30 29 3d 3d 30  LITE_UTF8, 0)==0
caf0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
cb00: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
cb10: 62 2c 20 7a 4e 61 6d 65 2c 20 6e 41 72 67 2c 20  b, zName, nArg, 
cb20: 53 51 4c 49 54 45 5f 55 54 46 38 2c 0a 20 20 20  SQLITE_UTF8,.   
cb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb40: 20 20 20 20 20 20 20 20 30 2c 20 73 71 6c 69 74          0, sqlit
cb50: 65 33 49 6e 76 61 6c 69 64 46 75 6e 63 74 69 6f  e3InvalidFunctio
cb60: 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  n, 0, 0, 0);.  }
cb70: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
cb80: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
cb90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
cba0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
cbb0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
cbc0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
cbd0: 5f 4f 4d 49 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a  _OMIT_TRACE./*.*
cbe0: 2a 20 52 65 67 69 73 74 65 72 20 61 20 74 72 61  * Register a tra
cbf0: 63 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  ce function.  Th
cc00: 65 20 70 41 72 67 20 66 72 6f 6d 20 74 68 65 20  e pArg from the 
cc10: 70 72 65 76 69 6f 75 73 6c 79 20 72 65 67 69 73  previously regis
cc20: 74 65 72 65 64 20 74 72 61 63 65 0a 2a 2a 20 69  tered trace.** i
cc30: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
cc40: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 74 72 61 63 65  .** A NULL trace
cc50: 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e 73 20   function means 
cc60: 74 68 61 74 20 6e 6f 20 74 72 61 63 69 6e 67 20  that no tracing 
cc70: 69 73 20 65 78 65 63 75 74 65 73 2e 20 20 41 20  is executes.  A 
cc80: 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63  non-NULL.** trac
cc90: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
cca0: 6f 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  o a function tha
ccb0: 74 20 69 73 20 69 6e 76 6f 6b 65 64 20 61 74 20  t is invoked at 
ccc0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
ccd0: 68 0a 2a 2a 20 53 51 4c 20 73 74 61 74 65 6d 65  h.** SQL stateme
cce0: 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  nt..*/.void *sql
ccf0: 69 74 65 33 5f 74 72 61 63 65 28 73 71 6c 69 74  ite3_trace(sqlit
cd00: 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 28 2a 78  e3 *db, void (*x
cd10: 54 72 61 63 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  Trace)(void*,con
cd20: 73 74 20 63 68 61 72 2a 29 2c 20 76 6f 69 64 20  st char*), void 
cd30: 2a 70 41 72 67 29 7b 0a 20 20 76 6f 69 64 20 2a  *pArg){.  void *
cd40: 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f  pOld;.  sqlite3_
cd50: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
cd60: 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d  mutex);.  pOld =
cd70: 20 64 62 2d 3e 70 54 72 61 63 65 41 72 67 3b 0a   db->pTraceArg;.
cd80: 20 20 64 62 2d 3e 78 54 72 61 63 65 20 3d 20 78    db->xTrace = x
cd90: 54 72 61 63 65 3b 0a 20 20 64 62 2d 3e 70 54 72  Trace;.  db->pTr
cda0: 61 63 65 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  aceArg = pArg;. 
cdb0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
cdc0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
cdd0: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
cde0: 7d 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  }./*.** Register
cdf0: 20 61 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74   a profile funct
ce00: 69 6f 6e 2e 20 20 54 68 65 20 70 41 72 67 20 66  ion.  The pArg f
ce10: 72 6f 6d 20 74 68 65 20 70 72 65 76 69 6f 75 73  rom the previous
ce20: 6c 79 20 72 65 67 69 73 74 65 72 65 64 20 0a 2a  ly registered .*
ce30: 2a 20 70 72 6f 66 69 6c 65 20 66 75 6e 63 74 69  * profile functi
ce40: 6f 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  on is returned. 
ce50: 20 0a 2a 2a 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70   .**.** A NULL p
ce60: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20  rofile function 
ce70: 6d 65 61 6e 73 20 74 68 61 74 20 6e 6f 20 70 72  means that no pr
ce80: 6f 66 69 6c 69 6e 67 20 69 73 20 65 78 65 63 75  ofiling is execu
ce90: 74 65 73 2e 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c  tes.  A non-NULL
cea0: 0a 2a 2a 20 70 72 6f 66 69 6c 65 20 69 73 20 61  .** profile is a
ceb0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 66 75   pointer to a fu
cec0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73 20 69  nction that is i
ced0: 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20 63 6f  nvoked at the co
cee0: 6e 63 6c 75 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65  nclusion of.** e
cef0: 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  ach SQL statemen
cf00: 74 20 74 68 61 74 20 69 73 20 72 75 6e 2e 0a 2a  t that is run..*
cf10: 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f  /.void *sqlite3_
cf20: 70 72 6f 66 69 6c 65 28 0a 20 20 73 71 6c 69 74  profile(.  sqlit
cf30: 65 33 20 2a 64 62 2c 0a 20 20 76 6f 69 64 20 28  e3 *db,.  void (
cf40: 2a 78 50 72 6f 66 69 6c 65 29 28 76 6f 69 64 2a  *xProfile)(void*
cf50: 2c 63 6f 6e 73 74 20 63 68 61 72 2a 2c 73 71 6c  ,const char*,sql
cf60: 69 74 65 5f 75 69 6e 74 36 34 29 2c 0a 20 20 76  ite_uint64),.  v
cf70: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 76  oid *pArg.){.  v
cf80: 6f 69 64 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c  oid *pOld;.  sql
cf90: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
cfa0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
cfb0: 4f 6c 64 20 3d 20 64 62 2d 3e 70 50 72 6f 66 69  Old = db->pProfi
cfc0: 6c 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78 50 72  leArg;.  db->xPr
cfd0: 6f 66 69 6c 65 20 3d 20 78 50 72 6f 66 69 6c 65  ofile = xProfile
cfe0: 3b 0a 20 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65  ;.  db->pProfile
cff0: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
d000: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
d010: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
d020: 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23  return pOld;.}.#
d030: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
d040: 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f  OMIT_TRACE */../
d050: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
d060: 66 75 6e 63 74 69 6f 6e 20 74 6f 20 62 65 20 69  function to be i
d070: 6e 76 6f 6b 65 64 20 77 68 65 6e 20 61 20 74 72  nvoked when a tr
d080: 61 6e 73 61 63 74 69 6f 6e 20 63 6f 6d 6d 69 74  ansaction commit
d090: 73 2e 0a 2a 2a 20 49 66 20 74 68 65 20 69 6e 76  s..** If the inv
d0a0: 6f 6b 65 64 20 66 75 6e 63 74 69 6f 6e 20 72 65  oked function re
d0b0: 74 75 72 6e 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  turns non-zero, 
d0c0: 74 68 65 6e 20 74 68 65 20 63 6f 6d 6d 69 74 20  then the commit 
d0d0: 62 65 63 6f 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c  becomes a.** rol
d0e0: 6c 62 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  lback..*/.void *
d0f0: 73 71 6c 69 74 65 33 5f 63 6f 6d 6d 69 74 5f 68  sqlite3_commit_h
d100: 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ook(.  sqlite3 *
d110: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
d120: 20 2f 2a 20 41 74 74 61 63 68 20 74 68 65 20 68   /* Attach the h
d130: 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64 61 74 61  ook to this data
d140: 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20 28 2a  base */.  int (*
d150: 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
d160: 29 2c 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 20  ),  /* Function 
d170: 74 6f 20 69 6e 76 6f 6b 65 20 6f 6e 20 65 61 63  to invoke on eac
d180: 68 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f  h commit */.  vo
d190: 69 64 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  id *pArg        
d1a0: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67 75 6d          /* Argum
d1b0: 65 6e 74 20 74 6f 20 74 68 65 20 66 75 6e 63 74  ent to the funct
d1c0: 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64  ion */.){.  void
d1d0: 20 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65   *pOld;.  sqlite
d1e0: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
d1f0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64  ->mutex);.  pOld
d200: 20 3d 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41 72   = db->pCommitAr
d210: 67 3b 0a 20 20 64 62 2d 3e 78 43 6f 6d 6d 69 74  g;.  db->xCommit
d220: 43 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c  Callback = xCall
d230: 62 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d  back;.  db->pCom
d240: 6d 69 74 41 72 67 20 3d 20 70 41 72 67 3b 0a 20  mitArg = pArg;. 
d250: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
d260: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
d270: 0a 20 20 72 65 74 75 72 6e 20 70 4f 6c 64 3b 0a  .  return pOld;.
d280: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
d290: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
d2a0: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
d2b0: 74 69 6d 65 20 61 20 72 6f 77 20 69 73 20 75 70  time a row is up
d2c0: 64 61 74 65 64 2c 0a 2a 2a 20 69 6e 73 65 72 74  dated,.** insert
d2d0: 65 64 20 6f 72 20 64 65 6c 65 74 65 64 20 75 73  ed or deleted us
d2e0: 69 6e 67 20 74 68 69 73 20 64 61 74 61 62 61 73  ing this databas
d2f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f  e connection..*/
d300: 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 75  .void *sqlite3_u
d310: 70 64 61 74 65 5f 68 6f 6f 6b 28 0a 20 20 73 71  pdate_hook(.  sq
d320: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
d330: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
d340: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
d350: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
d360: 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63   void (*xCallbac
d370: 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61  k)(void*,int,cha
d380: 72 20 63 6f 6e 73 74 20 2a 2c 63 68 61 72 20 63  r const *,char c
d390: 6f 6e 73 74 20 2a 2c 73 71 6c 69 74 65 5f 69 6e  onst *,sqlite_in
d3a0: 74 36 34 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41  t64),.  void *pA
d3b0: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
d3c0: 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f    /* Argument to
d3d0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f   the function */
d3e0: 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 52 65 74  .){.  void *pRet
d3f0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
d400: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
d410: 78 29 3b 0a 20 20 70 52 65 74 20 3d 20 64 62 2d  x);.  pRet = db-
d420: 3e 70 55 70 64 61 74 65 41 72 67 3b 0a 20 20 64  >pUpdateArg;.  d
d430: 62 2d 3e 78 55 70 64 61 74 65 43 61 6c 6c 62 61  b->xUpdateCallba
d440: 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a  ck = xCallback;.
d450: 20 20 64 62 2d 3e 70 55 70 64 61 74 65 41 72 67    db->pUpdateArg
d460: 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74   = pArg;.  sqlit
d470: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
d480: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
d490: 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a  urn pRet;.}../*.
d4a0: 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 61  ** Register a ca
d4b0: 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69 6e 76  llback to be inv
d4c0: 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65 20 61  oked each time a
d4d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
d4e0: 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 62  rolled.** back b
d4f0: 79 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  y this database 
d500: 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  connection..*/.v
d510: 6f 69 64 20 2a 73 71 6c 69 74 65 33 5f 72 6f 6c  oid *sqlite3_rol
d520: 6c 62 61 63 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71  lback_hook(.  sq
d530: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
d540: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
d550: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
d560: 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
d570: 20 76 6f 69 64 20 28 2a 78 43 61 6c 6c 62 61 63   void (*xCallbac
d580: 6b 29 28 76 6f 69 64 2a 29 2c 20 2f 2a 20 43 61  k)(void*), /* Ca
d590: 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
d5a0: 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  */.  void *pArg 
d5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d5c0: 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  * Argument to th
d5d0: 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b  e function */.){
d5e0: 0a 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20  .  void *pRet;. 
d5f0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
d600: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
d610: 0a 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 52  .  pRet = db->pR
d620: 6f 6c 6c 62 61 63 6b 41 72 67 3b 0a 20 20 64 62  ollbackArg;.  db
d630: 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62  ->xRollbackCallb
d640: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
d650: 0a 20 20 64 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b  .  db->pRollback
d660: 41 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71  Arg = pArg;.  sq
d670: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
d680: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
d690: 72 65 74 75 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a  return pRet;.}..
d6a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d6b0: 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68  MIT_WAL./*.** Th
d6c0: 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  e sqlite3_wal_ho
d6d0: 6f 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 72 65  ok() callback re
d6e0: 67 69 73 74 65 72 65 64 20 62 79 20 73 71 6c 69  gistered by sqli
d6f0: 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
d700: 6b 70 6f 69 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76  kpoint()..** Inv
d710: 6f 6b 65 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  oke sqlite3_wal_
d720: 63 68 65 63 6b 70 6f 69 6e 74 20 69 66 20 74 68  checkpoint if th
d730: 65 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  e number of fram
d740: 65 73 20 69 6e 20 74 68 65 20 6c 6f 67 20 66 69  es in the log fi
d750: 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72  le.** is greater
d760: 20 74 68 61 6e 20 73 71 6c 69 74 65 33 2e 70 57   than sqlite3.pW
d770: 61 6c 41 72 67 20 63 61 73 74 20 74 6f 20 61 6e  alArg cast to an
d780: 20 69 6e 74 65 67 65 72 20 28 74 68 65 20 76 61   integer (the va
d790: 6c 75 65 20 63 6f 6e 66 69 67 75 72 65 64 20 62  lue configured b
d7a0: 79 0a 2a 2a 20 77 61 6c 5f 61 75 74 6f 63 68 65  y.** wal_autoche
d7b0: 63 6b 70 6f 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a  ckpoint())..*/ .
d7c0: 69 6e 74 20 73 71 6c 69 74 65 33 57 61 6c 44 65  int sqlite3WalDe
d7d0: 66 61 75 6c 74 48 6f 6f 6b 28 0a 20 20 76 6f 69  faultHook(.  voi
d7e0: 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 20  d *pClientData, 
d7f0: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
d800: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  */.  sqlite3 *db
d810: 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ,           /* C
d820: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 63  onnection */.  c
d830: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
d840: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
d850: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 72 61 6d  e */.  int nFram
d860: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
d870: 20 53 69 7a 65 20 6f 66 20 57 41 4c 20 2a 2f 0a   Size of WAL */.
d880: 29 7b 0a 20 20 69 66 28 20 6e 46 72 61 6d 65 3e  ){.  if( nFrame>
d890: 3d 53 51 4c 49 54 45 5f 50 54 52 5f 54 4f 5f 49  =SQLITE_PTR_TO_I
d8a0: 4e 54 28 70 43 6c 69 65 6e 74 44 61 74 61 29 20  NT(pClientData) 
d8b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 65  ){.    sqlite3Be
d8c0: 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28  ginBenignMalloc(
d8d0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77  );.    sqlite3_w
d8e0: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62  al_checkpoint(db
d8f0: 2c 20 7a 44 62 29 3b 0a 20 20 20 20 73 71 6c 69  , zDb);.    sqli
d900: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
d910: 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  oc();.  }.  retu
d920: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
d930: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
d940: 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a  _OMIT_WAL */../*
d950: 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 61 6e  .** Configure an
d960: 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f   sqlite3_wal_hoo
d970: 6b 28 29 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  k() callback to 
d980: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 68  automatically ch
d990: 65 63 6b 70 6f 69 6e 74 0a 2a 2a 20 61 20 64 61  eckpoint.** a da
d9a0: 74 61 62 61 73 65 20 61 66 74 65 72 20 63 6f 6d  tabase after com
d9b0: 6d 69 74 74 69 6e 67 20 61 20 74 72 61 6e 73 61  mitting a transa
d9c0: 63 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61  ction if there a
d9d0: 72 65 20 6e 46 72 61 6d 65 20 6f 72 0a 2a 2a 20  re nFrame or.** 
d9e0: 6d 6f 72 65 20 66 72 61 6d 65 73 20 69 6e 20 74  more frames in t
d9f0: 68 65 20 6c 6f 67 20 66 69 6c 65 2e 20 50 61 73  he log file. Pas
da00: 73 69 6e 67 20 7a 65 72 6f 20 6f 72 20 61 20 6e  sing zero or a n
da10: 65 67 61 74 69 76 65 20 76 61 6c 75 65 20 61 73  egative value as
da20: 20 74 68 65 0a 2a 2a 20 6e 46 72 61 6d 65 20 70   the.** nFrame p
da30: 61 72 61 6d 65 74 65 72 20 64 69 73 61 62 6c 65  arameter disable
da40: 73 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63  s automatic chec
da50: 6b 70 6f 69 6e 74 73 20 65 6e 74 69 72 65 6c 79  kpoints entirely
da60: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 61 6c 6c  ..**.** The call
da70: 62 61 63 6b 20 72 65 67 69 73 74 65 72 65 64 20  back registered 
da80: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
da90: 20 72 65 70 6c 61 63 65 73 20 61 6e 79 20 65 78   replaces any ex
daa0: 69 73 74 69 6e 67 20 63 61 6c 6c 62 61 63 6b 0a  isting callback.
dab0: 2a 2a 20 72 65 67 69 73 74 65 72 65 64 20 75 73  ** registered us
dac0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  ing sqlite3_wal_
dad0: 68 6f 6f 6b 28 29 2e 20 4c 69 6b 65 77 69 73 65  hook(). Likewise
dae0: 2c 20 72 65 67 69 73 74 65 72 69 6e 67 20 61 20  , registering a 
daf0: 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 75 73 69 6e  callback.** usin
db00: 67 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f  g sqlite3_wal_ho
db10: 6f 6b 28 29 20 64 69 73 61 62 6c 65 73 20 74 68  ok() disables th
db20: 65 20 61 75 74 6f 6d 61 74 69 63 20 63 68 65 63  e automatic chec
db30: 6b 70 6f 69 6e 74 20 6d 65 63 68 61 6e 69 73 6d  kpoint mechanism
db40: 0a 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 62  .** configured b
db50: 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e  y this function.
db60: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
db70: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
db80: 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  nt(sqlite3 *db, 
db90: 69 6e 74 20 6e 46 72 61 6d 65 29 7b 0a 23 69 66  int nFrame){.#if
dba0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
dbb0: 57 41 4c 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  WAL.  UNUSED_PAR
dbc0: 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e  AMETER(db);.  UN
dbd0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6e  USED_PARAMETER(n
dbe0: 46 72 61 6d 65 29 3b 0a 23 65 6c 73 65 0a 20 20  Frame);.#else.  
dbf0: 69 66 28 20 6e 46 72 61 6d 65 3e 30 20 29 7b 0a  if( nFrame>0 ){.
dc00: 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f      sqlite3_wal_
dc10: 68 6f 6f 6b 28 64 62 2c 20 73 71 6c 69 74 65 33  hook(db, sqlite3
dc20: 57 61 6c 44 65 66 61 75 6c 74 48 6f 6f 6b 2c 20  WalDefaultHook, 
dc30: 53 51 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54  SQLITE_INT_TO_PT
dc40: 52 28 6e 46 72 61 6d 65 29 29 3b 0a 20 20 7d 65  R(nFrame));.  }e
dc50: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
dc60: 5f 77 61 6c 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c  _wal_hook(db, 0,
dc70: 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
dc80: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
dc90: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67  OK;.}../*.** Reg
dca0: 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61 63 6b  ister a callback
dcb0: 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64 20 65   to be invoked e
dcc0: 61 63 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73  ach time a trans
dcd0: 61 63 74 69 6f 6e 20 69 73 20 77 72 69 74 74 65  action is writte
dce0: 6e 0a 2a 2a 20 69 6e 74 6f 20 74 68 65 20 77 72  n.** into the wr
dcf0: 69 74 65 2d 61 68 65 61 64 2d 6c 6f 67 20 62 79  ite-ahead-log by
dd00: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63   this database c
dd10: 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f  onnection..*/.vo
dd20: 69 64 20 2a 73 71 6c 69 74 65 33 5f 77 61 6c 5f  id *sqlite3_wal_
dd30: 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65 33 20  hook(.  sqlite3 
dd40: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
dd50: 20 20 20 20 20 20 20 20 2f 2a 20 41 74 74 61 63          /* Attac
dd60: 68 20 74 68 65 20 68 6f 6f 6b 20 74 6f 20 74 68  h the hook to th
dd70: 69 73 20 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a  is db handle */.
dd80: 20 20 69 6e 74 28 2a 78 43 61 6c 6c 62 61 63 6b    int(*xCallback
dd90: 29 28 76 6f 69 64 20 2a 2c 20 73 71 6c 69 74 65  )(void *, sqlite
dda0: 33 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 2c  3*, const char*,
ddb0: 20 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70   int),.  void *p
ddc0: 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
ddd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
dde0: 74 20 61 72 67 75 6d 65 6e 74 20 70 61 73 73 65  t argument passe
ddf0: 64 20 74 6f 20 78 43 61 6c 6c 62 61 63 6b 28 29  d to xCallback()
de00: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
de10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20  QLITE_OMIT_WAL. 
de20: 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73   void *pRet;.  s
de30: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
de40: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
de50: 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 57 61 6c   pRet = db->pWal
de60: 41 72 67 3b 0a 20 20 64 62 2d 3e 78 57 61 6c 43  Arg;.  db->xWalC
de70: 61 6c 6c 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62  allback = xCallb
de80: 61 63 6b 3b 0a 20 20 64 62 2d 3e 70 57 61 6c 41  ack;.  db->pWalA
de90: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
dea0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
deb0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
dec0: 65 74 75 72 6e 20 70 52 65 74 3b 0a 23 65 6c 73  eturn pRet;.#els
ded0: 65 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23 65  e.  return 0;.#e
dee0: 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  ndif.}../*.** Ch
def0: 65 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73  eckpoint databas
df00: 65 20 7a 44 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  e zDb..*/.int sq
df10: 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70  lite3_wal_checkp
df20: 6f 69 6e 74 5f 76 32 28 0a 20 20 73 71 6c 69 74  oint_v2(.  sqlit
df30: 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
df40: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
df50: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f  tabase handle */
df60: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
df70: 44 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Db,             
df80: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 74     /* Name of at
df90: 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20  tached database 
dfa0: 28 6f 72 20 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69  (or NULL) */.  i
dfb0: 6e 74 20 65 4d 6f 64 65 2c 20 20 20 20 20 20 20  nt eMode,       
dfc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dfd0: 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  * SQLITE_CHECKPO
dfe0: 49 4e 54 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20  INT_* value */. 
dff0: 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c 20 20 20 20   int *pnLog,    
e000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e010: 20 2f 2a 20 4f 55 54 3a 20 53 69 7a 65 20 6f 66   /* OUT: Size of
e020: 20 57 41 4c 20 6c 6f 67 20 69 6e 20 66 72 61 6d   WAL log in fram
e030: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 6e 43  es */.  int *pnC
e040: 6b 70 74 20 20 20 20 20 20 20 20 20 20 20 20 20  kpt             
e050: 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20          /* OUT: 
e060: 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  Total number of 
e070: 66 72 61 6d 65 73 20 63 68 65 63 6b 70 6f 69 6e  frames checkpoin
e080: 74 65 64 20 2a 2f 0a 29 7b 0a 23 69 66 64 65 66  ted */.){.#ifdef
e090: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
e0a0: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
e0b0: 5f 4f 4b 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  _OK;.#else.  int
e0c0: 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e0e0: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
e0f0: 20 69 6e 74 20 69 44 62 20 3d 20 53 51 4c 49 54   int iDb = SQLIT
e100: 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3b 20  E_MAX_ATTACHED; 
e110: 20 2f 2a 20 73 71 6c 69 74 65 33 2e 61 44 62 5b   /* sqlite3.aDb[
e120: 5d 20 69 6e 64 65 78 20 6f 66 20 64 62 20 74 6f  ] index of db to
e130: 20 63 68 65 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a   checkpoint */..
e140: 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
e150: 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61  the output varia
e160: 62 6c 65 73 20 74 6f 20 2d 31 20 69 6e 20 63 61  bles to -1 in ca
e170: 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  se an error occu
e180: 72 73 2e 20 2a 2f 0a 20 20 69 66 28 20 70 6e 4c  rs. */.  if( pnL
e190: 6f 67 20 29 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31  og ) *pnLog = -1
e1a0: 3b 0a 20 20 69 66 28 20 70 6e 43 6b 70 74 20 29  ;.  if( pnCkpt )
e1b0: 20 2a 70 6e 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a   *pnCkpt = -1;..
e1c0: 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45    assert( SQLITE
e1d0: 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c  _CHECKPOINT_FULL
e1e0: 3e 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49  >SQLITE_CHECKPOI
e1f0: 4e 54 5f 50 41 53 53 49 56 45 20 29 3b 0a 20 20  NT_PASSIVE );.  
e200: 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43  assert( SQLITE_C
e210: 48 45 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53  HECKPOINT_FULL<S
e220: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e230: 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20 61 73  _RESTART );.  as
e240: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
e250: 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56 45 2b  CKPOINT_PASSIVE+
e260: 32 3d 3d 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  2==SQLITE_CHECKP
e270: 4f 49 4e 54 5f 52 45 53 54 41 52 54 20 29 3b 0a  OINT_RESTART );.
e280: 20 20 69 66 28 20 65 4d 6f 64 65 3c 53 51 4c 49    if( eMode<SQLI
e290: 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41  TE_CHECKPOINT_PA
e2a0: 53 53 49 56 45 20 7c 7c 20 65 4d 6f 64 65 3e 53  SSIVE || eMode>S
e2b0: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e2c0: 5f 52 45 53 54 41 52 54 20 29 7b 0a 20 20 20 20  _RESTART ){.    
e2d0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49  return SQLITE_MI
e2e0: 53 55 53 45 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  SUSE;.  }..  sql
e2f0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
e300: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
e310: 66 28 20 7a 44 62 20 26 26 20 7a 44 62 5b 30 5d  f( zDb && zDb[0]
e320: 20 29 7b 0a 20 20 20 20 69 44 62 20 3d 20 73 71   ){.    iDb = sq
e330: 6c 69 74 65 33 46 69 6e 64 44 62 4e 61 6d 65 28  lite3FindDbName(
e340: 64 62 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20 20  db, zDb);.  }.  
e350: 69 66 28 20 69 44 62 3c 30 20 29 7b 0a 20 20 20  if( iDb<0 ){.   
e360: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
e370: 4f 52 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  OR;.    sqlite3E
e380: 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
e390: 53 51 4c 49 54 45 5f 45 52 52 4f 52 2c 20 22 75  SQLITE_ERROR, "u
e3a0: 6e 6b 6e 6f 77 6e 20 64 61 74 61 62 61 73 65 3a  nknown database:
e3b0: 20 25 73 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 65   %s", zDb);.  }e
e3c0: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
e3d0: 6c 69 74 65 33 43 68 65 63 6b 70 6f 69 6e 74 28  lite3Checkpoint(
e3e0: 64 62 2c 20 69 44 62 2c 20 65 4d 6f 64 65 2c 20  db, iDb, eMode, 
e3f0: 70 6e 4c 6f 67 2c 20 70 6e 43 6b 70 74 29 3b 0a  pnLog, pnCkpt);.
e400: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e410: 28 64 62 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  (db, rc);.  }.  
e420: 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45  rc = sqlite3ApiE
e430: 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73  xit(db, rc);.  s
e440: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
e450: 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
e460: 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64   return rc;.#end
e470: 69 66 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  if.}.../*.** Che
e480: 63 6b 70 6f 69 6e 74 20 64 61 74 61 62 61 73 65  ckpoint database
e490: 20 7a 44 62 2e 20 49 66 20 7a 44 62 20 69 73 20   zDb. If zDb is 
e4a0: 4e 55 4c 4c 2c 20 6f 72 20 69 66 20 74 68 65 20  NULL, or if the 
e4b0: 62 75 66 66 65 72 20 7a 44 62 20 70 6f 69 6e 74  buffer zDb point
e4c0: 73 0a 2a 2a 20 74 6f 20 63 6f 6e 74 61 69 6e 73  s.** to contains
e4d0: 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 73   a zero-length s
e4e0: 74 72 69 6e 67 2c 20 61 6c 6c 20 61 74 74 61 63  tring, all attac
e4f0: 68 65 64 20 64 61 74 61 62 61 73 65 73 20 61 72  hed databases ar
e500: 65 20 0a 2a 2a 20 63 68 65 63 6b 70 6f 69 6e 74  e .** checkpoint
e510: 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
e520: 65 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e  e3_wal_checkpoin
e530: 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63  t(sqlite3 *db, c
e540: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 29 7b  onst char *zDb){
e550: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
e560: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
e570: 5f 76 32 28 64 62 2c 20 7a 44 62 2c 20 53 51 4c  _v2(db, zDb, SQL
e580: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
e590: 41 53 53 49 56 45 2c 20 30 2c 20 30 29 3b 0a 7d  ASSIVE, 0, 0);.}
e5a0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
e5b0: 5f 4f 4d 49 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20  _OMIT_WAL./*.** 
e5c0: 52 75 6e 20 61 20 63 68 65 63 6b 70 6f 69 6e 74  Run a checkpoint
e5d0: 20 6f 6e 20 64 61 74 61 62 61 73 65 20 69 44 62   on database iDb
e5e0: 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f  . This is a no-o
e5f0: 70 20 69 66 20 64 61 74 61 62 61 73 65 20 69 44  p if database iD
e600: 62 20 69 73 0a 2a 2a 20 6e 6f 74 20 63 75 72 72  b is.** not curr
e610: 65 6e 74 6c 79 20 6f 70 65 6e 20 69 6e 20 57 41  ently open in WA
e620: 4c 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  L mode..**.** If
e630: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
e640: 73 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  s open on the da
e650: 74 61 62 61 73 65 20 62 65 69 6e 67 20 63 68 65  tabase being che
e660: 63 6b 70 6f 69 6e 74 65 64 2c 20 74 68 69 73 20  ckpointed, this 
e670: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
e680: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4c 4f 43 4b  urns SQLITE_LOCK
e690: 45 44 20 61 6e 64 20 61 20 63 68 65 63 6b 70 6f  ED and a checkpo
e6a0: 69 6e 74 20 69 73 20 6e 6f 74 20 61 74 74 65 6d  int is not attem
e6b0: 70 74 65 64 2e 20 49 66 20 0a 2a 2a 20 61 6e 20  pted. If .** an 
e6c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
e6d0: 6c 65 20 72 75 6e 6e 69 6e 67 20 74 68 65 20 63  le running the c
e6e0: 68 65 63 6b 70 6f 69 6e 74 2c 20 61 6e 20 53 51  heckpoint, an SQ
e6f0: 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  Lite error code 
e700: 69 73 20 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20  is .** returned 
e710: 28 69 2e 65 2e 20 53 51 4c 49 54 45 5f 49 4f 45  (i.e. SQLITE_IOE
e720: 52 52 29 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  RR). Otherwise, 
e730: 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
e740: 20 54 68 65 20 6d 75 74 65 78 20 6f 6e 20 64 61   The mutex on da
e750: 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64 62  tabase handle db
e760: 20 73 68 6f 75 6c 64 20 62 65 20 68 65 6c 64 20   should be held 
e770: 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 54  by the caller. T
e780: 68 65 20 6d 75 74 65 78 0a 2a 2a 20 61 73 73 6f  he mutex.** asso
e790: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 20  ciated with the 
e7a0: 73 70 65 63 69 66 69 63 20 62 2d 74 72 65 65 20  specific b-tree 
e7b0: 62 65 69 6e 67 20 63 68 65 63 6b 70 6f 69 6e 74  being checkpoint
e7c0: 65 64 20 69 73 20 74 61 6b 65 6e 20 62 79 0a 2a  ed is taken by.*
e7d0: 2a 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * this function 
e7e0: 77 68 69 6c 65 20 74 68 65 20 63 68 65 63 6b 70  while the checkp
e7f0: 6f 69 6e 74 20 69 73 20 72 75 6e 6e 69 6e 67 2e  oint is running.
e800: 0a 2a 2a 0a 2a 2a 20 49 66 20 69 44 62 20 69 73  .**.** If iDb is
e810: 20 70 61 73 73 65 64 20 53 51 4c 49 54 45 5f 4d   passed SQLITE_M
e820: 41 58 5f 41 54 54 41 43 48 45 44 2c 20 74 68 65  AX_ATTACHED, the
e830: 6e 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20 64  n all attached d
e840: 61 74 61 62 61 73 65 73 20 61 72 65 0a 2a 2a 20  atabases are.** 
e850: 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 20 49 66  checkpointed. If
e860: 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
e870: 6f 75 6e 74 65 72 65 64 20 69 74 20 69 73 20 72  ountered it is r
e880: 65 74 75 72 6e 65 64 20 69 6d 6d 65 64 69 61 74  eturned immediat
e890: 65 6c 79 20 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65  ely -.** no atte
e8a0: 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 63  mpt is made to c
e8b0: 68 65 63 6b 70 6f 69 6e 74 20 61 6e 79 20 72 65  heckpoint any re
e8c0: 6d 61 69 6e 69 6e 67 20 64 61 74 61 62 61 73 65  maining database
e8d0: 73 2e 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  s..**.** Paramet
e8e0: 65 72 20 65 4d 6f 64 65 20 69 73 20 6f 6e 65 20  er eMode is one 
e8f0: 6f 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50  of SQLITE_CHECKP
e900: 4f 49 4e 54 5f 50 41 53 53 49 56 45 2c 20 46 55  OINT_PASSIVE, FU
e910: 4c 4c 20 6f 72 20 52 45 53 54 41 52 54 2e 0a 2a  LL or RESTART..*
e920: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 43 68 65  /.int sqlite3Che
e930: 63 6b 70 6f 69 6e 74 28 73 71 6c 69 74 65 33 20  ckpoint(sqlite3 
e940: 2a 64 62 2c 20 69 6e 74 20 69 44 62 2c 20 69 6e  *db, int iDb, in
e950: 74 20 65 4d 6f 64 65 2c 20 69 6e 74 20 2a 70 6e  t eMode, int *pn
e960: 4c 6f 67 2c 20 69 6e 74 20 2a 70 6e 43 6b 70 74  Log, int *pnCkpt
e970: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
e980: 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
e990: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
e9a0: 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ode */.  int i; 
e9b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64           /* Used
e9d0: 20 74 6f 20 69 74 65 72 61 74 65 20 74 68 72 6f   to iterate thro
e9e0: 75 67 68 20 61 74 74 61 63 68 65 64 20 64 62 73  ugh attached dbs
e9f0: 20 2a 2f 0a 20 20 69 6e 74 20 62 42 75 73 79 20   */.  int bBusy 
ea00: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
ea10: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
ea20: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 68 61 73   SQLITE_BUSY has
ea30: 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
ea40: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
ea50: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
ea60: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
ea70: 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e 4c 6f  .  assert( !pnLo
ea80: 67 20 7c 7c 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20  g || *pnLog==-1 
ea90: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 70 6e  );.  assert( !pn
eaa0: 43 6b 70 74 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d  Ckpt || *pnCkpt=
eab0: 3d 2d 31 20 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  =-1 );..  for(i=
eac0: 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 20 26 26 20  0; i<db->nDb && 
ead0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
eae0: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 3d 3d  ++){.    if( i==
eaf0: 69 44 62 20 7c 7c 20 69 44 62 3d 3d 53 51 4c 49  iDb || iDb==SQLI
eb00: 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20  TE_MAX_ATTACHED 
eb10: 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
eb20: 6c 69 74 65 33 42 74 72 65 65 43 68 65 63 6b 70  lite3BtreeCheckp
eb30: 6f 69 6e 74 28 64 62 2d 3e 61 44 62 5b 69 5d 2e  oint(db->aDb[i].
eb40: 70 42 74 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  pBt, eMode, pnLo
eb50: 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
eb60: 20 20 70 6e 4c 6f 67 20 3d 20 30 3b 0a 20 20 20    pnLog = 0;.   
eb70: 20 20 20 70 6e 43 6b 70 74 20 3d 20 30 3b 0a 20     pnCkpt = 0;. 
eb80: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
eb90: 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
eba0: 20 20 20 20 62 42 75 73 79 20 3d 20 31 3b 0a 20      bBusy = 1;. 
ebb0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
ebc0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20  TE_OK;.      }. 
ebd0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
ebe0: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
ebf0: 4b 20 26 26 20 62 42 75 73 79 29 20 3f 20 53 51  K && bBusy) ? SQ
ec00: 4c 49 54 45 5f 42 55 53 59 20 3a 20 72 63 3b 0a  LITE_BUSY : rc;.
ec10: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
ec20: 54 45 5f 4f 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a  TE_OMIT_WAL */..
ec30: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
ec40: 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 72 75 65  ion returns true
ec50: 20 69 66 20 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20   if main-memory 
ec60: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69  should be used i
ec70: 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 61 20 74  nstead of.** a t
ec80: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 66 6f  emporary file fo
ec90: 72 20 74 72 61 6e 73 69 65 6e 74 20 70 61 67 65  r transient page
eca0: 72 20 66 69 6c 65 73 20 61 6e 64 20 73 74 61 74  r files and stat
ecb0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a  ement journals..
ecc0: 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74  ** The value ret
ecd0: 75 72 6e 65 64 20 64 65 70 65 6e 64 73 20 6f 6e  urned depends on
ece0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 64 62   the value of db
ecf0: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 28 72 75  ->temp_store (ru
ed00: 6e 74 69 6d 65 0a 2a 2a 20 70 61 72 61 6d 65 74  ntime.** paramet
ed10: 65 72 29 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  er) and the comp
ed20: 69 6c 65 20 74 69 6d 65 20 76 61 6c 75 65 20 6f  ile time value o
ed30: 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54  f SQLITE_TEMP_ST
ed40: 4f 52 45 2e 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c  ORE. The.** foll
ed50: 6f 77 69 6e 67 20 74 61 62 6c 65 20 64 65 73 63  owing table desc
ed60: 72 69 62 65 73 20 74 68 65 20 72 65 6c 61 74 69  ribes the relati
ed70: 6f 6e 73 68 69 70 20 62 65 74 77 65 65 6e 20 74  onship between t
ed80: 68 65 73 65 20 74 77 6f 20 76 61 6c 75 65 73 0a  hese two values.
ed90: 2a 2a 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63  ** and this func
eda0: 74 69 6f 6e 73 20 72 65 74 75 72 6e 20 76 61 6c  tions return val
edb0: 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49  ue..**.**   SQLI
edc0: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 20 20 20  TE_TEMP_STORE   
edd0: 20 20 64 62 2d 3e 74 65 6d 70 5f 73 74 6f 72 65    db->temp_store
ede0: 20 20 20 20 20 4c 6f 63 61 74 69 6f 6e 20 6f 66       Location of
edf0: 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62   temporary datab
ee00: 61 73 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d  ase.**   -------
ee10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d  ----------     -
ee20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20  -------------   
ee30: 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d    --------------
ee40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ee50: 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20 20  .**   0         
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79 20              any 
ee70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
ee80: 69 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e  ile      (return
ee90: 20 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20   0).**   1      
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 31                 1
eeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eec0: 20 20 66 69 6c 65 20 20 20 20 20 20 28 72 65 74    file      (ret
eed0: 75 72 6e 20 30 29 0a 2a 2a 20 20 20 31 20 20 20  urn 0).**   1   
eee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eef0: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
ef00: 20 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28       memory    (
ef10: 72 65 74 75 72 6e 20 31 29 0a 2a 2a 20 20 20 31  return 1).**   1
ef20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef30: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 20       0          
ef40: 20 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20          file    
ef50: 20 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20    (return 0).** 
ef60: 20 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20    2             
ef70: 20 20 20 20 20 20 20 20 31 20 20 20 20 20 20 20          1       
ef80: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
ef90: 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
efa0: 2a 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20  **   2          
efb0: 20 20 20 20 20 20 20 20 20 20 20 32 20 20 20 20             2    
efc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65                me
efd0: 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20  mory    (return 
efe0: 31 29 0a 2a 2a 20 20 20 32 20 20 20 20 20 20 20  1).**   2       
eff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 20                0 
f000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f010: 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
f020: 72 6e 20 31 29 0a 2a 2a 20 20 20 33 20 20 20 20  rn 1).**   3    
f030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f040: 20 61 6e 79 20 20 20 20 20 20 20 20 20 20 20 20   any            
f050: 20 20 20 20 6d 65 6d 6f 72 79 20 20 20 20 28 72      memory    (r
f060: 65 74 75 72 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20  eturn 1).*/.int 
f070: 73 71 6c 69 74 65 33 54 65 6d 70 49 6e 4d 65 6d  sqlite3TempInMem
f080: 6f 72 79 28 63 6f 6e 73 74 20 73 71 6c 69 74 65  ory(const sqlite
f090: 33 20 2a 64 62 29 7b 0a 23 69 66 20 53 51 4c 49  3 *db){.#if SQLI
f0a0: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 31  TE_TEMP_STORE==1
f0b0: 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e  .  return ( db->
f0c0: 74 65 6d 70 5f 73 74 6f 72 65 3d 3d 32 20 29 3b  temp_store==2 );
f0d0: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
f0e0: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 32  TE_TEMP_STORE==2
f0f0: 0a 20 20 72 65 74 75 72 6e 20 28 20 64 62 2d 3e  .  return ( db->
f100: 74 65 6d 70 5f 73 74 6f 72 65 21 3d 31 20 29 3b  temp_store!=1 );
f110: 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
f120: 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3d 3d 33  TE_TEMP_STORE==3
f130: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65 6e  .  return 1;.#en
f140: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
f150: 45 4d 50 5f 53 54 4f 52 45 3c 31 20 7c 7c 20 53  EMP_STORE<1 || S
f160: 51 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45  QLITE_TEMP_STORE
f170: 3e 33 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 23  >3.  return 0;.#
f180: 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  endif.}../*.** R
f190: 65 74 75 72 6e 20 55 54 46 2d 38 20 65 6e 63 6f  eturn UTF-8 enco
f1a0: 64 65 64 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67  ded English lang
f1b0: 75 61 67 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  uage explanation
f1c0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
f1d0: 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f  ent.** error..*/
f1e0: 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
f1f0: 69 74 65 33 5f 65 72 72 6d 73 67 28 73 71 6c 69  ite3_errmsg(sqli
f200: 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f 6e 73  te3 *db){.  cons
f210: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 69 66 28  t char *z;.  if(
f220: 20 21 64 62 20 29 7b 0a 20 20 20 20 72 65 74 75   !db ){.    retu
f230: 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  rn sqlite3ErrStr
f240: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  (SQLITE_NOMEM);.
f250: 20 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74    }.  if( !sqlit
f260: 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63  e3SafetyCheckSic
f270: 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20  kOrOk(db) ){.   
f280: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45   return sqlite3E
f290: 72 72 53 74 72 28 53 51 4c 49 54 45 5f 4d 49 53  rrStr(SQLITE_MIS
f2a0: 55 53 45 5f 42 4b 50 54 29 3b 0a 20 20 7d 0a 20  USE_BKPT);.  }. 
f2b0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
f2c0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
f2d0: 0a 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f  .  if( db->mallo
f2e0: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 7a  cFailed ){.    z
f2f0: 20 3d 20 73 71 6c 69 74 65 33 45 72 72 53 74 72   = sqlite3ErrStr
f300: 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a  (SQLITE_NOMEM);.
f310: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74 65 73    }else{.    tes
f320: 74 63 61 73 65 28 20 64 62 2d 3e 70 45 72 72 3d  tcase( db->pErr=
f330: 3d 30 20 29 3b 0a 20 20 20 20 7a 20 3d 20 28 63  =0 );.    z = (c
f340: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
f350: 75 65 5f 74 65 78 74 28 64 62 2d 3e 70 45 72 72  ue_text(db->pErr
f360: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21  );.    assert( !
f370: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
f380: 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30   );.    if( z==0
f390: 20 29 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71   ){.      z = sq
f3a0: 6c 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e  lite3ErrStr(db->
f3b0: 65 72 72 43 6f 64 65 29 3b 0a 20 20 20 20 7d 0a  errCode);.    }.
f3c0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
f3d0: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
f3e0: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  tex);.  return z
f3f0: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
f400: 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
f410: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 55 54 46 2d  *.** Return UTF-
f420: 31 36 20 65 6e 63 6f 64 65 64 20 45 6e 67 6c 69  16 encoded Engli
f430: 73 68 20 6c 61 6e 67 75 61 67 65 20 65 78 70 6c  sh language expl
f440: 61 6e 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  anation of the m
f450: 6f 73 74 20 72 65 63 65 6e 74 0a 2a 2a 20 65 72  ost recent.** er
f460: 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f  ror..*/.const vo
f470: 69 64 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 6d  id *sqlite3_errm
f480: 73 67 31 36 28 73 71 6c 69 74 65 33 20 2a 64 62  sg16(sqlite3 *db
f490: 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  ){.  static cons
f4a0: 74 20 75 31 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d  t u16 outOfMem[]
f4b0: 20 3d 20 7b 0a 20 20 20 20 27 6f 27 2c 20 27 75   = {.    'o', 'u
f4c0: 27 2c 20 27 74 27 2c 20 27 20 27 2c 20 27 6f 27  ', 't', ' ', 'o'
f4d0: 2c 20 27 66 27 2c 20 27 20 27 2c 20 27 6d 27 2c  , 'f', ' ', 'm',
f4e0: 20 27 65 27 2c 20 27 6d 27 2c 20 27 6f 27 2c 20   'e', 'm', 'o', 
f4f0: 27 72 27 2c 20 27 79 27 2c 20 30 0a 20 20 7d 3b  'r', 'y', 0.  };
f500: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
f510: 75 31 36 20 6d 69 73 75 73 65 5b 5d 20 3d 20 7b  u16 misuse[] = {
f520: 0a 20 20 20 20 27 6c 27 2c 20 27 69 27 2c 20 27  .    'l', 'i', '
f530: 62 27 2c 20 27 72 27 2c 20 27 61 27 2c 20 27 72  b', 'r', 'a', 'r
f540: 27 2c 20 27 79 27 2c 20 27 20 27 2c 20 0a 20 20  ', 'y', ' ', .  
f550: 20 20 27 72 27 2c 20 27 6f 27 2c 20 27 75 27 2c    'r', 'o', 'u',
f560: 20 27 74 27 2c 20 27 69 27 2c 20 27 6e 27 2c 20   't', 'i', 'n', 
f570: 27 65 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27  'e', ' ', .    '
f580: 63 27 2c 20 27 61 27 2c 20 27 6c 27 2c 20 27 6c  c', 'a', 'l', 'l
f590: 27 2c 20 27 65 27 2c 20 27 64 27 2c 20 27 20 27  ', 'e', 'd', ' '
f5a0: 2c 20 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c  , .    'o', 'u',
f5b0: 20 27 74 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   't', ' ', .    
f5c0: 27 6f 27 2c 20 27 66 27 2c 20 27 20 27 2c 20 0a  'o', 'f', ' ', .
f5d0: 20 20 20 20 27 73 27 2c 20 27 65 27 2c 20 27 71      's', 'e', 'q
f5e0: 27 2c 20 27 75 27 2c 20 27 65 27 2c 20 27 6e 27  ', 'u', 'e', 'n'
f5f0: 2c 20 27 63 27 2c 20 27 65 27 2c 20 30 0a 20 20  , 'c', 'e', 0.  
f600: 7d 3b 0a 0a 20 20 63 6f 6e 73 74 20 76 6f 69 64  };..  const void
f610: 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62 20 29   *z;.  if( !db )
f620: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 76 6f  {.    return (vo
f630: 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20  id *)outOfMem;. 
f640: 20 7d 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65   }.  if( !sqlite
f650: 33 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b  3SafetyCheckSick
f660: 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20  OrOk(db) ){.    
f670: 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a 29 6d  return (void *)m
f680: 69 73 75 73 65 3b 0a 20 20 7d 0a 20 20 73 71 6c  isuse;.  }.  sql
f690: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
f6a0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
f6b0: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
f6c0: 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 28  led ){.    z = (
f6d0: 76 6f 69 64 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b  void *)outOfMem;
f6e0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 20  .  }else{.    z 
f6f0: 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  = sqlite3_value_
f700: 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29  text16(db->pErr)
f710: 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
f720: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
f730: 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
f740: 64 62 2d 3e 65 72 72 43 6f 64 65 2c 20 73 71 6c  db->errCode, sql
f750: 69 74 65 33 45 72 72 53 74 72 28 64 62 2d 3e 65  ite3ErrStr(db->e
f760: 72 72 43 6f 64 65 29 29 3b 0a 20 20 20 20 20 20  rrCode));.      
f770: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  z = sqlite3_valu
f780: 65 5f 74 65 78 74 31 36 28 64 62 2d 3e 70 45 72  e_text16(db->pEr
f790: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  r);.    }.    /*
f7a0: 20 41 20 6d 61 6c 6c 6f 63 28 29 20 6d 61 79 20   A malloc() may 
f7b0: 68 61 76 65 20 66 61 69 6c 65 64 20 77 69 74 68  have failed with
f7c0: 69 6e 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 73  in the call to s
f7d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
f7e0: 74 31 36 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  t16().    ** abo
f7f0: 76 65 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  ve. If this is t
f800: 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68  he case, then th
f810: 65 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  e db->mallocFail
f820: 65 64 20 66 6c 61 67 20 6e 65 65 64 73 20 74 6f  ed flag needs to
f830: 0a 20 20 20 20 2a 2a 20 62 65 20 63 6c 65 61 72  .    ** be clear
f840: 65 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e  ed before return
f850: 69 6e 67 2e 20 44 6f 20 74 68 69 73 20 64 69 72  ing. Do this dir
f860: 65 63 74 6c 79 2c 20 69 6e 73 74 65 61 64 20 6f  ectly, instead o
f870: 66 20 76 69 61 0a 20 20 20 20 2a 2a 20 73 71 6c  f via.    ** sql
f880: 69 74 65 33 41 70 69 45 78 69 74 28 29 2c 20 74  ite3ApiExit(), t
f890: 6f 20 61 76 6f 69 64 20 73 65 74 74 69 6e 67 20  o avoid setting 
f8a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e  the database han
f8b0: 64 6c 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  dle error messag
f8c0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 62  e..    */.    db
f8d0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
f8e0: 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65   0;.  }.  sqlite
f8f0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
f900: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
f910: 72 6e 20 7a 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn z;.}.#endif /
f920: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
f930: 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
f940: 74 75 72 6e 20 74 68 65 20 6d 6f 73 74 20 72 65  turn the most re
f950: 63 65 6e 74 20 65 72 72 6f 72 20 63 6f 64 65 20  cent error code 
f960: 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 20  generated by an 
f970: 53 51 4c 69 74 65 20 72 6f 75 74 69 6e 65 2e 20  SQLite routine. 
f980: 49 66 20 4e 55 4c 4c 20 69 73 0a 2a 2a 20 70 61  If NULL is.** pa
f990: 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75 6e  ssed to this fun
f9a0: 63 74 69 6f 6e 2c 20 77 65 20 61 73 73 75 6d 65  ction, we assume
f9b0: 20 61 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c   a malloc() fail
f9c0: 65 64 20 64 75 72 69 6e 67 20 73 71 6c 69 74 65  ed during sqlite
f9d0: 33 5f 6f 70 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74  3_open()..*/.int
f9e0: 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
f9f0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
fa00: 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c 69   if( db && !sqli
fa10: 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53 69  te3SafetyCheckSi
fa20: 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20  ckOrOk(db) ){.  
fa30: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fa40: 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d  MISUSE_BKPT;.  }
fa50: 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64 62  .  if( !db || db
fa60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
fa70: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
fa80: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
fa90: 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72 43   return db->errC
faa0: 6f 64 65 20 26 20 64 62 2d 3e 65 72 72 4d 61 73  ode & db->errMas
fab0: 6b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  k;.}.int sqlite3
fac0: 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
fad0: 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  e(sqlite3 *db){.
fae0: 20 20 69 66 28 20 64 62 20 26 26 20 21 73 71 6c    if( db && !sql
faf0: 69 74 65 33 53 61 66 65 74 79 43 68 65 63 6b 53  ite3SafetyCheckS
fb00: 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29 7b 0a 20  ickOrOk(db) ){. 
fb10: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fb20: 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a 20 20  _MISUSE_BKPT;.  
fb30: 7d 0a 20 20 69 66 28 20 21 64 62 20 7c 7c 20 64  }.  if( !db || d
fb40: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
fb50: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
fb60: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
fb70: 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 65 72 72    return db->err
fb80: 43 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Code;.}../*.** R
fb90: 65 74 75 72 6e 20 61 20 73 74 72 69 6e 67 20 74  eturn a string t
fba0: 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
fbb0: 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72 20  e kind of error 
fbc0: 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68 65  specified in the
fbd0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 20 46  .** argument.  F
fbe0: 6f 72 20 6e 6f 77 2c 20 74 68 69 73 20 73 69 6d  or now, this sim
fbf0: 70 6c 79 20 63 61 6c 6c 73 20 74 68 65 20 69 6e  ply calls the in
fc00: 74 65 72 6e 61 6c 20 73 71 6c 69 74 65 33 45 72  ternal sqlite3Er
fc10: 72 53 74 72 28 29 0a 2a 2a 20 66 75 6e 63 74 69  rStr().** functi
fc20: 6f 6e 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  on..*/.const cha
fc30: 72 20 2a 73 71 6c 69 74 65 33 5f 65 72 72 73 74  r *sqlite3_errst
fc40: 72 28 69 6e 74 20 72 63 29 7b 0a 20 20 72 65 74  r(int rc){.  ret
fc50: 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
fc60: 72 28 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r(rc);.}../*.** 
fc70: 49 6e 76 61 6c 69 64 61 74 65 20 61 6c 6c 20 63  Invalidate all c
fc80: 61 63 68 65 64 20 4b 65 79 49 6e 66 6f 20 6f 62  ached KeyInfo ob
fc90: 6a 65 63 74 73 20 66 6f 72 20 64 61 74 61 62 61  jects for databa
fca0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 22 64  se connection "d
fcb0: 62 22 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  b".*/.static voi
fcc0: 64 20 69 6e 76 61 6c 69 64 61 74 65 43 61 63 68  d invalidateCach
fcd0: 65 64 4b 65 79 49 6e 66 6f 28 73 71 6c 69 74 65  edKeyInfo(sqlite
fce0: 33 20 2a 64 62 29 7b 0a 20 20 44 62 20 2a 70 44  3 *db){.  Db *pD
fcf0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
fd00: 20 20 20 20 20 20 2f 2a 20 41 20 73 69 6e 67 6c        /* A singl
fd10: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
fd20: 69 6e 74 20 69 44 62 3b 20 20 20 20 20 20 20 20  int iDb;        
fd30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
fd40: 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 64 65  he database inde
fd50: 78 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 48 61  x number */.  Ha
fd60: 73 68 45 6c 65 6d 20 2a 6b 3b 20 20 20 20 20 20  shElem *k;      
fd70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
fd80: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 74 61   looping over ta
fd90: 62 6c 65 73 20 69 6e 20 70 44 62 20 2a 2f 0a 20  bles in pDb */. 
fda0: 20 54 61 62 6c 65 20 2a 70 54 61 62 3b 20 20 20   Table *pTab;   
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fdc0: 41 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64  A table in the d
fdd0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 49 6e 64  atabase */.  Ind
fde0: 65 78 20 2a 70 49 64 78 3b 20 20 20 20 20 20 20  ex *pIdx;       
fdf0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 61 63 68           /* Each
fe00: 20 69 6e 64 65 78 20 2a 2f 0a 0a 20 20 66 6f 72   index */..  for
fe10: 28 69 44 62 3d 30 2c 20 70 44 62 3d 64 62 2d 3e  (iDb=0, pDb=db->
fe20: 61 44 62 3b 20 69 44 62 3c 64 62 2d 3e 6e 44 62  aDb; iDb<db->nDb
fe30: 3b 20 69 44 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b  ; iDb++, pDb++){
fe40: 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70 42  .    if( pDb->pB
fe50: 74 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  t==0 ) continue;
fe60: 0a 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65  .    sqlite3Btre
fe70: 65 45 6e 74 65 72 28 70 44 62 2d 3e 70 42 74 29  eEnter(pDb->pBt)
fe80: 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 73 71 6c 69  ;.    for(k=sqli
fe90: 74 65 48 61 73 68 46 69 72 73 74 28 26 70 44 62  teHashFirst(&pDb
fea0: 2d 3e 70 53 63 68 65 6d 61 2d 3e 74 62 6c 48 61  ->pSchema->tblHa
feb0: 73 68 29 3b 20 20 6b 3b 20 6b 3d 73 71 6c 69 74  sh);  k; k=sqlit
fec0: 65 48 61 73 68 4e 65 78 74 28 6b 29 29 7b 0a 20  eHashNext(k)){. 
fed0: 20 20 20 20 20 70 54 61 62 20 3d 20 28 54 61 62       pTab = (Tab
fee0: 6c 65 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  le*)sqliteHashDa
fef0: 74 61 28 6b 29 3b 0a 20 20 20 20 20 20 66 6f 72  ta(k);.      for
ff00: 28 70 49 64 78 3d 70 54 61 62 2d 3e 70 49 6e 64  (pIdx=pTab->pInd
ff10: 65 78 3b 20 70 49 64 78 3b 20 70 49 64 78 3d 70  ex; pIdx; pIdx=p
ff20: 49 64 78 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20  Idx->pNext){.   
ff30: 20 20 20 20 20 69 66 28 20 70 49 64 78 2d 3e 70       if( pIdx->p
ff40: 4b 65 79 49 6e 66 6f 20 26 26 20 70 49 64 78 2d  KeyInfo && pIdx-
ff50: 3e 70 4b 65 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64  >pKeyInfo->db==d
ff60: 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  b ){.          s
ff70: 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 55 6e 72  qlite3KeyInfoUnr
ff80: 65 66 28 70 49 64 78 2d 3e 70 4b 65 79 49 6e 66  ef(pIdx->pKeyInf
ff90: 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  o);.          pI
ffa0: 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 20 3d 20 30  dx->pKeyInfo = 0
ffb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ffc0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
ffd0: 6c 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 28  lite3BtreeLeave(
ffe0: 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20 7d 0a 7d  pDb->pBt);.  }.}
fff0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
10000 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6e 67 20 66   new collating f
10010 75 6e 63 74 69 6f 6e 20 66 6f 72 20 64 61 74 61  unction for data
10020 62 61 73 65 20 22 64 62 22 2e 20 20 54 68 65 20  base "db".  The 
10030 6e 61 6d 65 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a  name is zName.**
10040 20 61 6e 64 20 74 68 65 20 65 6e 63 6f 64 69 6e   and the encodin
10050 67 20 69 73 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61  g is enc..*/.sta
10060 74 69 63 20 69 6e 74 20 63 72 65 61 74 65 43 6f  tic int createCo
10070 6c 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74  llation(.  sqlit
10080 65 33 2a 20 64 62 2c 0a 20 20 63 6f 6e 73 74 20  e3* db,.  const 
10090 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
100a0 75 38 20 65 6e 63 2c 0a 20 20 76 6f 69 64 2a 20  u8 enc,.  void* 
100b0 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43 6f  pCtx,.  int(*xCo
100c0 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e 74  mpare)(void*,int
100d0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74  ,const void*,int
100e0 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a 20  ,const void*),. 
100f0 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f 69   void(*xDel)(voi
10100 64 2a 29 0a 29 7b 0a 20 20 43 6f 6c 6c 53 65 71  d*).){.  CollSeq
10110 20 2a 70 43 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65   *pColl;.  int e
10120 6e 63 32 3b 0a 20 20 0a 20 20 61 73 73 65 72 74  nc2;.  .  assert
10130 28 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  ( sqlite3_mutex_
10140 68 65 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20  held(db->mutex) 
10150 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 53 51 4c 49  );..  /* If SQLI
10160 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65 63  TE_UTF16 is spec
10170 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e 63  ified as the enc
10180 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61 6e  oding type, tran
10190 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a 20  sform this.  ** 
101a0 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54 45  to one of SQLITE
101b0 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c 49  _UTF16LE or SQLI
101c0 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e 67  TE_UTF16BE using
101d0 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54 45   the.  ** SQLITE
101e0 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61 63  _UTF16NATIVE mac
101f0 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31 36  ro. SQLITE_UTF16
10200 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e 74   is not used int
10210 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20  ernally..  */.  
10220 65 6e 63 32 20 3d 20 65 6e 63 3b 0a 20 20 74 65  enc2 = enc;.  te
10230 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51  stcase( enc2==SQ
10240 4c 49 54 45 5f 55 54 46 31 36 20 29 3b 0a 20 20  LITE_UTF16 );.  
10250 74 65 73 74 63 61 73 65 28 20 65 6e 63 32 3d 3d  testcase( enc2==
10260 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49  SQLITE_UTF16_ALI
10270 47 4e 45 44 20 29 3b 0a 20 20 69 66 28 20 65 6e  GNED );.  if( en
10280 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  c2==SQLITE_UTF16
10290 20 7c 7c 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45   || enc2==SQLITE
102a0 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 20 29  _UTF16_ALIGNED )
102b0 7b 0a 20 20 20 20 65 6e 63 32 20 3d 20 53 51 4c  {.    enc2 = SQL
102c0 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
102d0 0a 20 20 7d 0a 20 20 69 66 28 20 65 6e 63 32 3c  .  }.  if( enc2<
102e0 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65  SQLITE_UTF8 || e
102f0 6e 63 32 3e 53 51 4c 49 54 45 5f 55 54 46 31 36  nc2>SQLITE_UTF16
10300 42 45 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  BE ){.    return
10310 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42   SQLITE_MISUSE_B
10320 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43  KPT;.  }..  /* C
10330 68 65 63 6b 20 69 66 20 74 68 69 73 20 63 61 6c  heck if this cal
10340 6c 20 69 73 20 72 65 6d 6f 76 69 6e 67 20 6f 72  l is removing or
10350 20 72 65 70 6c 61 63 69 6e 67 20 61 6e 20 65 78   replacing an ex
10360 69 73 74 69 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e  isting collation
10370 20 0a 20 20 2a 2a 20 73 65 71 75 65 6e 63 65 2e   .  ** sequence.
10380 20 49 66 20 73 6f 2c 20 61 6e 64 20 74 68 65 72   If so, and ther
10390 65 20 61 72 65 20 61 63 74 69 76 65 20 56 4d 73  e are active VMs
103a0 2c 20 72 65 74 75 72 6e 20 62 75 73 79 2e 20 49  , return busy. I
103b0 66 20 74 68 65 72 65 0a 20 20 2a 2a 20 61 72 65  f there.  ** are
103c0 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73 2c 20   no active VMs, 
103d0 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 20 70  invalidate any p
103e0 72 65 2d 63 6f 6d 70 69 6c 65 64 20 73 74 61 74  re-compiled stat
103f0 65 6d 65 6e 74 73 2e 0a 20 20 2a 2f 0a 20 20 70  ements..  */.  p
10400 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
10410 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75  ndCollSeq(db, (u
10420 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 30  8)enc2, zName, 0
10430 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 20 26  );.  if( pColl &
10440 26 20 70 43 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b  & pColl->xCmp ){
10450 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6e 56 64  .    if( db->nVd
10460 62 65 41 63 74 69 76 65 20 29 7b 0a 20 20 20 20  beActive ){.    
10470 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69    sqlite3ErrorWi
10480 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49 54 45  thMsg(db, SQLITE
10490 5f 42 55 53 59 2c 20 0a 20 20 20 20 20 20 20 20  _BUSY, .        
104a0 22 75 6e 61 62 6c 65 20 74 6f 20 64 65 6c 65 74  "unable to delet
104b0 65 2f 6d 6f 64 69 66 79 20 63 6f 6c 6c 61 74 69  e/modify collati
104c0 6f 6e 20 73 65 71 75 65 6e 63 65 20 64 75 65 20  on sequence due 
104d0 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65 6d  to active statem
104e0 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 72 65  ents");.      re
104f0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
10500 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
10510 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
10520 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
10530 0a 20 20 20 20 69 6e 76 61 6c 69 64 61 74 65 43  .    invalidateC
10540 61 63 68 65 64 4b 65 79 49 6e 66 6f 28 64 62 29  achedKeyInfo(db)
10550 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 63 6f 6c  ;..    /* If col
10560 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
10570 70 43 6f 6c 6c 20 77 61 73 20 63 72 65 61 74 65  pColl was create
10580 64 20 64 69 72 65 63 74 6c 79 20 62 79 20 61 20  d directly by a 
10590 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
105a0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f  qlite3_create_co
105b0 6c 6c 61 74 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74  llation, and not
105c0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 73 79   generated by sy
105d0 6e 74 68 43 6f 6c 6c 53 65 71 28 29 2c 0a 20 20  nthCollSeq(),.  
105e0 20 20 2a 2a 20 74 68 65 6e 20 61 6e 79 20 63 6f    ** then any co
105f0 70 69 65 73 20 6d 61 64 65 20 62 79 20 73 79 6e  pies made by syn
10600 74 68 43 6f 6c 6c 53 65 71 28 29 20 6e 65 65 64  thCollSeq() need
10610 20 74 6f 20 62 65 20 69 6e 76 61 6c 69 64 61 74   to be invalidat
10620 65 64 2e 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c  ed..    ** Also,
10630 20 63 6f 6c 6c 61 74 69 6f 6e 20 64 65 73 74 72   collation destr
10640 75 63 74 6f 72 20 2d 20 43 6f 6c 6c 53 65 71 2e  uctor - CollSeq.
10650 78 44 65 6c 28 29 20 2d 20 66 75 6e 63 74 69 6f  xDel() - functio
10660 6e 20 6d 61 79 20 6e 65 65 64 0a 20 20 20 20 2a  n may need.    *
10670 2a 20 74 6f 20 62 65 20 63 61 6c 6c 65 64 2e 0a  * to be called..
10680 20 20 20 20 2a 2f 20 0a 20 20 20 20 69 66 28 20      */ .    if( 
10690 28 70 43 6f 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53  (pColl->enc & ~S
106a0 51 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47  QLITE_UTF16_ALIG
106b0 4e 45 44 29 3d 3d 65 6e 63 32 20 29 7b 0a 20 20  NED)==enc2 ){.  
106c0 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 61 43 6f      CollSeq *aCo
106d0 6c 6c 20 3d 20 73 71 6c 69 74 65 33 48 61 73 68  ll = sqlite3Hash
106e0 46 69 6e 64 28 26 64 62 2d 3e 61 43 6f 6c 6c 53  Find(&db->aCollS
106f0 65 71 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  eq, zName);.    
10700 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 66    int j;.      f
10710 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b  or(j=0; j<3; j++
10720 29 7b 0a 20 20 20 20 20 20 20 20 43 6f 6c 6c 53  ){.        CollS
10730 65 71 20 2a 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a  eq *p = &aColl[j
10740 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ];.        if( p
10750 2d 3e 65 6e 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e  ->enc==pColl->en
10760 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  c ){.          i
10770 66 28 20 70 2d 3e 78 44 65 6c 20 29 7b 0a 20 20  f( p->xDel ){.  
10780 20 20 20 20 20 20 20 20 20 20 70 2d 3e 78 44 65            p->xDe
10790 6c 28 70 2d 3e 70 55 73 65 72 29 3b 0a 20 20 20  l(p->pUser);.   
107a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
107b0 20 20 20 70 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a     p->xCmp = 0;.
107c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
107d0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70  }.    }.  }..  p
107e0 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46 69  Coll = sqlite3Fi
107f0 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 28 75  ndCollSeq(db, (u
10800 38 29 65 6e 63 32 2c 20 7a 4e 61 6d 65 2c 20 31  8)enc2, zName, 1
10810 29 3b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 3d 3d  );.  if( pColl==
10820 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
10830 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c  E_NOMEM;.  pColl
10840 2d 3e 78 43 6d 70 20 3d 20 78 43 6f 6d 70 61 72  ->xCmp = xCompar
10850 65 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 70 55 73 65  e;.  pColl->pUse
10860 72 20 3d 20 70 43 74 78 3b 0a 20 20 70 43 6f 6c  r = pCtx;.  pCol
10870 6c 2d 3e 78 44 65 6c 20 3d 20 78 44 65 6c 3b 0a  l->xDel = xDel;.
10880 20 20 70 43 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28    pColl->enc = (
10890 75 38 29 28 65 6e 63 32 20 7c 20 28 65 6e 63 20  u8)(enc2 | (enc 
108a0 26 20 53 51 4c 49 54 45 5f 55 54 46 31 36 5f 41  & SQLITE_UTF16_A
108b0 4c 49 47 4e 45 44 29 29 3b 0a 20 20 73 71 6c 69  LIGNED));.  sqli
108c0 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53 51 4c  te3Error(db, SQL
108d0 49 54 45 5f 4f 4b 29 3b 0a 20 20 72 65 74 75 72  ITE_OK);.  retur
108e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
108f0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 61 72 72 61  ./*.** This arra
10900 79 20 64 65 66 69 6e 65 73 20 68 61 72 64 20 75  y defines hard u
10910 70 70 65 72 20 62 6f 75 6e 64 73 20 6f 6e 20 6c  pper bounds on l
10920 69 6d 69 74 20 76 61 6c 75 65 73 2e 20 20 54 68  imit values.  Th
10930 65 0a 2a 2a 20 69 6e 69 74 69 61 6c 69 7a 65 72  e.** initializer
10940 20 6d 75 73 74 20 62 65 20 6b 65 70 74 20 69 6e   must be kept in
10950 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 53   sync with the S
10960 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a  QLITE_LIMIT_*.**
10970 20 23 64 65 66 69 6e 65 73 20 69 6e 20 73 71 6c   #defines in sql
10980 69 74 65 33 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69  ite3.h..*/.stati
10990 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 48 61 72  c const int aHar
109a0 64 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 53  dLimit[] = {.  S
109b0 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48  QLITE_MAX_LENGTH
109c0 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53  ,.  SQLITE_MAX_S
109d0 51 4c 5f 4c 45 4e 47 54 48 2c 0a 20 20 53 51 4c  QL_LENGTH,.  SQL
109e0 49 54 45 5f 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a  ITE_MAX_COLUMN,.
109f0 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50    SQLITE_MAX_EXP
10a00 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54  R_DEPTH,.  SQLIT
10a10 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53  E_MAX_COMPOUND_S
10a20 45 4c 45 43 54 2c 0a 20 20 53 51 4c 49 54 45 5f  ELECT,.  SQLITE_
10a30 4d 41 58 5f 56 44 42 45 5f 4f 50 2c 0a 20 20 53  MAX_VDBE_OP,.  S
10a40 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49  QLITE_MAX_FUNCTI
10a50 4f 4e 5f 41 52 47 2c 0a 20 20 53 51 4c 49 54 45  ON_ARG,.  SQLITE
10a60 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 2c 0a 20  _MAX_ATTACHED,. 
10a70 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
10a80 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 2c  _PATTERN_LENGTH,
10a90 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41  .  SQLITE_MAX_VA
10aa0 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 2c 20 20  RIABLE_NUMBER,  
10ab0 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 33 38      /* IMP: R-38
10ac0 30 39 31 2d 33 32 33 35 32 20 2a 2f 0a 20 20 53  091-32352 */.  S
10ad0 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
10ae0 52 5f 44 45 50 54 48 2c 0a 20 20 53 51 4c 49 54  R_DEPTH,.  SQLIT
10af0 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52  E_MAX_WORKER_THR
10b00 45 41 44 53 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  EADS,.};../*.** 
10b10 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 68 61  Make sure the ha
10b20 72 64 20 6c 69 6d 69 74 73 20 61 72 65 20 73 65  rd limits are se
10b30 74 20 74 6f 20 72 65 61 73 6f 6e 61 62 6c 65 20  t to reasonable 
10b40 76 61 6c 75 65 73 0a 2a 2f 0a 23 69 66 20 53 51  values.*/.#if SQ
10b50 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c  LITE_MAX_LENGTH<
10b60 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
10b70 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 6d 75  TE_MAX_LENGTH mu
10b80 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 31  st be at least 1
10b90 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  00.#endif.#if SQ
10ba0 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
10bb0 47 54 48 3c 31 30 30 0a 23 20 65 72 72 6f 72 20  GTH<100.# error 
10bc0 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
10bd0 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
10be0 20 6c 65 61 73 74 20 31 30 30 0a 23 65 6e 64 69   least 100.#endi
10bf0 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58  f.#if SQLITE_MAX
10c00 5f 53 51 4c 5f 4c 45 4e 47 54 48 3e 53 51 4c 49  _SQL_LENGTH>SQLI
10c10 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 0a 23 20  TE_MAX_LENGTH.# 
10c20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58  error SQLITE_MAX
10c30 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 6d 75 73 74  _SQL_LENGTH must
10c40 20 6e 6f 74 20 62 65 20 67 72 65 61 74 65 72 20   not be greater 
10c50 74 68 61 6e 20 53 51 4c 49 54 45 5f 4d 41 58 5f  than SQLITE_MAX_
10c60 4c 45 4e 47 54 48 0a 23 65 6e 64 69 66 0a 23 69  LENGTH.#endif.#i
10c70 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d  f SQLITE_MAX_COM
10c80 50 4f 55 4e 44 5f 53 45 4c 45 43 54 3c 32 0a 23  POUND_SELECT<2.#
10c90 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
10ca0 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
10cb0 54 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  T must be at lea
10cc0 73 74 20 32 0a 23 65 6e 64 69 66 0a 23 69 66 20  st 2.#endif.#if 
10cd0 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
10ce0 4f 50 3c 34 30 0a 23 20 65 72 72 6f 72 20 53 51  OP<40.# error SQ
10cf0 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50  LITE_MAX_VDBE_OP
10d00 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61 73   must be at leas
10d10 74 20 34 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  t 40.#endif.#if 
10d20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
10d30 49 4f 4e 5f 41 52 47 3c 30 20 7c 7c 20 53 51 4c  ION_ARG<0 || SQL
10d40 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e  ITE_MAX_FUNCTION
10d50 5f 41 52 47 3e 31 30 30 30 0a 23 20 65 72 72 6f  _ARG>1000.# erro
10d60 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e  r SQLITE_MAX_FUN
10d70 43 54 49 4f 4e 5f 41 52 47 20 6d 75 73 74 20 62  CTION_ARG must b
10d80 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
10d90 31 30 30 30 0a 23 65 6e 64 69 66 0a 23 69 66 20  1000.#endif.#if 
10da0 53 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43  SQLITE_MAX_ATTAC
10db0 48 45 44 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  HED<0 || SQLITE_
10dc0 4d 41 58 5f 41 54 54 41 43 48 45 44 3e 31 32 35  MAX_ATTACHED>125
10dd0 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
10de0 4d 41 58 5f 41 54 54 41 43 48 45 44 20 6d 75 73  MAX_ATTACHED mus
10df0 74 20 62 65 20 62 65 74 77 65 65 6e 20 30 20 61  t be between 0 a
10e00 6e 64 20 31 32 35 0a 23 65 6e 64 69 66 0a 23 69  nd 125.#endif.#i
10e10 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b  f SQLITE_MAX_LIK
10e20 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48  E_PATTERN_LENGTH
10e30 3c 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54  <1.# error SQLIT
10e40 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45  E_MAX_LIKE_PATTE
10e50 52 4e 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  RN_LENGTH must b
10e60 65 20 61 74 20 6c 65 61 73 74 20 31 0a 23 65 6e  e at least 1.#en
10e70 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  dif.#if SQLITE_M
10e80 41 58 5f 43 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a  AX_COLUMN>32767.
10e90 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
10ea0 41 58 5f 43 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e  AX_COLUMN must n
10eb0 6f 74 20 65 78 63 65 65 64 20 33 32 37 36 37 0a  ot exceed 32767.
10ec0 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
10ed0 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
10ee0 50 54 48 3c 31 0a 23 20 65 72 72 6f 72 20 53 51  PTH<1.# error SQ
10ef0 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45 52  LITE_MAX_TRIGGER
10f00 5f 44 45 50 54 48 20 6d 75 73 74 20 62 65 20 61  _DEPTH must be a
10f10 74 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66  t least 1.#endif
10f20 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f  .#if SQLITE_MAX_
10f30 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3c 30  WORKER_THREADS<0
10f40 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57   || SQLITE_MAX_W
10f50 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3e 35 30  ORKER_THREADS>50
10f60 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f  .# error SQLITE_
10f70 4d 41 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41  MAX_WORKER_THREA
10f80 44 53 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  DS must be betwe
10f90 65 6e 20 30 20 61 6e 64 20 35 30 0a 23 65 6e 64  en 0 and 50.#end
10fa0 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  if.../*.** Chang
10fb0 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  e the value of a
10fc0 20 6c 69 6d 69 74 2e 20 20 52 65 70 6f 72 74 20   limit.  Report 
10fd0 74 68 65 20 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a  the old value..*
10fe0 2a 20 49 66 20 61 6e 20 69 6e 76 61 6c 69 64 20  * If an invalid 
10ff0 6c 69 6d 69 74 20 69 6e 64 65 78 20 69 73 20 73  limit index is s
11000 75 70 70 6c 69 65 64 2c 20 72 65 70 6f 72 74 20  upplied, report 
11010 2d 31 2e 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63  -1..** Make no c
11020 68 61 6e 67 65 73 20 62 75 74 20 73 74 69 6c 6c  hanges but still
11030 20 72 65 70 6f 72 74 20 74 68 65 20 6f 6c 64 20   report the old 
11040 76 61 6c 75 65 20 69 66 20 74 68 65 0a 2a 2a 20  value if the.** 
11050 6e 65 77 20 6c 69 6d 69 74 20 69 73 20 6e 65 67  new limit is neg
11060 61 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e  ative..**.** A n
11070 65 77 20 6c 6f 77 65 72 20 6c 69 6d 69 74 20 64  ew lower limit d
11080 6f 65 73 20 6e 6f 74 20 73 68 72 69 6e 6b 20 65  oes not shrink e
11090 78 69 73 74 69 6e 67 20 63 6f 6e 73 74 72 75 63  xisting construc
110a0 74 73 2e 0a 2a 2a 20 49 74 20 6d 65 72 65 6c 79  ts..** It merely
110b0 20 70 72 65 76 65 6e 74 73 20 6e 65 77 20 63 6f   prevents new co
110c0 6e 73 74 72 75 63 74 73 20 74 68 61 74 20 65 78  nstructs that ex
110d0 63 65 65 64 20 74 68 65 20 6c 69 6d 69 74 0a 2a  ceed the limit.*
110e0 2a 20 66 72 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a  * from forming..
110f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 6c  */.int sqlite3_l
11100 69 6d 69 74 28 73 71 6c 69 74 65 33 20 2a 64 62  imit(sqlite3 *db
11110 2c 20 69 6e 74 20 6c 69 6d 69 74 49 64 2c 20 69  , int limitId, i
11120 6e 74 20 6e 65 77 4c 69 6d 69 74 29 7b 0a 20 20  nt newLimit){.  
11130 69 6e 74 20 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 0a  int oldLimit;...
11140 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    /* EVIDENCE-OF
11150 3a 20 52 2d 33 30 31 38 39 2d 35 34 30 39 37 20  : R-30189-54097 
11160 46 6f 72 20 65 61 63 68 20 6c 69 6d 69 74 20 63  For each limit c
11170 61 74 65 67 6f 72 79 20 53 51 4c 49 54 45 5f 4c  ategory SQLITE_L
11180 49 4d 49 54 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74  IMIT_NAME.  ** t
11190 68 65 72 65 20 69 73 20 61 20 68 61 72 64 20 75  here is a hard u
111a0 70 70 65 72 20 62 6f 75 6e 64 20 73 65 74 20 61  pper bound set a
111b0 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 62  t compile-time b
111c0 79 20 61 20 43 20 70 72 65 70 72 6f 63 65 73 73  y a C preprocess
111d0 6f 72 0a 20 20 2a 2a 20 6d 61 63 72 6f 20 63 61  or.  ** macro ca
111e0 6c 6c 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f  lled SQLITE_MAX_
111f0 4e 41 4d 45 2e 20 28 54 68 65 20 22 5f 4c 49 4d  NAME. (The "_LIM
11200 49 54 5f 22 20 69 6e 20 74 68 65 20 6e 61 6d 65  IT_" in the name
11210 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 0a 20   is changed to. 
11220 20 2a 2a 20 22 5f 4d 41 58 5f 22 2e 29 0a 20 20   ** "_MAX_".).  
11230 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  */.  assert( aHa
11240 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
11250 49 4d 49 54 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  IMIT_LENGTH]==SQ
11260 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 20  LITE_MAX_LENGTH 
11270 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
11280 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
11290 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d  IMIT_SQL_LENGTH]
112a0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  ==SQLITE_MAX_SQL
112b0 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73 73  _LENGTH );.  ass
112c0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
112d0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
112e0 55 4d 4e 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  UMN]==SQLITE_MAX
112f0 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 61 73 73  _COLUMN );.  ass
11300 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
11310 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
11320 52 5f 44 45 50 54 48 5d 3d 3d 53 51 4c 49 54 45  R_DEPTH]==SQLITE
11330 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 20  _MAX_EXPR_DEPTH 
11340 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61  );.  assert( aHa
11350 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c  rdLimit[SQLITE_L
11360 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45  IMIT_COMPOUND_SE
11370 4c 45 43 54 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  LECT]==SQLITE_MA
11380 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
11390 54 29 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48  T);.  assert( aH
113a0 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f  ardLimit[SQLITE_
113b0 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 5d 3d 3d  LIMIT_VDBE_OP]==
113c0 53 51 4c 49 54 45 5f 4d 41 58 5f 56 44 42 45 5f  SQLITE_MAX_VDBE_
113d0 4f 50 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  OP );.  assert( 
113e0 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
113f0 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
11400 5f 41 52 47 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41  _ARG]==SQLITE_MA
11410 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 29  X_FUNCTION_ARG )
11420 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
11430 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
11440 4d 49 54 5f 41 54 54 41 43 48 45 44 5d 3d 3d 53  MIT_ATTACHED]==S
11450 51 4c 49 54 45 5f 4d 41 58 5f 41 54 54 41 43 48  QLITE_MAX_ATTACH
11460 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
11470 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49 54  aHardLimit[SQLIT
11480 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
11490 54 45 52 4e 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20  TERN_LENGTH]==. 
114a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
114d0 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
114e0 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a  TTERN_LENGTH );.
114f0 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c    assert( aHardL
11500 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
11510 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
11520 52 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 56  R]==SQLITE_MAX_V
11530 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b  ARIABLE_NUMBER);
11540 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72 64  .  assert( aHard
11550 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
11560 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48  IT_TRIGGER_DEPTH
11570 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 54 52  ]==SQLITE_MAX_TR
11580 49 47 47 45 52 5f 44 45 50 54 48 20 29 3b 0a 20  IGGER_DEPTH );. 
11590 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
115a0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
115b0 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d  _WORKER_THREADS]
115c0 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52  ==SQLITE_MAX_WOR
115d0 4b 45 52 5f 54 48 52 45 41 44 53 20 29 3b 0a 20  KER_THREADS );. 
115e0 20 61 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f   assert( SQLITE_
115f0 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52  LIMIT_WORKER_THR
11600 45 41 44 53 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f  EADS==(SQLITE_N_
11610 4c 49 4d 49 54 2d 31 29 20 29 3b 0a 0a 0a 20 20  LIMIT-1) );...  
11620 69 66 28 20 6c 69 6d 69 74 49 64 3c 30 20 7c 7c  if( limitId<0 ||
11630 20 6c 69 6d 69 74 49 64 3e 3d 53 51 4c 49 54 45   limitId>=SQLITE
11640 5f 4e 5f 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20  _N_LIMIT ){.    
11650 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20  return -1;.  }. 
11660 20 6f 6c 64 4c 69 6d 69 74 20 3d 20 64 62 2d 3e   oldLimit = db->
11670 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b  aLimit[limitId];
11680 0a 20 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e  .  if( newLimit>
11690 3d 30 20 29 7b 20 20 20 20 20 20 20 20 20 20 20  =0 ){           
116a0 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
116b0 52 2d 35 32 34 37 36 2d 32 38 37 33 32 20 2a 2f  R-52476-28732 */
116c0 0a 20 20 20 20 69 66 28 20 6e 65 77 4c 69 6d 69  .    if( newLimi
116d0 74 3e 61 48 61 72 64 4c 69 6d 69 74 5b 6c 69 6d  t>aHardLimit[lim
116e0 69 74 49 64 5d 20 29 7b 0a 20 20 20 20 20 20 6e  itId] ){.      n
116f0 65 77 4c 69 6d 69 74 20 3d 20 61 48 61 72 64 4c  ewLimit = aHardL
11700 69 6d 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 20 20  imit[limitId];  
11710 2f 2a 20 49 4d 50 3a 20 52 2d 35 31 34 36 33 2d  /* IMP: R-51463-
11720 32 35 36 33 34 20 2a 2f 0a 20 20 20 20 7d 0a 20  25634 */.    }. 
11730 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69     db->aLimit[li
11740 6d 69 74 49 64 5d 20 3d 20 6e 65 77 4c 69 6d 69  mitId] = newLimi
11750 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  t;.  }.  return 
11760 6f 6c 64 4c 69 6d 69 74 3b 20 20 20 20 20 20 20  oldLimit;       
11770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11780 20 49 4d 50 3a 20 52 2d 35 33 33 34 31 2d 33 35   IMP: R-53341-35
11790 34 31 39 20 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  419 */.}../*.** 
117a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
117b0 20 75 73 65 64 20 74 6f 20 70 61 72 73 65 20 62   used to parse b
117c0 6f 74 68 20 55 52 49 73 20 61 6e 64 20 6e 6f 6e  oth URIs and non
117d0 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 73 20 70  -URI filenames p
117e0 61 73 73 65 64 20 62 79 20 74 68 65 0a 2a 2a 20  assed by the.** 
117f0 75 73 65 72 20 74 6f 20 41 50 49 20 66 75 6e 63  user to API func
11800 74 69 6f 6e 73 20 73 71 6c 69 74 65 33 5f 6f 70  tions sqlite3_op
11810 65 6e 28 29 20 6f 72 20 73 71 6c 69 74 65 33 5f  en() or sqlite3_
11820 6f 70 65 6e 5f 76 32 28 29 2c 20 61 6e 64 20 66  open_v2(), and f
11830 6f 72 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 55  or database.** U
11840 52 49 73 20 73 70 65 63 69 66 69 65 64 20 61 73  RIs specified as
11850 20 70 61 72 74 20 6f 66 20 41 54 54 41 43 48 20   part of ATTACH 
11860 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a  statements..**.*
11870 2a 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  * The first argu
11880 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e  ment to this fun
11890 63 74 69 6f 6e 20 69 73 20 74 68 65 20 6e 61 6d  ction is the nam
118a0 65 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20  e of the VFS to 
118b0 75 73 65 20 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c  use (or.** a NUL
118c0 4c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 65  L to signify the
118d0 20 64 65 66 61 75 6c 74 20 56 46 53 29 20 69 66   default VFS) if
118e0 20 74 68 65 20 55 52 49 20 64 6f 65 73 20 6e 6f   the URI does no
118f0 74 20 63 6f 6e 74 61 69 6e 20 61 20 22 76 66 73  t contain a "vfs
11900 3d 78 78 78 22 0a 2a 2a 20 71 75 65 72 79 20 70  =xxx".** query p
11910 61 72 61 6d 65 74 65 72 2e 20 54 68 65 20 73 65  arameter. The se
11920 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 63 6f  cond argument co
11930 6e 74 61 69 6e 73 20 74 68 65 20 55 52 49 20 28  ntains the URI (
11940 6f 72 20 6e 6f 6e 2d 55 52 49 20 66 69 6c 65 6e  or non-URI filen
11950 61 6d 65 29 0a 2a 2a 20 69 74 73 65 6c 66 2e 20  ame).** itself. 
11960 57 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  When this functi
11970 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  on is called the
11980 20 2a 70 46 6c 61 67 73 20 76 61 72 69 61 62 6c   *pFlags variabl
11990 65 20 73 68 6f 75 6c 64 20 63 6f 6e 74 61 69 6e  e should contain
119a0 0a 2a 2a 20 74 68 65 20 64 65 66 61 75 6c 74 20  .** the default 
119b0 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 74 68  flags to open th
119c0 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
119d0 65 20 77 69 74 68 2e 20 54 68 65 20 76 61 6c 75  e with. The valu
119e0 65 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a  e stored in.** *
119f0 70 46 6c 61 67 73 20 6d 61 79 20 62 65 20 75 70  pFlags may be up
11a00 64 61 74 65 64 20 62 65 66 6f 72 65 20 72 65 74  dated before ret
11a10 75 72 6e 69 6e 67 20 69 66 20 74 68 65 20 55 52  urning if the UR
11a20 49 20 66 69 6c 65 6e 61 6d 65 20 63 6f 6e 74 61  I filename conta
11a30 69 6e 73 20 0a 2a 2a 20 22 63 61 63 68 65 3d 78  ins .** "cache=x
11a40 78 78 22 20 6f 72 20 22 6d 6f 64 65 3d 78 78 78  xx" or "mode=xxx
11a50 22 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  " query paramete
11a60 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  rs..**.** If suc
11a70 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
11a80 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
11a90 49 6e 20 74 68 69 73 20 63 61 73 65 20 2a 70 70  In this case *pp
11aa0 56 66 73 20 69 73 20 73 65 74 20 74 6f 20 70 6f  Vfs is set to po
11ab0 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 56 46  int to.** the VF
11ac0 53 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  S that should be
11ad0 20 75 73 65 64 20 74 6f 20 6f 70 65 6e 20 74 68   used to open th
11ae0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
11af0 20 2a 70 7a 46 69 6c 65 20 69 73 20 73 65 74 20   *pzFile is set 
11b00 74 6f 0a 2a 2a 20 70 6f 69 6e 74 20 74 6f 20 61  to.** point to a
11b10 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69   buffer containi
11b20 6e 67 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  ng the name of t
11b30 68 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  he file to open.
11b40 20 49 74 20 69 73 20 74 68 65 20 0a 2a 2a 20 72   It is the .** r
11b50 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
11b60 20 74 68 65 20 63 61 6c 6c 65 72 20 74 6f 20 65   the caller to e
11b70 76 65 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 20 73  ventually call s
11b80 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 74 6f  qlite3_free() to
11b90 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
11ba0 20 62 75 66 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49   buffer..**.** I
11bb0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
11bc0 73 2c 20 74 68 65 6e 20 61 6e 20 53 51 4c 69 74  s, then an SQLit
11bd0 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  e error code is 
11be0 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 7a  returned and *pz
11bf0 45 72 72 4d 73 67 0a 2a 2a 20 6d 61 79 20 62 65  ErrMsg.** may be
11c00 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
11c10 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
11c20 6e 69 6e 67 20 61 6e 20 45 6e 67 6c 69 73 68 20  ning an English 
11c30 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 0a  language error .
11c40 2a 2a 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  ** message. It i
11c50 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
11c60 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
11c70 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79  er to eventually
11c80 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 69 73   release.** this
11c90 20 62 75 66 66 65 72 20 62 79 20 63 61 6c 6c 69   buffer by calli
11ca0 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
11cb0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
11cc0 33 50 61 72 73 65 55 72 69 28 0a 20 20 63 6f 6e  3ParseUri(.  con
11cd0 73 74 20 63 68 61 72 20 2a 7a 44 65 66 61 75 6c  st char *zDefaul
11ce0 74 56 66 73 2c 20 20 20 20 20 20 20 20 2f 2a 20  tVfs,        /* 
11cf0 56 46 53 20 74 6f 20 75 73 65 20 69 66 20 6e 6f  VFS to use if no
11d00 20 22 76 66 73 3d 78 78 78 22 20 71 75 65 72 79   "vfs=xxx" query
11d10 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e   option */.  con
11d20 73 74 20 63 68 61 72 20 2a 7a 55 72 69 2c 20 20  st char *zUri,  
11d30 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11d40 4e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 55  Nul-terminated U
11d50 52 49 20 74 6f 20 70 61 72 73 65 20 2a 2f 0a 20  RI to parse */. 
11d60 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 2a 70   unsigned int *p
11d70 46 6c 61 67 73 2c 20 20 20 20 20 20 20 20 20 20  Flags,          
11d80 20 2f 2a 20 49 4e 2f 4f 55 54 3a 20 53 51 4c 49   /* IN/OUT: SQLI
11d90 54 45 5f 4f 50 45 4e 5f 58 58 58 20 66 6c 61 67  TE_OPEN_XXX flag
11da0 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  s */.  sqlite3_v
11db0 66 73 20 2a 2a 70 70 56 66 73 2c 20 20 20 20 20  fs **ppVfs,     
11dc0 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
11dd0 46 53 20 74 6f 20 75 73 65 20 2a 2f 20 0a 20 20  FS to use */ .  
11de0 63 68 61 72 20 2a 2a 70 7a 46 69 6c 65 2c 20 20  char **pzFile,  
11df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e00 2f 2a 20 4f 55 54 3a 20 46 69 6c 65 6e 61 6d 65  /* OUT: Filename
11e10 20 63 6f 6d 70 6f 6e 65 6e 74 20 6f 66 20 55 52   component of UR
11e20 49 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  I */.  char **pz
11e30 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
11e40 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 45         /* OUT: E
11e50 72 72 6f 72 20 6d 65 73 73 61 67 65 20 28 69 66  rror message (if
11e60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 20   rc!=SQLITE_OK) 
11e70 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  */.){.  int rc =
11e80 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e   SQLITE_OK;.  un
11e90 73 69 67 6e 65 64 20 69 6e 74 20 66 6c 61 67 73  signed int flags
11ea0 20 3d 20 2a 70 46 6c 61 67 73 3b 0a 20 20 63 6f   = *pFlags;.  co
11eb0 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 20 3d  nst char *zVfs =
11ec0 20 7a 44 65 66 61 75 6c 74 56 66 73 3b 0a 20 20   zDefaultVfs;.  
11ed0 63 68 61 72 20 2a 7a 46 69 6c 65 3b 0a 20 20 63  char *zFile;.  c
11ee0 68 61 72 20 63 3b 0a 20 20 69 6e 74 20 6e 55 72  har c;.  int nUr
11ef0 69 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65  i = sqlite3Strle
11f00 6e 33 30 28 7a 55 72 69 29 3b 0a 0a 20 20 61 73  n30(zUri);..  as
11f10 73 65 72 74 28 20 2a 70 7a 45 72 72 4d 73 67 3d  sert( *pzErrMsg=
11f20 3d 30 20 29 3b 0a 0a 20 20 69 66 28 20 28 28 66  =0 );..  if( ((f
11f30 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
11f40 45 4e 5f 55 52 49 29 20 7c 7c 20 73 71 6c 69 74  EN_URI) || sqlit
11f50 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62  e3GlobalConfig.b
11f60 4f 70 65 6e 55 72 69 29 20 0a 20 20 20 26 26 20  OpenUri) .   && 
11f70 6e 55 72 69 3e 3d 35 20 26 26 20 6d 65 6d 63 6d  nUri>=5 && memcm
11f80 70 28 7a 55 72 69 2c 20 22 66 69 6c 65 3a 22 2c  p(zUri, "file:",
11f90 20 35 29 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20   5)==0 .  ){.   
11fa0 20 63 68 61 72 20 2a 7a 4f 70 74 3b 0a 20 20 20   char *zOpt;.   
11fb0 20 69 6e 74 20 65 53 74 61 74 65 3b 20 20 20 20   int eState;    
11fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11fd0 2a 20 50 61 72 73 65 72 20 73 74 61 74 65 20 77  * Parser state w
11fe0 68 65 6e 20 70 61 72 73 69 6e 67 20 55 52 49 20  hen parsing URI 
11ff0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 49 6e 3b 20  */.    int iIn; 
12000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12010 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 20 63 68       /* Input ch
12020 61 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f  aracter index */
12030 0a 20 20 20 20 69 6e 74 20 69 4f 75 74 20 3d 20  .    int iOut = 
12040 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
12050 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 63 68 61     /* Output cha
12060 72 61 63 74 65 72 20 69 6e 64 65 78 20 2a 2f 0a  racter index */.
12070 20 20 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20      int nByte = 
12080 6e 55 72 69 2b 32 3b 20 20 20 20 20 20 20 20 20  nUri+2;         
12090 20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 73 70    /* Bytes of sp
120a0 61 63 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  ace to allocate 
120b0 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d 61 6b 65 20  */..    /* Make 
120c0 73 75 72 65 20 74 68 65 20 53 51 4c 49 54 45 5f  sure the SQLITE_
120d0 4f 50 45 4e 5f 55 52 49 20 66 6c 61 67 20 69 73  OPEN_URI flag is
120e0 20 73 65 74 20 74 6f 20 69 6e 64 69 63 61 74 65   set to indicate
120f0 20 74 6f 20 74 68 65 20 56 46 53 20 78 4f 70 65   to the VFS xOpe
12100 6e 20 0a 20 20 20 20 2a 2a 20 6d 65 74 68 6f 64  n .    ** method
12110 20 74 68 61 74 20 74 68 65 72 65 20 6d 61 79 20   that there may 
12120 62 65 20 65 78 74 72 61 20 70 61 72 61 6d 65 74  be extra paramet
12130 65 72 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ers following th
12140 65 20 66 69 6c 65 2d 6e 61 6d 65 2e 20 20 2a 2f  e file-name.  */
12150 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 53 51  .    flags |= SQ
12160 4c 49 54 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 0a  LITE_OPEN_URI;..
12170 20 20 20 20 66 6f 72 28 69 49 6e 3d 30 3b 20 69      for(iIn=0; i
12180 49 6e 3c 6e 55 72 69 3b 20 69 49 6e 2b 2b 29 20  In<nUri; iIn++) 
12190 6e 42 79 74 65 20 2b 3d 20 28 7a 55 72 69 5b 69  nByte += (zUri[i
121a0 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20 20 20 20 7a  In]=='&');.    z
121b0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
121c0 61 6c 6c 6f 63 28 6e 42 79 74 65 29 3b 0a 20 20  alloc(nByte);.  
121d0 20 20 69 66 28 20 21 7a 46 69 6c 65 20 29 20 72    if( !zFile ) r
121e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
121f0 45 4d 3b 0a 0a 20 20 20 20 69 49 6e 20 3d 20 35  EM;..    iIn = 5
12200 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
12210 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41 55 54 48 4f  _ALLOW_URI_AUTHO
12220 52 49 54 59 0a 20 20 20 20 2f 2a 20 44 69 73 63  RITY.    /* Disc
12230 61 72 64 20 74 68 65 20 73 63 68 65 6d 65 20 61  ard the scheme a
12240 6e 64 20 61 75 74 68 6f 72 69 74 79 20 73 65 67  nd authority seg
12250 6d 65 6e 74 73 20 6f 66 20 74 68 65 20 55 52 49  ments of the URI
12260 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 55 72  . */.    if( zUr
12270 69 5b 35 5d 3d 3d 27 2f 27 20 26 26 20 7a 55 72  i[5]=='/' && zUr
12280 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b 0a 20 20 20  i[6]=='/' ){.   
12290 20 20 20 69 49 6e 20 3d 20 37 3b 0a 20 20 20 20     iIn = 7;.    
122a0 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
122b0 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
122c0 3d 27 2f 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20  ='/' ) iIn++;.  
122d0 20 20 20 20 69 66 28 20 69 49 6e 21 3d 37 20 26      if( iIn!=7 &
122e0 26 20 28 69 49 6e 21 3d 31 36 20 7c 7c 20 6d 65  & (iIn!=16 || me
122f0 6d 63 6d 70 28 22 6c 6f 63 61 6c 68 6f 73 74 22  mcmp("localhost"
12300 2c 20 26 7a 55 72 69 5b 37 5d 2c 20 39 29 29 20  , &zUri[7], 9)) 
12310 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
12320 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
12330 70 72 69 6e 74 66 28 22 69 6e 76 61 6c 69 64 20  printf("invalid 
12340 75 72 69 20 61 75 74 68 6f 72 69 74 79 3a 20 25  uri authority: %
12350 2e 2a 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20  .*s", .         
12360 20 20 20 69 49 6e 2d 37 2c 20 26 7a 55 72 69 5b     iIn-7, &zUri[
12370 37 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  7]);.        rc 
12380 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
12390 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61 72          goto par
123a0 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20  se_uri_out;.    
123b0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
123c0 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68  ..    /* Copy th
123d0 65 20 66 69 6c 65 6e 61 6d 65 20 61 6e 64 20 61  e filename and a
123e0 6e 79 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ny query paramet
123f0 65 72 73 20 69 6e 74 6f 20 74 68 65 20 7a 46 69  ers into the zFi
12400 6c 65 20 62 75 66 66 65 72 2e 20 0a 20 20 20 20  le buffer. .    
12410 2a 2a 20 44 65 63 6f 64 65 20 25 48 48 20 65 73  ** Decode %HH es
12420 63 61 70 65 20 63 6f 64 65 73 20 61 6c 6f 6e 67  cape codes along
12430 20 74 68 65 20 77 61 79 2e 20 0a 20 20 20 20 2a   the way. .    *
12440 2a 0a 20 20 20 20 2a 2a 20 57 69 74 68 69 6e 20  *.    ** Within 
12450 74 68 69 73 20 6c 6f 6f 70 2c 20 76 61 72 69 61  this loop, varia
12460 62 6c 65 20 65 53 74 61 74 65 20 6d 61 79 20 62  ble eState may b
12470 65 20 73 65 74 20 74 6f 20 30 2c 20 31 20 6f 72  e set to 0, 1 or
12480 20 32 2c 20 64 65 70 65 6e 64 69 6e 67 0a 20 20   2, depending.  
12490 20 20 2a 2a 20 6f 6e 20 74 68 65 20 70 61 72 73    ** on the pars
124a0 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 41 73 20  ing context. As 
124b0 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 0a  follows:.    **.
124c0 20 20 20 20 2a 2a 20 20 20 30 3a 20 50 61 72 73      **   0: Pars
124d0 69 6e 67 20 66 69 6c 65 2d 6e 61 6d 65 2e 0a 20  ing file-name.. 
124e0 20 20 20 2a 2a 20 20 20 31 3a 20 50 61 72 73 69     **   1: Parsi
124f0 6e 67 20 6e 61 6d 65 20 73 65 63 74 69 6f 6e 20  ng name section 
12500 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c 75 65 20  of a name=value 
12510 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
12520 0a 20 20 20 20 2a 2a 20 20 20 32 3a 20 50 61 72  .    **   2: Par
12530 73 69 6e 67 20 76 61 6c 75 65 20 73 65 63 74 69  sing value secti
12540 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61 6c  on of a name=val
12550 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74  ue query paramet
12560 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 65  er..    */.    e
12570 53 74 61 74 65 20 3d 20 30 3b 0a 20 20 20 20 77  State = 0;.    w
12580 68 69 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b  hile( (c = zUri[
12590 69 49 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  iIn])!=0 && c!='
125a0 23 27 20 29 7b 0a 20 20 20 20 20 20 69 49 6e 2b  #' ){.      iIn+
125b0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  +;.      if( c==
125c0 27 25 27 20 0a 20 20 20 20 20 20 20 26 26 20 73  '%' .       && s
125d0 71 6c 69 74 65 33 49 73 78 64 69 67 69 74 28 7a  qlite3Isxdigit(z
125e0 55 72 69 5b 69 49 6e 5d 29 20 0a 20 20 20 20 20  Uri[iIn]) .     
125f0 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 78 64    && sqlite3Isxd
12600 69 67 69 74 28 7a 55 72 69 5b 69 49 6e 2b 31 5d  igit(zUri[iIn+1]
12610 29 20 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  ) .      ){.    
12620 20 20 20 20 69 6e 74 20 6f 63 74 65 74 20 3d 20      int octet = 
12630 28 73 71 6c 69 74 65 33 48 65 78 54 6f 49 6e 74  (sqlite3HexToInt
12640 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d 29 20 3c 3c  (zUri[iIn++]) <<
12650 20 34 29 3b 0a 20 20 20 20 20 20 20 20 6f 63 74   4);.        oct
12660 65 74 20 2b 3d 20 73 71 6c 69 74 65 33 48 65 78  et += sqlite3Hex
12670 54 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b  ToInt(zUri[iIn++
12680 5d 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73 73  ]);..        ass
12690 65 72 74 28 20 6f 63 74 65 74 3e 3d 30 20 26 26  ert( octet>=0 &&
126a0 20 6f 63 74 65 74 3c 32 35 36 20 29 3b 0a 20 20   octet<256 );.  
126b0 20 20 20 20 20 20 69 66 28 20 6f 63 74 65 74 3d        if( octet=
126c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
126d0 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20 69  /* This branch i
126e0 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 22 25 30  s taken when "%0
126f0 30 22 20 61 70 70 65 61 72 73 20 77 69 74 68 69  0" appears withi
12700 6e 20 74 68 65 20 55 52 49 2e 20 49 6e 20 74 68  n the URI. In th
12710 69 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  is.          ** 
12720 63 61 73 65 20 77 65 20 69 67 6e 6f 72 65 20 61  case we ignore a
12730 6c 6c 20 74 65 78 74 20 69 6e 20 74 68 65 20 72  ll text in the r
12740 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
12750 70 61 74 68 2c 20 6e 61 6d 65 20 6f 72 0a 20 20  path, name or.  
12760 20 20 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65          ** value
12770 20 63 75 72 72 65 6e 74 6c 79 20 62 65 69 6e 67   currently being
12780 20 70 61 72 73 65 64 2e 20 53 6f 20 69 67 6e 6f   parsed. So igno
12790 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
127a0 68 61 72 61 63 74 65 72 0a 20 20 20 20 20 20 20  haracter.       
127b0 20 20 20 2a 2a 20 61 6e 64 20 73 6b 69 70 20 74     ** and skip t
127c0 6f 20 74 68 65 20 6e 65 78 74 20 22 3f 22 2c 20  o the next "?", 
127d0 22 3d 22 20 6f 72 20 22 26 22 2c 20 61 73 20 61  "=" or "&", as a
127e0 70 70 72 6f 70 72 69 61 74 65 2e 20 2a 2f 0a 20  ppropriate. */. 
127f0 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
12800 28 63 20 3d 20 7a 55 72 69 5b 69 49 6e 5d 29 21  (c = zUri[iIn])!
12810 3d 30 20 26 26 20 63 21 3d 27 23 27 20 0a 20 20  =0 && c!='#' .  
12820 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28              && (
12830 65 53 74 61 74 65 21 3d 30 20 7c 7c 20 63 21 3d  eState!=0 || c!=
12840 27 3f 27 29 0a 20 20 20 20 20 20 20 20 20 20 20  '?').           
12850 20 20 20 26 26 20 28 65 53 74 61 74 65 21 3d 31     && (eState!=1
12860 20 7c 7c 20 28 63 21 3d 27 3d 27 20 26 26 20 63   || (c!='=' && c
12870 21 3d 27 26 27 29 29 0a 20 20 20 20 20 20 20 20  !='&')).        
12880 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74 65        && (eState
12890 21 3d 32 20 7c 7c 20 63 21 3d 27 26 27 29 0a 20  !=2 || c!='&'). 
128a0 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
128b0 20 20 20 20 20 20 20 20 69 49 6e 2b 2b 3b 0a 20          iIn++;. 
128c0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
128d0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
128e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
128f0 20 63 20 3d 20 6f 63 74 65 74 3b 0a 20 20 20 20   c = octet;.    
12900 20 20 7d 65 6c 73 65 20 69 66 28 20 65 53 74 61    }else if( eSta
12910 74 65 3d 3d 31 20 26 26 20 28 63 3d 3d 27 26 27  te==1 && (c=='&'
12920 20 7c 7c 20 63 3d 3d 27 3d 27 29 20 29 7b 0a 20   || c=='=') ){. 
12930 20 20 20 20 20 20 20 69 66 28 20 7a 46 69 6c 65         if( zFile
12940 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20 29 7b 0a 20  [iOut-1]==0 ){. 
12950 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
12960 6d 70 74 79 20 6f 70 74 69 6f 6e 20 6e 61 6d 65  mpty option name
12970 2e 20 49 67 6e 6f 72 65 20 74 68 69 73 20 6f 70  . Ignore this op
12980 74 69 6f 6e 20 61 6c 74 6f 67 65 74 68 65 72 2e  tion altogether.
12990 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68   */.          wh
129a0 69 6c 65 28 20 7a 55 72 69 5b 69 49 6e 5d 20 26  ile( zUri[iIn] &
129b0 26 20 7a 55 72 69 5b 69 49 6e 5d 21 3d 27 23 27  & zUri[iIn]!='#'
129c0 20 26 26 20 7a 55 72 69 5b 69 49 6e 2d 31 5d 21   && zUri[iIn-1]!
129d0 3d 27 26 27 20 29 20 69 49 6e 2b 2b 3b 0a 20 20  ='&' ) iIn++;.  
129e0 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
129f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
12a00 20 20 20 20 69 66 28 20 63 3d 3d 27 26 27 20 29      if( c=='&' )
12a10 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 46 69 6c  {.          zFil
12a20 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27  e[iOut++] = '\0'
12a30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
12a40 0a 20 20 20 20 20 20 20 20 20 20 65 53 74 61 74  .          eStat
12a50 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 7d  e = 2;.        }
12a60 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b 0a  .        c = 0;.
12a70 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12a80 28 65 53 74 61 74 65 3d 3d 30 20 26 26 20 63 3d  (eState==0 && c=
12a90 3d 27 3f 27 29 20 7c 7c 20 28 65 53 74 61 74 65  ='?') || (eState
12aa0 3d 3d 32 20 26 26 20 63 3d 3d 27 26 27 29 20 29  ==2 && c=='&') )
12ab0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 30 3b  {.        c = 0;
12ac0 0a 20 20 20 20 20 20 20 20 65 53 74 61 74 65 20  .        eState 
12ad0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
12ae0 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d     zFile[iOut++]
12af0 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = c;.    }.    
12b00 69 66 28 20 65 53 74 61 74 65 3d 3d 31 20 29 20  if( eState==1 ) 
12b10 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
12b20 27 5c 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b  '\0';.    zFile[
12b30 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a  iOut++] = '\0';.
12b40 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b      zFile[iOut++
12b50 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f  ] = '\0';..    /
12b60 2a 20 43 68 65 63 6b 20 69 66 20 74 68 65 72 65  * Check if there
12b70 20 77 65 72 65 20 61 6e 79 20 6f 70 74 69 6f 6e   were any option
12b80 73 20 73 70 65 63 69 66 69 65 64 20 74 68 61 74  s specified that
12b90 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 74 65 72   should be inter
12ba0 70 72 65 74 65 64 20 0a 20 20 20 20 2a 2a 20 68  preted .    ** h
12bb0 65 72 65 2e 20 4f 70 74 69 6f 6e 73 20 74 68 61  ere. Options tha
12bc0 74 20 61 72 65 20 69 6e 74 65 72 70 72 65 74 65  t are interprete
12bd0 64 20 68 65 72 65 20 69 6e 63 6c 75 64 65 20 22  d here include "
12be0 76 66 73 22 20 61 6e 64 20 74 68 6f 73 65 20 74  vfs" and those t
12bf0 68 61 74 0a 20 20 20 20 2a 2a 20 63 6f 72 72 65  hat.    ** corre
12c00 73 70 6f 6e 64 20 74 6f 20 66 6c 61 67 73 20 74  spond to flags t
12c10 68 61 74 20 6d 61 79 20 62 65 20 70 61 73 73 65  hat may be passe
12c20 64 20 74 6f 20 74 68 65 20 73 71 6c 69 74 65 33  d to the sqlite3
12c30 5f 6f 70 65 6e 5f 76 32 28 29 0a 20 20 20 20 2a  _open_v2().    *
12c40 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f 0a 20 20 20  * method. */.   
12c50 20 7a 4f 70 74 20 3d 20 26 7a 46 69 6c 65 5b 73   zOpt = &zFile[s
12c60 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12c70 46 69 6c 65 29 2b 31 5d 3b 0a 20 20 20 20 77 68  File)+1];.    wh
12c80 69 6c 65 28 20 7a 4f 70 74 5b 30 5d 20 29 7b 0a  ile( zOpt[0] ){.
12c90 20 20 20 20 20 20 69 6e 74 20 6e 4f 70 74 20 3d        int nOpt =
12ca0 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30   sqlite3Strlen30
12cb0 28 7a 4f 70 74 29 3b 0a 20 20 20 20 20 20 63 68  (zOpt);.      ch
12cc0 61 72 20 2a 7a 56 61 6c 20 3d 20 26 7a 4f 70 74  ar *zVal = &zOpt
12cd0 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20 20 20 20 20  [nOpt+1];.      
12ce0 69 6e 74 20 6e 56 61 6c 20 3d 20 73 71 6c 69 74  int nVal = sqlit
12cf0 65 33 53 74 72 6c 65 6e 33 30 28 7a 56 61 6c 29  e3Strlen30(zVal)
12d00 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 6e 4f 70  ;..      if( nOp
12d10 74 3d 3d 33 20 26 26 20 6d 65 6d 63 6d 70 28 22  t==3 && memcmp("
12d20 76 66 73 22 2c 20 7a 4f 70 74 2c 20 33 29 3d 3d  vfs", zOpt, 3)==
12d30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 56 66  0 ){.        zVf
12d40 73 20 3d 20 7a 56 61 6c 3b 0a 20 20 20 20 20 20  s = zVal;.      
12d50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
12d60 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 7b  truct OpenMode {
12d70 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
12d80 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20 20   char *z;.      
12d90 20 20 20 20 69 6e 74 20 6d 6f 64 65 3b 0a 20 20      int mode;.  
12da0 20 20 20 20 20 20 7d 20 2a 61 4d 6f 64 65 20 3d        } *aMode =
12db0 20 30 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   0;.        char
12dc0 20 2a 7a 4d 6f 64 65 54 79 70 65 20 3d 20 30 3b   *zModeType = 0;
12dd0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6d 61 73  .        int mas
12de0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  k = 0;.        i
12df0 6e 74 20 6c 69 6d 69 74 20 3d 20 30 3b 0a 0a 20  nt limit = 0;.. 
12e00 20 20 20 20 20 20 20 69 66 28 20 6e 4f 70 74 3d         if( nOpt=
12e10 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 22 63 61  =5 && memcmp("ca
12e20 63 68 65 22 2c 20 7a 4f 70 74 2c 20 35 29 3d 3d  che", zOpt, 5)==
12e30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
12e40 74 61 74 69 63 20 73 74 72 75 63 74 20 4f 70 65  tatic struct Ope
12e50 6e 4d 6f 64 65 20 61 43 61 63 68 65 4d 6f 64 65  nMode aCacheMode
12e60 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20  [] = {.         
12e70 20 20 20 7b 20 22 73 68 61 72 65 64 22 2c 20 20     { "shared",  
12e80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52  SQLITE_OPEN_SHAR
12e90 45 44 43 41 43 48 45 20 7d 2c 0a 20 20 20 20 20  EDCACHE },.     
12ea0 20 20 20 20 20 20 20 7b 20 22 70 72 69 76 61 74         { "privat
12eb0 65 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  e", SQLITE_OPEN_
12ec0 50 52 49 56 41 54 45 43 41 43 48 45 20 7d 2c 0a  PRIVATECACHE },.
12ed0 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 30 2c              { 0,
12ee0 20 30 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d   0 }.          }
12ef0 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 6d 61 73  ;..          mas
12f00 6b 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  k = SQLITE_OPEN_
12f10 53 48 41 52 45 44 43 41 43 48 45 7c 53 51 4c 49  SHAREDCACHE|SQLI
12f20 54 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43  TE_OPEN_PRIVATEC
12f30 41 43 48 45 3b 0a 20 20 20 20 20 20 20 20 20 20  ACHE;.          
12f40 61 4d 6f 64 65 20 3d 20 61 43 61 63 68 65 4d 6f  aMode = aCacheMo
12f50 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69  de;.          li
12f60 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a 20 20 20 20  mit = mask;.    
12f70 20 20 20 20 20 20 7a 4d 6f 64 65 54 79 70 65 20        zModeType 
12f80 3d 20 22 63 61 63 68 65 22 3b 0a 20 20 20 20 20  = "cache";.     
12f90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
12fa0 20 6e 4f 70 74 3d 3d 34 20 26 26 20 6d 65 6d 63   nOpt==4 && memc
12fb0 6d 70 28 22 6d 6f 64 65 22 2c 20 7a 4f 70 74 2c  mp("mode", zOpt,
12fc0 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   4)==0 ){.      
12fd0 20 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63      static struc
12fe0 74 20 4f 70 65 6e 4d 6f 64 65 20 61 4f 70 65 6e  t OpenMode aOpen
12ff0 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
13000 20 20 20 20 20 20 20 7b 20 22 72 6f 22 2c 20 20         { "ro",  
13010 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
13020 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20 20 20 20 20  ONLY },.        
13030 20 20 20 20 7b 20 22 72 77 22 2c 20 20 53 51 4c      { "rw",  SQL
13040 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
13050 54 45 20 7d 2c 20 0a 20 20 20 20 20 20 20 20 20  TE }, .         
13060 20 20 20 7b 20 22 72 77 63 22 2c 20 53 51 4c 49     { "rwc", SQLI
13070 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
13080 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
13090 43 52 45 41 54 45 20 7d 2c 0a 20 20 20 20 20 20  CREATE },.      
130a0 20 20 20 20 20 20 7b 20 22 6d 65 6d 6f 72 79 22        { "memory"
130b0 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45  , SQLITE_OPEN_ME
130c0 4d 4f 52 59 20 7d 2c 0a 20 20 20 20 20 20 20 20  MORY },.        
130d0 20 20 20 20 7b 20 30 2c 20 30 20 7d 0a 20 20 20      { 0, 0 }.   
130e0 20 20 20 20 20 20 20 7d 3b 0a 0a 20 20 20 20 20         };..     
130f0 20 20 20 20 20 6d 61 73 6b 20 3d 20 53 51 4c 49       mask = SQLI
13100 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
13110 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52   | SQLITE_OPEN_R
13120 45 41 44 57 52 49 54 45 0a 20 20 20 20 20 20 20  EADWRITE.       
13130 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
13140 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
13150 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d   | SQLITE_OPEN_M
13160 45 4d 4f 52 59 3b 0a 20 20 20 20 20 20 20 20 20  EMORY;.         
13170 20 61 4d 6f 64 65 20 3d 20 61 4f 70 65 6e 4d 6f   aMode = aOpenMo
13180 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 69  de;.          li
13190 6d 69 74 20 3d 20 6d 61 73 6b 20 26 20 66 6c 61  mit = mask & fla
131a0 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 4d  gs;.          zM
131b0 6f 64 65 54 79 70 65 20 3d 20 22 61 63 63 65 73  odeType = "acces
131c0 73 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  s";.        }.. 
131d0 20 20 20 20 20 20 20 69 66 28 20 61 4d 6f 64 65         if( aMode
131e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
131f0 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t i;.          i
13200 6e 74 20 6d 6f 64 65 20 3d 20 30 3b 0a 20 20 20  nt mode = 0;.   
13210 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
13220 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20 69 2b 2b 29  aMode[i].z; i++)
13230 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
13240 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 4d  nst char *z = aM
13250 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20 20 20 20 20  ode[i].z;.      
13260 20 20 20 20 20 20 69 66 28 20 6e 56 61 6c 3d 3d        if( nVal==
13270 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
13280 7a 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28  z) && 0==memcmp(
13290 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61 6c 29 20 29  zVal, z, nVal) )
132a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
132b0 6d 6f 64 65 20 3d 20 61 4d 6f 64 65 5b 69 5d 2e  mode = aMode[i].
132c0 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20  mode;.          
132d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
132e0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
132f0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
13300 66 28 20 6d 6f 64 65 3d 3d 30 20 29 7b 0a 20 20  f( mode==0 ){.  
13310 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
13320 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
13330 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20 25  rintf("no such %
13340 73 20 6d 6f 64 65 3a 20 25 73 22 2c 20 7a 4d 6f  s mode: %s", zMo
13350 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20  deType, zVal);. 
13360 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
13370 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
13380 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70            goto p
13390 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20  arse_uri_out;.  
133a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
133b0 20 20 20 20 69 66 28 20 28 6d 6f 64 65 20 26 20      if( (mode & 
133c0 7e 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 45 4d  ~SQLITE_OPEN_MEM
133d0 4f 52 59 29 3e 6c 69 6d 69 74 20 29 7b 0a 20 20  ORY)>limit ){.  
133e0 20 20 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72            *pzErr
133f0 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Msg = sqlite3_mp
13400 72 69 6e 74 66 28 22 25 73 20 6d 6f 64 65 20 6e  rintf("%s mode n
13410 6f 74 20 61 6c 6c 6f 77 65 64 3a 20 25 73 22 2c  ot allowed: %s",
13420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13440 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54 79           zModeTy
13450 70 65 2c 20 7a 56 61 6c 29 3b 0a 20 20 20 20 20  pe, zVal);.     
13460 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
13470 54 45 5f 50 45 52 4d 3b 0a 20 20 20 20 20 20 20  TE_PERM;.       
13480 20 20 20 20 20 67 6f 74 6f 20 70 61 72 73 65 5f       goto parse_
13490 75 72 69 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  uri_out;.       
134a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 66     }.          f
134b0 6c 61 67 73 20 3d 20 28 66 6c 61 67 73 20 26 20  lags = (flags & 
134c0 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64 65 3b 0a 20  ~mask) | mode;. 
134d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
134e0 0a 0a 20 20 20 20 20 20 7a 4f 70 74 20 3d 20 26  ..      zOpt = &
134f0 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d 3b 0a 20 20  zVal[nVal+1];.  
13500 20 20 7d 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20 20    }..  }else{.  
13510 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74 65    zFile = sqlite
13520 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72 69 2b 32 29  3_malloc(nUri+2)
13530 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65  ;.    if( !zFile
13540 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
13550 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 6d 65 6d 63  _NOMEM;.    memc
13560 70 79 28 7a 46 69 6c 65 2c 20 7a 55 72 69 2c 20  py(zFile, zUri, 
13570 6e 55 72 69 29 3b 0a 20 20 20 20 7a 46 69 6c 65  nUri);.    zFile
13580 5b 6e 55 72 69 5d 20 3d 20 27 5c 30 27 3b 0a 20  [nUri] = '\0';. 
13590 20 20 20 7a 46 69 6c 65 5b 6e 55 72 69 2b 31 5d     zFile[nUri+1]
135a0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 66 6c 61   = '\0';.    fla
135b0 67 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50  gs &= ~SQLITE_OP
135c0 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a 0a 20 20 2a  EN_URI;.  }..  *
135d0 70 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f  ppVfs = sqlite3_
135e0 76 66 73 5f 66 69 6e 64 28 7a 56 66 73 29 3b 0a  vfs_find(zVfs);.
135f0 20 20 69 66 28 20 2a 70 70 56 66 73 3d 3d 30 20    if( *ppVfs==0 
13600 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67  ){.    *pzErrMsg
13610 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
13620 74 66 28 22 6e 6f 20 73 75 63 68 20 76 66 73 3a  tf("no such vfs:
13630 20 25 73 22 2c 20 7a 56 66 73 29 3b 0a 20 20 20   %s", zVfs);.   
13640 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
13650 4f 52 3b 0a 20 20 7d 0a 20 70 61 72 73 65 5f 75  OR;.  }. parse_u
13660 72 69 5f 6f 75 74 3a 0a 20 20 69 66 28 20 72 63  ri_out:.  if( rc
13670 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13680 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13690 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7a 46 69 6c  zFile);.    zFil
136a0 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 2a 70 46  e = 0;.  }.  *pF
136b0 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
136c0 2a 70 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b  *pzFile = zFile;
136d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
136e0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
136f0 74 69 6e 65 20 64 6f 65 73 20 74 68 65 20 77 6f  tine does the wo
13700 72 6b 20 6f 66 20 6f 70 65 6e 69 6e 67 20 61 20  rk of opening a 
13710 64 61 74 61 62 61 73 65 20 6f 6e 20 62 65 68 61  database on beha
13720 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c 69 74 65 33  lf of.** sqlite3
13730 5f 6f 70 65 6e 28 29 20 61 6e 64 20 73 71 6c 69  _open() and sqli
13740 74 65 33 5f 6f 70 65 6e 31 36 28 29 2e 20 54 68  te3_open16(). Th
13750 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 6e  e database filen
13760 61 6d 65 20 22 7a 46 69 6c 65 6e 61 6d 65 22 20  ame "zFilename" 
13770 20 0a 2a 2a 20 69 73 20 55 54 46 2d 38 20 65 6e   .** is UTF-8 en
13780 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  coded..*/.static
13790 20 69 6e 74 20 6f 70 65 6e 44 61 74 61 62 61 73   int openDatabas
137a0 65 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  e(.  const char 
137b0 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 2f 2a 20 44  *zFilename, /* D
137c0 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d 65  atabase filename
137d0 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20 2a   UTF-8 encoded *
137e0 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70  /.  sqlite3 **pp
137f0 44 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 4f 55  Db,        /* OU
13800 54 3a 20 52 65 74 75 72 6e 65 64 20 64 61 74 61  T: Returned data
13810 62 61 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  base handle */. 
13820 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 66 6c   unsigned int fl
13830 61 67 73 2c 20 20 20 20 2f 2a 20 4f 70 65 72 61  ags,    /* Opera
13840 74 69 6f 6e 61 6c 20 66 6c 61 67 73 20 2a 2f 0a  tional flags */.
13850 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56    const char *zV
13860 66 73 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  fs       /* Name
13870 20 6f 66 20 74 68 65 20 56 46 53 20 74 6f 20 75   of the VFS to u
13880 73 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  se */.){.  sqlit
13890 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
138a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
138b0 6f 72 65 20 61 6c 6c 6f 63 61 74 65 64 20 68 61  ore allocated ha
138c0 6e 64 6c 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  ndle here */.  i
138d0 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
138e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
138f0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
13900 0a 20 20 69 6e 74 20 69 73 54 68 72 65 61 64 73  .  int isThreads
13910 61 66 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  afe;            
13920 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 74     /* True for t
13930 68 72 65 61 64 73 61 66 65 20 63 6f 6e 6e 65 63  hreadsafe connec
13940 74 69 6f 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  tions */.  char 
13950 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20 20 20 20 20  *zOpen = 0;     
13960 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
13970 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
13980 74 6f 20 70 61 73 73 20 74 6f 20 42 74 72 65 65  to pass to Btree
13990 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 63 68 61 72  Open() */.  char
139a0 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 20 20   *zErrMsg = 0;  
139b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
139c0 72 72 6f 72 20 6d 65 73 73 61 67 65 20 66 72 6f  rror message fro
139d0 6d 20 73 71 6c 69 74 65 33 50 61 72 73 65 55 72  m sqlite3ParseUr
139e0 69 28 29 20 2a 2f 0a 0a 20 20 2a 70 70 44 62 20  i() */..  *ppDb 
139f0 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
13a00 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49  ITE_OMIT_AUTOINI
13a10 54 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  T.  rc = sqlite3
13a20 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
13a30 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
13a40 20 72 63 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f   rc;.#endif..  /
13a50 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77 20 73 65 6e  * Only allow sen
13a60 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74 69 6f  sible combinatio
13a70 6e 73 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  ns of bits in th
13a80 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65 6e 74  e flags argument
13a90 2e 20 20 0a 20 20 2a 2a 20 54 68 72 6f 77 20 61  .  .  ** Throw a
13aa0 6e 20 65 72 72 6f 72 20 69 66 20 61 6e 79 20 6e  n error if any n
13ab0 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d 62 69 6e 61  on-sense combina
13ac0 74 69 6f 6e 20 69 73 20 75 73 65 64 2e 20 20 49  tion is used.  I
13ad0 66 20 77 65 0a 20 20 2a 2a 20 64 6f 20 6e 6f 74  f we.  ** do not
13ae0 20 62 6c 6f 63 6b 20 69 6c 6c 65 67 61 6c 20 63   block illegal c
13af0 6f 6d 62 69 6e 61 74 69 6f 6e 73 20 68 65 72 65  ombinations here
13b00 2c 20 69 74 20 63 6f 75 6c 64 20 74 72 69 67 67  , it could trigg
13b10 65 72 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29  er.  ** assert()
13b20 20 73 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 64   statements in d
13b30 65 65 70 65 72 20 6c 61 79 65 72 73 2e 20 20 53  eeper layers.  S
13b40 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e 61 74  ensible combinat
13b50 69 6f 6e 73 0a 20 20 2a 2a 20 61 72 65 3a 0a 20  ions.  ** are:. 
13b60 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a 20 20 53 51   **.  **  1:  SQ
13b70 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
13b80 4c 59 0a 20 20 2a 2a 20 20 32 3a 20 20 53 51 4c  LY.  **  2:  SQL
13b90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
13ba0 54 45 0a 20 20 2a 2a 20 20 36 3a 20 20 53 51 4c  TE.  **  6:  SQL
13bb0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
13bc0 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e  TE | SQLITE_OPEN
13bd0 5f 43 52 45 41 54 45 0a 20 20 2a 2f 0a 20 20 61  _CREATE.  */.  a
13be0 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50  ssert( SQLITE_OP
13bf0 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 3d 3d 20  EN_READONLY  == 
13c00 30 78 30 31 20 29 3b 0a 20 20 61 73 73 65 72 74  0x01 );.  assert
13c10 28 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  ( SQLITE_OPEN_RE
13c20 41 44 57 52 49 54 45 20 3d 3d 20 30 78 30 32 20  ADWRITE == 0x02 
13c30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c  );.  assert( SQL
13c40 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20  ITE_OPEN_CREATE 
13c50 20 20 20 3d 3d 20 30 78 30 34 20 29 3b 0a 20 20     == 0x04 );.  
13c60 74 65 73 74 63 61 73 65 28 20 28 31 3c 3c 28 66  testcase( (1<<(f
13c70 6c 61 67 73 26 37 29 29 3d 3d 30 78 30 32 20 29  lags&7))==0x02 )
13c80 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c 59 20 2a 2f  ; /* READONLY */
13c90 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31 3c  .  testcase( (1<
13ca0 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78 30  <(flags&7))==0x0
13cb0 34 20 29 3b 20 2f 2a 20 52 45 41 44 57 52 49 54  4 ); /* READWRIT
13cc0 45 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  E */.  testcase(
13cd0 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d   (1<<(flags&7))=
13ce0 3d 30 78 34 30 20 29 3b 20 2f 2a 20 52 45 41 44  =0x40 ); /* READ
13cf0 57 52 49 54 45 20 7c 20 43 52 45 41 54 45 20 2a  WRITE | CREATE *
13d00 2f 0a 20 20 69 66 28 20 28 28 31 3c 3c 28 66 6c  /.  if( ((1<<(fl
13d10 61 67 73 26 37 29 29 20 26 20 30 78 34 36 29 3d  ags&7)) & 0x46)=
13d20 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
13d30 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b 0a  TE_MISUSE_BKPT;.
13d40 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c  .  if( sqlite3Gl
13d50 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 43 6f 72 65  obalConfig.bCore
13d60 4d 75 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20  Mutex==0 ){.    
13d70 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20 30  isThreadsafe = 0
13d80 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66 6c  ;.  }else if( fl
13d90 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45  ags & SQLITE_OPE
13da0 4e 5f 4e 4f 4d 55 54 45 58 20 29 7b 0a 20 20 20  N_NOMUTEX ){.   
13db0 20 69 73 54 68 72 65 61 64 73 61 66 65 20 3d 20   isThreadsafe = 
13dc0 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 66  0;.  }else if( f
13dd0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 4f 50  lags & SQLITE_OP
13de0 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 29 7b 0a  EN_FULLMUTEX ){.
13df0 20 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65      isThreadsafe
13e00 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
13e10 20 20 20 69 73 54 68 72 65 61 64 73 61 66 65 20     isThreadsafe 
13e20 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
13e30 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74 65 78  onfig.bFullMutex
13e40 3b 0a 20 20 7d 0a 20 20 69 66 28 20 66 6c 61 67  ;.  }.  if( flag
13e50 73 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  s & SQLITE_OPEN_
13e60 50 52 49 56 41 54 45 43 41 43 48 45 20 29 7b 0a  PRIVATECACHE ){.
13e70 20 20 20 20 66 6c 61 67 73 20 26 3d 20 7e 53 51      flags &= ~SQ
13e80 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44  LITE_OPEN_SHARED
13e90 43 41 43 48 45 3b 0a 20 20 7d 65 6c 73 65 20 69  CACHE;.  }else i
13ea0 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c  f( sqlite3Global
13eb0 43 6f 6e 66 69 67 2e 73 68 61 72 65 64 43 61 63  Config.sharedCac
13ec0 68 65 45 6e 61 62 6c 65 64 20 29 7b 0a 20 20 20  heEnabled ){.   
13ed0 20 66 6c 61 67 73 20 7c 3d 20 53 51 4c 49 54 45   flags |= SQLITE
13ee0 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48  _OPEN_SHAREDCACH
13ef0 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 6d  E;.  }..  /* Rem
13f00 6f 76 65 20 68 61 72 6d 66 75 6c 20 62 69 74 73  ove harmful bits
13f10 20 66 72 6f 6d 20 74 68 65 20 66 6c 61 67 73 20   from the flags 
13f20 70 61 72 61 6d 65 74 65 72 0a 20 20 2a 2a 0a 20  parameter.  **. 
13f30 20 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f 4f   ** The SQLITE_O
13f40 50 45 4e 5f 4e 4f 4d 55 54 45 58 20 61 6e 64 20  PEN_NOMUTEX and 
13f50 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c  SQLITE_OPEN_FULL
13f60 4d 55 54 45 58 20 66 6c 61 67 73 20 77 65 72 65  MUTEX flags were
13f70 0a 20 20 2a 2a 20 64 65 61 6c 74 20 77 69 74 68  .  ** dealt with
13f80 20 69 6e 20 74 68 65 20 70 72 65 76 69 6f 75 73   in the previous
13f90 20 63 6f 64 65 20 62 6c 6f 63 6b 2e 20 20 42 65   code block.  Be
13fa0 73 69 64 65 73 20 74 68 65 73 65 2c 20 74 68 65  sides these, the
13fb0 20 6f 6e 6c 79 0a 20 20 2a 2a 20 76 61 6c 69 64   only.  ** valid
13fc0 20 69 6e 70 75 74 20 66 6c 61 67 73 20 66 6f 72   input flags for
13fd0 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32   sqlite3_open_v2
13fe0 28 29 20 61 72 65 20 53 51 4c 49 54 45 5f 4f 50  () are SQLITE_OP
13ff0 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 0a 20 20 2a  EN_READONLY,.  *
14000 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  * SQLITE_OPEN_RE
14010 41 44 57 52 49 54 45 2c 20 53 51 4c 49 54 45 5f  ADWRITE, SQLITE_
14020 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 53 51 4c  OPEN_CREATE, SQL
14030 49 54 45 5f 4f 50 45 4e 5f 53 48 41 52 45 44 43  ITE_OPEN_SHAREDC
14040 41 43 48 45 2c 0a 20 20 2a 2a 20 53 51 4c 49 54  ACHE,.  ** SQLIT
14050 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
14060 43 48 45 2c 20 61 6e 64 20 73 6f 6d 65 20 72 65  CHE, and some re
14070 73 65 72 76 65 64 20 62 69 74 73 2e 20 20 53 69  served bits.  Si
14080 6c 65 6e 74 6c 79 20 6d 61 73 6b 0a 20 20 2a 2a  lently mask.  **
14090 20 6f 66 66 20 61 6c 6c 20 6f 74 68 65 72 20 66   off all other f
140a0 6c 61 67 73 2e 0a 20 20 2a 2f 0a 20 20 66 6c 61  lags..  */.  fla
140b0 67 73 20 26 3d 20 20 7e 28 20 53 51 4c 49 54 45  gs &=  ~( SQLITE
140c0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
140d0 4f 53 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  OSE |.          
140e0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
140f0 5f 45 58 43 4c 55 53 49 56 45 20 7c 0a 20 20 20  _EXCLUSIVE |.   
14100 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
14110 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20  TE_OPEN_MAIN_DB 
14120 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
14130 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d   SQLITE_OPEN_TEM
14140 50 5f 44 42 20 7c 20 0a 20 20 20 20 20 20 20 20  P_DB | .        
14150 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50         SQLITE_OP
14160 45 4e 5f 54 52 41 4e 53 49 45 4e 54 5f 44 42 20  EN_TRANSIENT_DB 
14170 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  | .             
14180 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41    SQLITE_OPEN_MA
14190 49 4e 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a 20 20  IN_JOURNAL | .  
141a0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
141b0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
141c0 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
141d0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
141e0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 20 7c  PEN_SUBJOURNAL |
141f0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
14200 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53   SQLITE_OPEN_MAS
14210 54 45 52 5f 4a 4f 55 52 4e 41 4c 20 7c 0a 20 20  TER_JOURNAL |.  
14220 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
14230 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
14240 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   |.             
14250 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 46 55    SQLITE_OPEN_FU
14260 4c 4c 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20  LLMUTEX |.      
14270 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
14280 4f 50 45 4e 5f 57 41 4c 0a 20 20 20 20 20 20 20  OPEN_WAL.       
14290 20 20 20 20 20 20 29 3b 0a 0a 20 20 2f 2a 20 41        );..  /* A
142a0 6c 6c 6f 63 61 74 65 20 74 68 65 20 73 71 6c 69  llocate the sqli
142b0 74 65 20 64 61 74 61 20 73 74 72 75 63 74 75 72  te data structur
142c0 65 20 2a 2f 0a 20 20 64 62 20 3d 20 73 71 6c 69  e */.  db = sqli
142d0 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 73  te3MallocZero( s
142e0 69 7a 65 6f 66 28 73 71 6c 69 74 65 33 29 20 29  izeof(sqlite3) )
142f0 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30 20 29 20  ;.  if( db==0 ) 
14300 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b  goto opendb_out;
14310 0a 20 20 69 66 28 20 69 73 54 68 72 65 61 64 73  .  if( isThreads
14320 61 66 65 20 29 7b 0a 20 20 20 20 64 62 2d 3e 6d  afe ){.    db->m
14330 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 4d 75  utex = sqlite3Mu
14340 74 65 78 41 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  texAlloc(SQLITE_
14350 4d 55 54 45 58 5f 52 45 43 55 52 53 49 56 45 29  MUTEX_RECURSIVE)
14360 3b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 75  ;.    if( db->mu
14370 74 65 78 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tex==0 ){.      
14380 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62 29  sqlite3_free(db)
14390 3b 0a 20 20 20 20 20 20 64 62 20 3d 20 30 3b 0a  ;.      db = 0;.
143a0 20 20 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64        goto opend
143b0 62 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  b_out;.    }.  }
143c0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
143d0 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
143e0 29 3b 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b  );.  db->errMask
143f0 20 3d 20 30 78 66 66 3b 0a 20 20 64 62 2d 3e 6e   = 0xff;.  db->n
14400 44 62 20 3d 20 32 3b 0a 20 20 64 62 2d 3e 6d 61  Db = 2;.  db->ma
14410 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41 47  gic = SQLITE_MAG
14420 49 43 5f 42 55 53 59 3b 0a 20 20 64 62 2d 3e 61  IC_BUSY;.  db->a
14430 44 62 20 3d 20 64 62 2d 3e 61 44 62 53 74 61 74  Db = db->aDbStat
14440 69 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 73  ic;..  assert( s
14450 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d 69 74  izeof(db->aLimit
14460 29 3d 3d 73 69 7a 65 6f 66 28 61 48 61 72 64 4c  )==sizeof(aHardL
14470 69 6d 69 74 29 20 29 3b 0a 20 20 6d 65 6d 63 70  imit) );.  memcp
14480 79 28 64 62 2d 3e 61 4c 69 6d 69 74 2c 20 61 48  y(db->aLimit, aH
14490 61 72 64 4c 69 6d 69 74 2c 20 73 69 7a 65 6f 66  ardLimit, sizeof
144a0 28 64 62 2d 3e 61 4c 69 6d 69 74 29 29 3b 0a 20  (db->aLimit));. 
144b0 20 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49   db->aLimit[SQLI
144c0 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
144d0 54 48 52 45 41 44 53 5d 20 3d 20 53 51 4c 49 54  THREADS] = SQLIT
144e0 45 5f 44 45 46 41 55 4c 54 5f 57 4f 52 4b 45 52  E_DEFAULT_WORKER
144f0 5f 54 48 52 45 41 44 53 3b 0a 20 20 64 62 2d 3e  _THREADS;.  db->
14500 61 75 74 6f 43 6f 6d 6d 69 74 20 3d 20 31 3b 0a  autoCommit = 1;.
14510 20 20 64 62 2d 3e 6e 65 78 74 41 75 74 6f 76 61    db->nextAutova
14520 63 20 3d 20 2d 31 3b 0a 20 20 64 62 2d 3e 73 7a  c = -1;.  db->sz
14530 4d 6d 61 70 20 3d 20 73 71 6c 69 74 65 33 47 6c  Mmap = sqlite3Gl
14540 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 7a 4d 6d 61  obalConfig.szMma
14550 70 3b 0a 20 20 64 62 2d 3e 6e 65 78 74 50 61 67  p;.  db->nextPag
14560 65 73 69 7a 65 20 3d 20 30 3b 0a 20 20 64 62 2d  esize = 0;.  db-
14570 3e 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20  >nMaxSorterMmap 
14580 3d 20 30 78 37 46 46 46 46 46 46 46 3b 0a 20 20  = 0x7FFFFFFF;.  
14590 64 62 2d 3e 66 6c 61 67 73 20 7c 3d 20 53 51 4c  db->flags |= SQL
145a0 49 54 45 5f 53 68 6f 72 74 43 6f 6c 4e 61 6d 65  ITE_ShortColName
145b0 73 20 7c 20 53 51 4c 49 54 45 5f 45 6e 61 62 6c  s | SQLITE_Enabl
145c0 65 54 72 69 67 67 65 72 20 7c 20 53 51 4c 49 54  eTrigger | SQLIT
145d0 45 5f 43 61 63 68 65 53 70 69 6c 6c 0a 23 69 66  E_CacheSpill.#if
145e0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
145f0 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f 4d 41 54  _DEFAULT_AUTOMAT
14600 49 43 5f 49 4e 44 45 58 29 20 7c 7c 20 53 51 4c  IC_INDEX) || SQL
14610 49 54 45 5f 44 45 46 41 55 4c 54 5f 41 55 54 4f  ITE_DEFAULT_AUTO
14620 4d 41 54 49 43 5f 49 4e 44 45 58 0a 20 20 20 20  MATIC_INDEX.    
14630 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
14640 51 4c 49 54 45 5f 41 75 74 6f 49 6e 64 65 78 0a  QLITE_AutoIndex.
14650 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54  #endif.#if SQLIT
14660 45 5f 44 45 46 41 55 4c 54 5f 46 49 4c 45 5f 46  E_DEFAULT_FILE_F
14670 4f 52 4d 41 54 3c 34 0a 20 20 20 20 20 20 20 20  ORMAT<4.        
14680 20 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54           | SQLIT
14690 45 5f 4c 65 67 61 63 79 46 69 6c 65 46 6d 74 0a  E_LegacyFileFmt.
146a0 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53 51  #endif.#ifdef SQ
146b0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4c 4f 41 44  LITE_ENABLE_LOAD
146c0 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20 20  _EXTENSION.     
146d0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53 51              | SQ
146e0 4c 49 54 45 5f 4c 6f 61 64 45 78 74 65 6e 73 69  LITE_LoadExtensi
146f0 6f 6e 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  on.#endif.#if SQ
14700 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 52 45 43  LITE_DEFAULT_REC
14710 55 52 53 49 56 45 5f 54 52 49 47 47 45 52 53 0a  URSIVE_TRIGGERS.
14720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14730 20 7c 20 53 51 4c 49 54 45 5f 52 65 63 54 72 69   | SQLITE_RecTri
14740 67 67 65 72 73 0a 23 65 6e 64 69 66 0a 23 69 66  ggers.#endif.#if
14750 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14760 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
14770 4b 45 59 53 29 20 26 26 20 53 51 4c 49 54 45 5f  KEYS) && SQLITE_
14780 44 45 46 41 55 4c 54 5f 46 4f 52 45 49 47 4e 5f  DEFAULT_FOREIGN_
14790 4b 45 59 53 0a 20 20 20 20 20 20 20 20 20 20 20  KEYS.           
147a0 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 46        | SQLITE_F
147b0 6f 72 65 69 67 6e 4b 65 79 73 0a 23 65 6e 64 69  oreignKeys.#endi
147c0 66 0a 20 20 20 20 20 20 3b 0a 20 20 73 71 6c 69  f.      ;.  sqli
147d0 74 65 33 48 61 73 68 49 6e 69 74 28 26 64 62 2d  te3HashInit(&db-
147e0 3e 61 43 6f 6c 6c 53 65 71 29 3b 0a 23 69 66 6e  >aCollSeq);.#ifn
147f0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
14800 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 73  VIRTUALTABLE.  s
14810 71 6c 69 74 65 33 48 61 73 68 49 6e 69 74 28 26  qlite3HashInit(&
14820 64 62 2d 3e 61 4d 6f 64 75 6c 65 29 3b 0a 23 65  db->aModule);.#e
14830 6e 64 69 66 0a 0a 20 20 2f 2a 20 41 64 64 20 74  ndif..  /* Add t
14840 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
14850 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 42 49  tion sequence BI
14860 4e 41 52 59 2e 20 42 49 4e 41 52 59 20 77 6f 72  NARY. BINARY wor
14870 6b 73 20 66 6f 72 20 62 6f 74 68 20 55 54 46 2d  ks for both UTF-
14880 38 0a 20 20 2a 2a 20 61 6e 64 20 55 54 46 2d 31  8.  ** and UTF-1
14890 36 2c 20 73 6f 20 61 64 64 20 61 20 76 65 72 73  6, so add a vers
148a0 69 6f 6e 20 66 6f 72 20 65 61 63 68 20 74 6f 20  ion for each to 
148b0 61 76 6f 69 64 20 61 6e 79 20 75 6e 6e 65 63 65  avoid any unnece
148c0 73 73 61 72 79 0a 20 20 2a 2a 20 63 6f 6e 76 65  ssary.  ** conve
148d0 72 73 69 6f 6e 73 2e 20 54 68 65 20 6f 6e 6c 79  rsions. The only
148e0 20 65 72 72 6f 72 20 74 68 61 74 20 63 61 6e 20   error that can 
148f0 6f 63 63 75 72 20 68 65 72 65 20 69 73 20 61 20  occur here is a 
14900 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
14910 2e 0a 20 20 2a 2f 0a 20 20 63 72 65 61 74 65 43  ..  */.  createC
14920 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42 49  ollation(db, "BI
14930 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55 54  NARY", SQLITE_UT
14940 46 38 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75  F8, 0, binCollFu
14950 6e 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65  nc, 0);.  create
14960 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 42  Collation(db, "B
14970 49 4e 41 52 59 22 2c 20 53 51 4c 49 54 45 5f 55  INARY", SQLITE_U
14980 54 46 31 36 42 45 2c 20 30 2c 20 62 69 6e 43 6f  TF16BE, 0, binCo
14990 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20 63 72  llFunc, 0);.  cr
149a0 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62  eateCollation(db
149b0 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51 4c 49  , "BINARY", SQLI
149c0 54 45 5f 55 54 46 31 36 4c 45 2c 20 30 2c 20 62  TE_UTF16LE, 0, b
149d0 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a  inCollFunc, 0);.
149e0 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f    createCollatio
149f0 6e 28 64 62 2c 20 22 52 54 52 49 4d 22 2c 20 53  n(db, "RTRIM", S
14a00 51 4c 49 54 45 5f 55 54 46 38 2c 20 28 76 6f 69  QLITE_UTF8, (voi
14a10 64 2a 29 31 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  d*)1, binCollFun
14a20 63 2c 20 30 29 3b 0a 20 20 69 66 28 20 64 62 2d  c, 0);.  if( db-
14a30 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
14a40 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62  .    goto opendb
14a50 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d 3e  _out;.  }.  db->
14a60 70 44 66 6c 74 43 6f 6c 6c 20 3d 20 73 71 6c 69  pDfltColl = sqli
14a70 74 65 33 46 69 6e 64 43 6f 6c 6c 53 65 71 28 64  te3FindCollSeq(d
14a80 62 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  b, SQLITE_UTF8, 
14a90 22 42 49 4e 41 52 59 22 2c 20 30 29 3b 0a 20 20  "BINARY", 0);.  
14aa0 61 73 73 65 72 74 28 20 64 62 2d 3e 70 44 66 6c  assert( db->pDfl
14ab0 74 43 6f 6c 6c 21 3d 30 20 29 3b 0a 0a 20 20 2f  tColl!=0 );..  /
14ac0 2a 20 41 6c 73 6f 20 61 64 64 20 61 20 55 54 46  * Also add a UTF
14ad0 2d 38 20 63 61 73 65 2d 69 6e 73 65 6e 73 69 74  -8 case-insensit
14ae0 69 76 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  ive collation se
14af0 71 75 65 6e 63 65 2e 20 2a 2f 0a 20 20 63 72 65  quence. */.  cre
14b00 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c  ateCollation(db,
14b10 20 22 4e 4f 43 41 53 45 22 2c 20 53 51 4c 49 54   "NOCASE", SQLIT
14b20 45 5f 55 54 46 38 2c 20 30 2c 20 6e 6f 63 61 73  E_UTF8, 0, nocas
14b30 65 43 6f 6c 6c 61 74 69 6e 67 46 75 6e 63 2c 20  eCollatingFunc, 
14b40 30 29 3b 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20  0);..  /* Parse 
14b50 74 68 65 20 66 69 6c 65 6e 61 6d 65 2f 55 52 49  the filename/URI
14b60 20 61 72 67 75 6d 65 6e 74 2e 20 2a 2f 0a 20 20   argument. */.  
14b70 64 62 2d 3e 6f 70 65 6e 46 6c 61 67 73 20 3d 20  db->openFlags = 
14b80 66 6c 61 67 73 3b 0a 20 20 72 63 20 3d 20 73 71  flags;.  rc = sq
14b90 6c 69 74 65 33 50 61 72 73 65 55 72 69 28 7a 56  lite3ParseUri(zV
14ba0 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 26  fs, zFilename, &
14bb0 66 6c 61 67 73 2c 20 26 64 62 2d 3e 70 56 66 73  flags, &db->pVfs
14bc0 2c 20 26 7a 4f 70 65 6e 2c 20 26 7a 45 72 72 4d  , &zOpen, &zErrM
14bd0 73 67 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  sg);.  if( rc!=S
14be0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14bf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
14c00 4f 4d 45 4d 20 29 20 64 62 2d 3e 6d 61 6c 6c 6f  OMEM ) db->mallo
14c10 63 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20  cFailed = 1;.   
14c20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74   sqlite3ErrorWit
14c30 68 4d 73 67 28 64 62 2c 20 72 63 2c 20 7a 45 72  hMsg(db, rc, zEr
14c40 72 4d 73 67 20 3f 20 22 25 73 22 20 3a 20 30 2c  rMsg ? "%s" : 0,
14c50 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73   zErrMsg);.    s
14c60 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
14c70 4d 73 67 29 3b 0a 20 20 20 20 67 6f 74 6f 20 6f  Msg);.    goto o
14c80 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a  pendb_out;.  }..
14c90 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 62 61    /* Open the ba
14ca0 63 6b 65 6e 64 20 64 61 74 61 62 61 73 65 20 64  ckend database d
14cb0 72 69 76 65 72 20 2a 2f 0a 20 20 72 63 20 3d 20  river */.  rc = 
14cc0 73 71 6c 69 74 65 33 42 74 72 65 65 4f 70 65 6e  sqlite3BtreeOpen
14cd0 28 64 62 2d 3e 70 56 66 73 2c 20 7a 4f 70 65 6e  (db->pVfs, zOpen
14ce0 2c 20 64 62 2c 20 26 64 62 2d 3e 61 44 62 5b 30  , db, &db->aDb[0
14cf0 5d 2e 70 42 74 2c 20 30 2c 0a 20 20 20 20 20 20  ].pBt, 0,.      
14d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14d10 20 20 66 6c 61 67 73 20 7c 20 53 51 4c 49 54 45    flags | SQLITE
14d20 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 3b 0a  _OPEN_MAIN_DB);.
14d30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14d40 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
14d50 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
14d60 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 72  NOMEM ){.      r
14d70 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
14d80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
14d90 74 65 33 45 72 72 6f 72 28 64 62 2c 20 72 63 29  te3Error(db, rc)
14da0 3b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64  ;.    goto opend
14db0 62 5f 6f 75 74 3b 0a 20 20 7d 0a 20 20 64 62 2d  b_out;.  }.  db-
14dc0 3e 61 44 62 5b 30 5d 2e 70 53 63 68 65 6d 61 20  >aDb[0].pSchema 
14dd0 3d 20 73 71 6c 69 74 65 33 53 63 68 65 6d 61 47  = sqlite3SchemaG
14de0 65 74 28 64 62 2c 20 64 62 2d 3e 61 44 62 5b 30  et(db, db->aDb[0
14df0 5d 2e 70 42 74 29 3b 0a 20 20 64 62 2d 3e 61 44  ].pBt);.  db->aD
14e00 62 5b 31 5d 2e 70 53 63 68 65 6d 61 20 3d 20 73  b[1].pSchema = s
14e10 71 6c 69 74 65 33 53 63 68 65 6d 61 47 65 74 28  qlite3SchemaGet(
14e20 64 62 2c 20 30 29 3b 0a 0a 0a 20 20 2f 2a 20 54  db, 0);...  /* T
14e30 68 65 20 64 65 66 61 75 6c 74 20 73 61 66 65 74  he default safet
14e40 79 5f 6c 65 76 65 6c 20 66 6f 72 20 74 68 65 20  y_level for the 
14e50 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 69 73  main database is
14e60 20 27 66 75 6c 6c 27 3b 20 66 6f 72 20 74 68 65   'full'; for the
14e70 20 74 65 6d 70 0a 20 20 2a 2a 20 64 61 74 61 62   temp.  ** datab
14e80 61 73 65 20 69 74 20 69 73 20 27 4e 4f 4e 45 27  ase it is 'NONE'
14e90 2e 20 54 68 69 73 20 6d 61 74 63 68 65 73 20 74  . This matches t
14ea0 68 65 20 70 61 67 65 72 20 6c 61 79 65 72 20 64  he pager layer d
14eb0 65 66 61 75 6c 74 73 2e 20 20 0a 20 20 2a 2f 0a  efaults.  .  */.
14ec0 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 7a 4e 61    db->aDb[0].zNa
14ed0 6d 65 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 64  me = "main";.  d
14ee0 62 2d 3e 61 44 62 5b 30 5d 2e 73 61 66 65 74 79  b->aDb[0].safety
14ef0 5f 6c 65 76 65 6c 20 3d 20 33 3b 0a 20 20 64 62  _level = 3;.  db
14f00 2d 3e 61 44 62 5b 31 5d 2e 7a 4e 61 6d 65 20 3d  ->aDb[1].zName =
14f10 20 22 74 65 6d 70 22 3b 0a 20 20 64 62 2d 3e 61   "temp";.  db->a
14f20 44 62 5b 31 5d 2e 73 61 66 65 74 79 5f 6c 65 76  Db[1].safety_lev
14f30 65 6c 20 3d 20 31 3b 0a 0a 20 20 64 62 2d 3e 6d  el = 1;..  db->m
14f40 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d 41  agic = SQLITE_MA
14f50 47 49 43 5f 4f 50 45 4e 3b 0a 20 20 69 66 28 20  GIC_OPEN;.  if( 
14f60 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
14f70 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6f 70 65   ){.    goto ope
14f80 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20  ndb_out;.  }..  
14f90 2f 2a 20 52 65 67 69 73 74 65 72 20 61 6c 6c 20  /* Register all 
14fa0 62 75 69 6c 74 2d 69 6e 20 66 75 6e 63 74 69 6f  built-in functio
14fb0 6e 73 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20 61  ns, but do not a
14fc0 74 74 65 6d 70 74 20 74 6f 20 72 65 61 64 20 74  ttempt to read t
14fd0 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
14fe0 20 73 63 68 65 6d 61 20 79 65 74 2e 20 54 68 69   schema yet. Thi
14ff0 73 20 69 73 20 64 65 6c 61 79 65 64 20 75 6e 74  s is delayed unt
15000 69 6c 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  il the first tim
15010 65 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  e the database. 
15020 20 2a 2a 20 69 73 20 61 63 63 65 73 73 65 64 2e   ** is accessed.
15030 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  .  */.  sqlite3E
15040 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
15050 4f 4b 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65  OK);.  sqlite3Re
15060 67 69 73 74 65 72 42 75 69 6c 74 69 6e 46 75 6e  gisterBuiltinFun
15070 63 74 69 6f 6e 73 28 64 62 29 3b 0a 0a 20 20 2f  ctions(db);..  /
15080 2a 20 4c 6f 61 64 20 61 75 74 6f 6d 61 74 69 63  * Load automatic
15090 20 65 78 74 65 6e 73 69 6f 6e 73 20 2d 20 65 78   extensions - ex
150a0 74 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61  tensions that ha
150b0 76 65 20 62 65 65 6e 20 72 65 67 69 73 74 65 72  ve been register
150c0 65 64 0a 20 20 2a 2a 20 75 73 69 6e 67 20 74 68  ed.  ** using th
150d0 65 20 73 71 6c 69 74 65 33 5f 61 75 74 6f 6d 61  e sqlite3_automa
150e0 74 69 63 5f 65 78 74 65 6e 73 69 6f 6e 28 29 20  tic_extension() 
150f0 41 50 49 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  API..  */.  rc =
15100 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65   sqlite3_errcode
15110 28 64 62 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  (db);.  if( rc==
15120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15130 20 73 71 6c 69 74 65 33 41 75 74 6f 4c 6f 61 64   sqlite3AutoLoad
15140 45 78 74 65 6e 73 69 6f 6e 73 28 64 62 29 3b 0a  Extensions(db);.
15150 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15160 5f 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20  _errcode(db);.  
15170 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15180 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74  _OK ){.      got
15190 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
151a0 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20    }.  }..#ifdef 
151b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54  SQLITE_ENABLE_FT
151c0 53 31 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61  S1.  if( !db->ma
151d0 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
151e0 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
151f0 69 74 65 33 46 74 73 31 49 6e 69 74 28 73 71 6c  ite3Fts1Init(sql
15200 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d  ite3*);.    rc =
15210 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e 69 74   sqlite3Fts1Init
15220 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
15230 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
15240 45 4e 41 42 4c 45 5f 46 54 53 32 0a 20 20 69 66  ENABLE_FTS2.  if
15250 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
15260 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
15270 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 65 78 74 65  E_OK ){.    exte
15280 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 46 74  rn int sqlite3Ft
15290 73 32 49 6e 69 74 28 73 71 6c 69 74 65 33 2a 29  s2Init(sqlite3*)
152a0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
152b0 65 33 46 74 73 32 49 6e 69 74 28 64 62 29 3b 0a  e3Fts2Init(db);.
152c0 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
152d0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
152e0 5f 46 54 53 33 0a 20 20 69 66 28 20 21 64 62 2d  _FTS3.  if( !db-
152f0 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26  >mallocFailed &&
15300 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15310 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
15320 65 33 46 74 73 33 49 6e 69 74 28 64 62 29 3b 0a  e3Fts3Init(db);.
15330 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64    }.#endif..#ifd
15340 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
15350 5f 49 43 55 0a 20 20 69 66 28 20 21 64 62 2d 3e  _ICU.  if( !db->
15360 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
15370 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
15380 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
15390 33 49 63 75 49 6e 69 74 28 64 62 29 3b 0a 20 20  3IcuInit(db);.  
153a0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
153b0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 52   SQLITE_ENABLE_R
153c0 54 52 45 45 0a 20 20 69 66 28 20 21 64 62 2d 3e  TREE.  if( !db->
153d0 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 26 26 20  mallocFailed && 
153e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 7b 0a  rc==SQLITE_OK){.
153f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
15400 52 74 72 65 65 49 6e 69 74 28 64 62 29 3b 0a 20  RtreeInit(db);. 
15410 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
15420 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
15430 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 31 20  _LOCKING_MODE=1 
15440 6d 61 6b 65 73 20 45 58 43 4c 55 53 49 56 45 20  makes EXCLUSIVE 
15450 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f 63 6b  the default lock
15460 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e 20 20  ing.  ** mode.  
15470 2d 44 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  -DSQLITE_DEFAULT
15480 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3d 30 20  _LOCKING_MODE=0 
15490 6d 61 6b 65 20 4e 4f 52 4d 41 4c 20 74 68 65 20  make NORMAL the 
154a0 64 65 66 61 75 6c 74 20 6c 6f 63 6b 69 6e 67 0a  default locking.
154b0 20 20 2a 2a 20 6d 6f 64 65 2e 20 20 44 6f 69 6e    ** mode.  Doin
154c0 67 20 6e 6f 74 68 69 6e 67 20 61 74 20 61 6c 6c  g nothing at all
154d0 20 61 6c 73 6f 20 6d 61 6b 65 73 20 4e 4f 52 4d   also makes NORM
154e0 41 4c 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a  AL the default..
154f0 20 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49    */.#ifdef SQLI
15500 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b 49  TE_DEFAULT_LOCKI
15510 4e 47 5f 4d 4f 44 45 0a 20 20 64 62 2d 3e 64 66  NG_MODE.  db->df
15520 6c 74 4c 6f 63 6b 4d 6f 64 65 20 3d 20 53 51 4c  ltLockMode = SQL
15530 49 54 45 5f 44 45 46 41 55 4c 54 5f 4c 4f 43 4b  ITE_DEFAULT_LOCK
15540 49 4e 47 5f 4d 4f 44 45 3b 0a 20 20 73 71 6c 69  ING_MODE;.  sqli
15550 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67 4d  te3PagerLockingM
15560 6f 64 65 28 73 71 6c 69 74 65 33 42 74 72 65 65  ode(sqlite3Btree
15570 50 61 67 65 72 28 64 62 2d 3e 61 44 62 5b 30 5d  Pager(db->aDb[0]
15580 2e 70 42 74 29 2c 0a 20 20 20 20 20 20 20 20 20  .pBt),.         
15590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
155a0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
155b0 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 29 3b 0a 23  LOCKING_MODE);.#
155c0 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 72 63 20  endif..  if( rc 
155d0 29 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64  ) sqlite3Error(d
155e0 62 2c 20 72 63 29 3b 0a 0a 20 20 2f 2a 20 45 6e  b, rc);..  /* En
155f0 61 62 6c 65 20 74 68 65 20 6c 6f 6f 6b 61 73 69  able the lookasi
15600 64 65 2d 6d 61 6c 6c 6f 63 20 73 75 62 73 79 73  de-malloc subsys
15610 74 65 6d 20 2a 2f 0a 20 20 73 65 74 75 70 4c 6f  tem */.  setupLo
15620 6f 6b 61 73 69 64 65 28 64 62 2c 20 30 2c 20 73  okaside(db, 0, s
15630 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15640 69 67 2e 73 7a 4c 6f 6f 6b 61 73 69 64 65 2c 0a  ig.szLookaside,.
15650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15660 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 47          sqlite3G
15670 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 4c 6f 6f  lobalConfig.nLoo
15680 6b 61 73 69 64 65 29 3b 0a 0a 20 20 73 71 6c 69  kaside);..  sqli
15690 74 65 33 5f 77 61 6c 5f 61 75 74 6f 63 68 65 63  te3_wal_autochec
156a0 6b 70 6f 69 6e 74 28 64 62 2c 20 53 51 4c 49 54  kpoint(db, SQLIT
156b0 45 5f 44 45 46 41 55 4c 54 5f 57 41 4c 5f 41 55  E_DEFAULT_WAL_AU
156c0 54 4f 43 48 45 43 4b 50 4f 49 4e 54 29 3b 0a 0a  TOCHECKPOINT);..
156d0 6f 70 65 6e 64 62 5f 6f 75 74 3a 0a 20 20 73 71  opendb_out:.  sq
156e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 4f 70 65 6e  lite3_free(zOpen
156f0 29 3b 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20  );.  if( db ){. 
15700 20 20 20 61 73 73 65 72 74 28 20 64 62 2d 3e 6d     assert( db->m
15710 75 74 65 78 21 3d 30 20 7c 7c 20 69 73 54 68 72  utex!=0 || isThr
15720 65 61 64 73 61 66 65 3d 3d 30 20 7c 7c 20 73 71  eadsafe==0 || sq
15730 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15740 67 2e 62 46 75 6c 6c 4d 75 74 65 78 3d 3d 30 20  g.bFullMutex==0 
15750 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
15760 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
15770 75 74 65 78 29 3b 0a 20 20 7d 0a 20 20 72 63 20  utex);.  }.  rc 
15780 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  = sqlite3_errcod
15790 65 28 64 62 29 3b 0a 20 20 61 73 73 65 72 74 28  e(db);.  assert(
157a0 20 64 62 21 3d 30 20 7c 7c 20 72 63 3d 3d 53 51   db!=0 || rc==SQ
157b0 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
157c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  if( rc==SQLITE_N
157d0 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 73 71 6c 69  OMEM ){.    sqli
157e0 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20  te3_close(db);. 
157f0 20 20 20 64 62 20 3d 20 30 3b 0a 20 20 7d 65 6c     db = 0;.  }el
15800 73 65 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  se if( rc!=SQLIT
15810 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 64 62 2d 3e  E_OK ){.    db->
15820 6d 61 67 69 63 20 3d 20 53 51 4c 49 54 45 5f 4d  magic = SQLITE_M
15830 41 47 49 43 5f 53 49 43 4b 3b 0a 20 20 7d 0a 20  AGIC_SICK;.  }. 
15840 20 2a 70 70 44 62 20 3d 20 64 62 3b 0a 23 69 66   *ppDb = db;.#if
15850 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
15860 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20 73  E_SQLLOG.  if( s
15870 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
15880 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20 20  ig.xSqllog ){.  
15890 20 20 2f 2a 20 4f 70 65 6e 69 6e 67 20 61 20 64    /* Opening a d
158a0 62 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68  b handle. Fourth
158b0 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61   parameter is pa
158c0 73 73 65 64 20 30 2e 20 2a 2f 0a 20 20 20 20 76  ssed 0. */.    v
158d0 6f 69 64 20 2a 70 41 72 67 20 3d 20 73 71 6c 69  oid *pArg = sqli
158e0 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e  te3GlobalConfig.
158f0 70 53 71 6c 6c 6f 67 41 72 67 3b 0a 20 20 20 20  pSqllogArg;.    
15900 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
15910 66 69 67 2e 78 53 71 6c 6c 6f 67 28 70 41 72 67  fig.xSqllog(pArg
15920 2c 20 64 62 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , db, zFilename,
15930 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a   0);.  }.#endif.
15940 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
15950 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
15960 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20  }../*.** Open a 
15970 6e 65 77 20 64 61 74 61 62 61 73 65 20 68 61 6e  new database han
15980 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  dle..*/.int sqli
15990 74 65 33 5f 6f 70 65 6e 28 0a 20 20 63 6f 6e 73  te3_open(.  cons
159a0 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
159b0 65 2c 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a  e, .  sqlite3 **
159c0 70 70 44 62 20 0a 29 7b 0a 20 20 72 65 74 75 72  ppDb .){.  retur
159d0 6e 20 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a  n openDatabase(z
159e0 46 69 6c 65 6e 61 6d 65 2c 20 70 70 44 62 2c 0a  Filename, ppDb,.
159f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a00 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
15a10 4e 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51  N_READWRITE | SQ
15a20 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
15a30 2c 20 30 29 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  , 0);.}.int sqli
15a40 74 65 33 5f 6f 70 65 6e 5f 76 32 28 0a 20 20 63  te3_open_v2(.  c
15a50 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6c 65 6e  onst char *filen
15a60 61 6d 65 2c 20 20 20 2f 2a 20 44 61 74 61 62 61  ame,   /* Databa
15a70 73 65 20 66 69 6c 65 6e 61 6d 65 20 28 55 54 46  se filename (UTF
15a80 2d 38 29 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  -8) */.  sqlite3
15a90 20 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20   **ppDb,        
15aa0 20 2f 2a 20 4f 55 54 3a 20 53 51 4c 69 74 65 20   /* OUT: SQLite 
15ab0 64 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69  db handle */.  i
15ac0 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20 20  nt flags,       
15ad0 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20         /* Flags 
15ae0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
15af0 2a 7a 56 66 73 20 20 20 20 20 20 20 20 2f 2a 20  *zVfs        /* 
15b00 4e 61 6d 65 20 6f 66 20 56 46 53 20 6d 6f 64 75  Name of VFS modu
15b10 6c 65 20 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a  le to use */.){.
15b20 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
15b30 61 62 61 73 65 28 66 69 6c 65 6e 61 6d 65 2c 20  abase(filename, 
15b40 70 70 44 62 2c 20 28 75 6e 73 69 67 6e 65 64 20  ppDb, (unsigned 
15b50 69 6e 74 29 66 6c 61 67 73 2c 20 7a 56 66 73 29  int)flags, zVfs)
15b60 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
15b70 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 2f  ITE_OMIT_UTF16./
15b80 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20  *.** Open a new 
15b90 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 2e  database handle.
15ba0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
15bb0 6f 70 65 6e 31 36 28 0a 20 20 63 6f 6e 73 74 20  open16(.  const 
15bc0 76 6f 69 64 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  void *zFilename,
15bd0 20 0a 20 20 73 71 6c 69 74 65 33 20 2a 2a 70 70   .  sqlite3 **pp
15be0 44 62 0a 29 7b 0a 20 20 63 68 61 72 20 63 6f 6e  Db.){.  char con
15bf0 73 74 20 2a 7a 46 69 6c 65 6e 61 6d 65 38 3b 20  st *zFilename8; 
15c00 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 65    /* zFilename e
15c10 6e 63 6f 64 65 64 20 69 6e 20 55 54 46 2d 38 20  ncoded in UTF-8 
15c20 69 6e 73 74 65 61 64 20 6f 66 20 55 54 46 2d 31  instead of UTF-1
15c30 36 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 76  6 */.  sqlite3_v
15c40 61 6c 75 65 20 2a 70 56 61 6c 3b 0a 20 20 69 6e  alue *pVal;.  in
15c50 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28  t rc;..  assert(
15c60 20 7a 46 69 6c 65 6e 61 6d 65 20 29 3b 0a 20 20   zFilename );.  
15c70 61 73 73 65 72 74 28 20 70 70 44 62 20 29 3b 0a  assert( ppDb );.
15c80 20 20 2a 70 70 44 62 20 3d 20 30 3b 0a 23 69 66    *ppDb = 0;.#if
15c90 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
15ca0 5f 41 55 54 4f 49 4e 49 54 0a 20 20 72 63 20 3d  _AUTOINIT.  rc =
15cb0 20 73 71 6c 69 74 65 33 5f 69 6e 69 74 69 61 6c   sqlite3_initial
15cc0 69 7a 65 28 29 3b 0a 20 20 69 66 28 20 72 63 20  ize();.  if( rc 
15cd0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 65 6e  ) return rc;.#en
15ce0 64 69 66 0a 20 20 70 56 61 6c 20 3d 20 73 71 6c  dif.  pVal = sql
15cf0 69 74 65 33 56 61 6c 75 65 4e 65 77 28 30 29 3b  ite3ValueNew(0);
15d00 0a 20 20 73 71 6c 69 74 65 33 56 61 6c 75 65 53  .  sqlite3ValueS
15d10 65 74 53 74 72 28 70 56 61 6c 2c 20 2d 31 2c 20  etStr(pVal, -1, 
15d20 7a 46 69 6c 65 6e 61 6d 65 2c 20 53 51 4c 49 54  zFilename, SQLIT
15d30 45 5f 55 54 46 31 36 4e 41 54 49 56 45 2c 20 53  E_UTF16NATIVE, S
15d40 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
15d50 20 7a 46 69 6c 65 6e 61 6d 65 38 20 3d 20 73 71   zFilename8 = sq
15d60 6c 69 74 65 33 56 61 6c 75 65 54 65 78 74 28 70  lite3ValueText(p
15d70 56 61 6c 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  Val, SQLITE_UTF8
15d80 29 3b 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  );.  if( zFilena
15d90 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  me8 ){.    rc = 
15da0 6f 70 65 6e 44 61 74 61 62 61 73 65 28 7a 46 69  openDatabase(zFi
15db0 6c 65 6e 61 6d 65 38 2c 20 70 70 44 62 2c 0a 20  lename8, ppDb,. 
15dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15dd0 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e       SQLITE_OPEN
15de0 5f 52 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c  _READWRITE | SQL
15df0 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c  ITE_OPEN_CREATE,
15e00 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
15e10 20 2a 70 70 44 62 20 7c 7c 20 72 63 3d 3d 53 51   *ppDb || rc==SQ
15e20 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
15e30 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
15e40 5f 4f 4b 20 26 26 20 21 44 62 48 61 73 50 72 6f  _OK && !DbHasPro
15e50 70 65 72 74 79 28 2a 70 70 44 62 2c 20 30 2c 20  perty(*ppDb, 0, 
15e60 44 42 5f 53 63 68 65 6d 61 4c 6f 61 64 65 64 29  DB_SchemaLoaded)
15e70 20 29 7b 0a 20 20 20 20 20 20 45 4e 43 28 2a 70   ){.      ENC(*p
15e80 70 44 62 29 20 3d 20 53 51 4c 49 54 45 5f 55 54  pDb) = SQLITE_UT
15e90 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 20 20 7d  F16NATIVE;.    }
15ea0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
15eb0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
15ec0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 61  .  }.  sqlite3Va
15ed0 6c 75 65 46 72 65 65 28 70 56 61 6c 29 3b 0a 0a  lueFree(pVal);..
15ee0 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
15ef0 41 70 69 45 78 69 74 28 30 2c 20 72 63 29 3b 0a  ApiExit(0, rc);.
15f00 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
15f10 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20 2a 2f  TE_OMIT_UTF16 */
15f20 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72  ../*.** Register
15f30 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e   a new collation
15f40 20 73 65 71 75 65 6e 63 65 20 77 69 74 68 20 74   sequence with t
15f50 68 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64  he database hand
15f60 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71  le db..*/.int sq
15f70 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c  lite3_create_col
15f80 6c 61 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  lation(.  sqlite
15f90 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
15fa0 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20  char *zName, .  
15fb0 69 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64  int enc, .  void
15fc0 2a 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78  * pCtx,.  int(*x
15fd0 43 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69  Compare)(void*,i
15fe0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  nt,const void*,i
15ff0 6e 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a  nt,const void*).
16000 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
16010 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
16020 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
16030 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61   assert( !db->ma
16040 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20  llocFailed );.  
16050 72 63 20 3d 20 63 72 65 61 74 65 43 6f 6c 6c 61  rc = createColla
16060 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20  tion(db, zName, 
16070 28 75 38 29 65 6e 63 2c 20 70 43 74 78 2c 20 78  (u8)enc, pCtx, x
16080 43 6f 6d 70 61 72 65 2c 20 30 29 3b 0a 20 20 72  Compare, 0);.  r
16090 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
160a0 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
160b0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
160c0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
160d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
160e0 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 6e  .** Register a n
160f0 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ew collation seq
16100 75 65 6e 63 65 20 77 69 74 68 20 74 68 65 20 64  uence with the d
16110 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 64  atabase handle d
16120 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
16130 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74 69  3_create_collati
16140 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33  on_v2(.  sqlite3
16150 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20 63  * db, .  const c
16160 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 69  har *zName, .  i
16170 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
16180 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
16190 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
161a0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
161b0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 2c 0a  t,const void*),.
161c0 20 20 76 6f 69 64 28 2a 78 44 65 6c 29 28 76 6f    void(*xDel)(vo
161d0 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72 63  id*).){.  int rc
161e0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
161f0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
16200 78 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21 64  x);.  assert( !d
16210 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
16220 29 3b 0a 20 20 72 63 20 3d 20 63 72 65 61 74 65  );.  rc = create
16230 43 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e  Collation(db, zN
16240 61 6d 65 2c 20 28 75 38 29 65 6e 63 2c 20 70 43  ame, (u8)enc, pC
16250 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 78 44  tx, xCompare, xD
16260 65 6c 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  el);.  rc = sqli
16270 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72  te3ApiExit(db, r
16280 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  c);.  sqlite3_mu
16290 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
162a0 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  tex);.  return r
162b0 63 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  c;.}..#ifndef SQ
162c0 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
162d0 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
162e0 20 6e 65 77 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   new collation s
162f0 65 71 75 65 6e 63 65 20 77 69 74 68 20 74 68 65  equence with the
16300 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65   database handle
16310 20 64 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69   db..*/.int sqli
16320 74 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61  te3_create_colla
16330 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c 69 74 65  tion16(.  sqlite
16340 33 2a 20 64 62 2c 20 0a 20 20 63 6f 6e 73 74 20  3* db, .  const 
16350 76 6f 69 64 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69  void *zName,.  i
16360 6e 74 20 65 6e 63 2c 20 0a 20 20 76 6f 69 64 2a  nt enc, .  void*
16370 20 70 43 74 78 2c 0a 20 20 69 6e 74 28 2a 78 43   pCtx,.  int(*xC
16380 6f 6d 70 61 72 65 29 28 76 6f 69 64 2a 2c 69 6e  ompare)(void*,in
16390 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69 6e  t,const void*,in
163a0 74 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29  t,const void*).)
163b0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
163c0 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
163d0 7a 4e 61 6d 65 38 3b 0a 20 20 73 71 6c 69 74 65  zName8;.  sqlite
163e0 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
163f0 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73 65  ->mutex);.  asse
16400 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rt( !db->mallocF
16410 61 69 6c 65 64 20 29 3b 0a 20 20 7a 4e 61 6d 65  ailed );.  zName
16420 38 20 3d 20 73 71 6c 69 74 65 33 55 74 66 31 36  8 = sqlite3Utf16
16430 74 6f 38 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 2d  to8(db, zName, -
16440 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e  1, SQLITE_UTF16N
16450 41 54 49 56 45 29 3b 0a 20 20 69 66 28 20 7a 4e  ATIVE);.  if( zN
16460 61 6d 65 38 20 29 7b 0a 20 20 20 20 72 63 20 3d  ame8 ){.    rc =
16470 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
16480 28 64 62 2c 20 7a 4e 61 6d 65 38 2c 20 28 75 38  (db, zName8, (u8
16490 29 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d  )enc, pCtx, xCom
164a0 70 61 72 65 2c 20 30 29 3b 0a 20 20 20 20 73 71  pare, 0);.    sq
164b0 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
164c0 7a 4e 61 6d 65 38 29 3b 0a 20 20 7d 0a 20 20 72  zName8);.  }.  r
164d0 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
164e0 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
164f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
16500 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
16510 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
16520 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
16530 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 2f 2a 0a  IT_UTF16 */../*.
16540 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 63 6f  ** Register a co
16550 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
16560 20 66 61 63 74 6f 72 79 20 63 61 6c 6c 62 61 63   factory callbac
16570 6b 20 77 69 74 68 20 74 68 65 20 64 61 74 61 62  k with the datab
16580 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a 20 64 62  ase handle.** db
16590 2e 20 52 65 70 6c 61 63 65 20 61 6e 79 20 70 72  . Replace any pr
165a0 65 76 69 6f 75 73 6c 79 20 69 6e 73 74 61 6c 6c  eviously install
165b0 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  ed collation seq
165c0 75 65 6e 63 65 20 66 61 63 74 6f 72 79 2e 0a 2a  uence factory..*
165d0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6f  /.int sqlite3_co
165e0 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65 64 28 0a  llation_needed(.
165f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a    sqlite3 *db, .
16600 20 20 76 6f 69 64 20 2a 70 43 6f 6c 6c 4e 65 65    void *pCollNee
16610 64 65 64 41 72 67 2c 20 0a 20 20 76 6f 69 64 28  dedArg, .  void(
16620 2a 78 43 6f 6c 6c 4e 65 65 64 65 64 29 28 76 6f  *xCollNeeded)(vo
16630 69 64 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74  id*,sqlite3*,int
16640 20 65 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20   eTextRep,const 
16650 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69  char*).){.  sqli
16660 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
16670 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62  db->mutex);.  db
16680 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20  ->xCollNeeded = 
16690 78 43 6f 6c 6c 4e 65 65 64 65 64 3b 0a 20 20 64  xCollNeeded;.  d
166a0 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36  b->xCollNeeded16
166b0 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c   = 0;.  db->pCol
166c0 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
166d0 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
166e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
166f0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
16700 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16710 4b 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  K;.}..#ifndef SQ
16720 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 0a  LITE_OMIT_UTF16.
16730 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61  /*.** Register a
16740 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
16750 6e 63 65 20 66 61 63 74 6f 72 79 20 63 61 6c 6c  nce factory call
16760 62 61 63 6b 20 77 69 74 68 20 74 68 65 20 64 61  back with the da
16770 74 61 62 61 73 65 20 68 61 6e 64 6c 65 0a 2a 2a  tabase handle.**
16780 20 64 62 2e 20 52 65 70 6c 61 63 65 20 61 6e 79   db. Replace any
16790 20 70 72 65 76 69 6f 75 73 6c 79 20 69 6e 73 74   previously inst
167a0 61 6c 6c 65 64 20 63 6f 6c 6c 61 74 69 6f 6e 20  alled collation 
167b0 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79  sequence factory
167c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
167d0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e 65 65 64 65  _collation_neede
167e0 64 31 36 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  d16(.  sqlite3 *
167f0 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70 43 6f  db, .  void *pCo
16800 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a 20 20  llNeededArg, .  
16810 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65 64 65  void(*xCollNeede
16820 64 31 36 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  d16)(void*,sqlit
16830 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
16840 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 29 0a 29 7b  ,const void*).){
16850 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16860 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
16870 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
16880 65 64 65 64 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  eded = 0;.  db->
16890 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 20 3d 20  xCollNeeded16 = 
168a0 78 43 6f 6c 6c 4e 65 65 64 65 64 31 36 3b 0a 20  xCollNeeded16;. 
168b0 20 64 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64   db->pCollNeeded
168c0 41 72 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65  Arg = pCollNeede
168d0 64 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f  dArg;.  sqlite3_
168e0 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e  mutex_leave(db->
168f0 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e  mutex);.  return
16900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
16910 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
16920 4d 49 54 5f 55 54 46 31 36 20 2a 2f 0a 0a 23 69  MIT_UTF16 */..#i
16930 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16940 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f 2a 0a  T_DEPRECATED./*.
16950 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
16960 20 69 73 20 6e 6f 77 20 61 6e 20 61 6e 61 63 68   is now an anach
16970 72 6f 6e 69 73 6d 2e 20 49 74 20 75 73 65 64 20  ronism. It used 
16980 74 6f 20 62 65 20 75 73 65 64 20 74 6f 20 72 65  to be used to re
16990 63 6f 76 65 72 20 66 72 6f 6d 20 61 0a 2a 2a 20  cover from a.** 
169a0 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 75 72 65  malloc() failure
169b0 2c 20 62 75 74 20 53 51 4c 69 74 65 20 6e 6f 77  , but SQLite now
169c0 20 64 6f 65 73 20 74 68 69 73 20 61 75 74 6f 6d   does this autom
169d0 61 74 69 63 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74  atically..*/.int
169e0 20 73 71 6c 69 74 65 33 5f 67 6c 6f 62 61 6c 5f   sqlite3_global_
169f0 72 65 63 6f 76 65 72 28 76 6f 69 64 29 7b 0a 20  recover(void){. 
16a00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16a10 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
16a20 2a 2a 20 54 65 73 74 20 74 6f 20 73 65 65 20 77  ** Test to see w
16a30 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
16a40 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
16a50 63 74 69 6f 6e 20 69 73 20 69 6e 20 61 75 74 6f  ction is in auto
16a60 63 6f 6d 6d 69 74 0a 2a 2a 20 6d 6f 64 65 2e 20  commit.** mode. 
16a70 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
16a80 69 74 20 69 73 20 61 6e 64 20 46 41 4c 53 45 20  it is and FALSE 
16a90 69 66 20 6e 6f 74 2e 20 20 41 75 74 6f 63 6f 6d  if not.  Autocom
16aa0 6d 69 74 20 6d 6f 64 65 20 69 73 20 6f 6e 0a 2a  mit mode is on.*
16ab0 2a 20 62 79 20 64 65 66 61 75 6c 74 2e 20 20 41  * by default.  A
16ac0 75 74 6f 63 6f 6d 6d 69 74 20 69 73 20 64 69 73  utocommit is dis
16ad0 61 62 6c 65 64 20 62 79 20 61 20 42 45 47 49 4e  abled by a BEGIN
16ae0 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64 20 72   statement and r
16af0 65 65 6e 61 62 6c 65 64 0a 2a 2a 20 62 79 20 74  eenabled.** by t
16b00 68 65 20 6e 65 78 74 20 43 4f 4d 4d 49 54 20 6f  he next COMMIT o
16b10 72 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2f 0a 69  r ROLLBACK..*/.i
16b20 6e 74 20 73 71 6c 69 74 65 33 5f 67 65 74 5f 61  nt sqlite3_get_a
16b30 75 74 6f 63 6f 6d 6d 69 74 28 73 71 6c 69 74 65  utocommit(sqlite
16b40 33 20 2a 64 62 29 7b 0a 20 20 72 65 74 75 72 6e  3 *db){.  return
16b50 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69 74 3b   db->autoCommit;
16b60 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  .}../*.** The fo
16b70 6c 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73  llowing routines
16b80 20 61 72 65 20 73 75 62 73 74 69 74 75 74 65 73   are substitutes
16b90 20 66 6f 72 20 63 6f 6e 73 74 61 6e 74 73 20 53   for constants S
16ba0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 2a  QLITE_CORRUPT,.*
16bb0 2a 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 2c  * SQLITE_MISUSE,
16bc0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
16bd0 2c 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 61  , SQLITE_IOERR a
16be0 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 74 68 65  nd possibly othe
16bf0 72 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 6e 73 74  r error.** const
16c00 61 6e 74 73 2e 20 20 54 68 65 79 20 73 65 72 76  ants.  They serv
16c10 65 20 74 77 6f 20 70 75 72 70 6f 73 65 73 3a 0a  e two purposes:.
16c20 2a 2a 0a 2a 2a 20 20 20 31 2e 20 20 53 65 72 76  **.**   1.  Serv
16c30 65 20 61 73 20 61 20 63 6f 6e 76 65 6e 69 65 6e  e as a convenien
16c40 74 20 70 6c 61 63 65 20 74 6f 20 73 65 74 20 61  t place to set a
16c50 20 62 72 65 61 6b 70 6f 69 6e 74 20 69 6e 20 61   breakpoint in a
16c60 20 64 65 62 75 67 67 65 72 0a 2a 2a 20 20 20 20   debugger.**    
16c70 20 20 20 74 6f 20 64 65 74 65 63 74 20 77 68 65     to detect whe
16c80 6e 20 76 65 72 73 69 6f 6e 20 65 72 72 6f 72 20  n version error 
16c90 63 6f 6e 64 69 74 69 6f 6e 73 20 6f 63 63 75 72  conditions occur
16ca0 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e 20 20 49  s..**.**   2.  I
16cb0 6e 76 6f 6b 65 20 73 71 6c 69 74 65 33 5f 6c 6f  nvoke sqlite3_lo
16cc0 67 28 29 20 74 6f 20 70 72 6f 76 69 64 65 20 74  g() to provide t
16cd0 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 6c  he source code l
16ce0 6f 63 61 74 69 6f 6e 20 77 68 65 72 65 0a 2a 2a  ocation where.**
16cf0 20 20 20 20 20 20 20 61 20 6c 6f 77 2d 6c 65 76         a low-lev
16d00 65 6c 20 65 72 72 6f 72 20 69 73 20 66 69 72 73  el error is firs
16d10 74 20 64 65 74 65 63 74 65 64 2e 0a 2a 2f 0a 69  t detected..*/.i
16d20 6e 74 20 73 71 6c 69 74 65 33 43 6f 72 72 75 70  nt sqlite3Corrup
16d30 74 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e  tError(int linen
16d40 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28 20  o){.  testcase( 
16d50 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
16d60 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20  fig.xLog!=0 );. 
16d70 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c   sqlite3_log(SQL
16d80 49 54 45 5f 43 4f 52 52 55 50 54 2c 0a 20 20 20  ITE_CORRUPT,.   
16d90 20 20 20 20 20 20 20 20 20 20 20 22 64 61 74 61             "data
16da0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
16db0 61 74 20 6c 69 6e 65 20 25 64 20 6f 66 20 5b 25  at line %d of [%
16dc0 2e 31 30 73 5d 22 2c 0a 20 20 20 20 20 20 20 20  .10s]",.        
16dd0 20 20 20 20 20 20 6c 69 6e 65 6e 6f 2c 20 32 30        lineno, 20
16de0 2b 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69  +sqlite3_sourcei
16df0 64 28 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  d());.  return S
16e00 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 7d  QLITE_CORRUPT;.}
16e10 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 69 73 75  .int sqlite3Misu
16e20 73 65 45 72 72 6f 72 28 69 6e 74 20 6c 69 6e 65  seError(int line
16e30 6e 6f 29 7b 0a 20 20 74 65 73 74 63 61 73 65 28  no){.  testcase(
16e40 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
16e50 6e 66 69 67 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a  nfig.xLog!=0 );.
16e60 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51    sqlite3_log(SQ
16e70 4c 49 54 45 5f 4d 49 53 55 53 45 2c 20 0a 20 20  LITE_MISUSE, .  
16e80 20 20 20 20 20 20 20 20 20 20 20 20 22 6d 69 73              "mis
16e90 75 73 65 20 61 74 20 6c 69 6e 65 20 25 64 20 6f  use at line %d o
16ea0 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20 20  f [%.10s]",.    
16eb0 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e 6f            lineno
16ec0 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f 75  , 20+sqlite3_sou
16ed0 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74 75  rceid());.  retu
16ee0 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
16ef0 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 43  ;.}.int sqlite3C
16f00 61 6e 74 6f 70 65 6e 45 72 72 6f 72 28 69 6e 74  antopenError(int
16f10 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73 74   lineno){.  test
16f20 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c 6f  case( sqlite3Glo
16f30 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21 3d  balConfig.xLog!=
16f40 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6c  0 );.  sqlite3_l
16f50 6f 67 28 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  og(SQLITE_CANTOP
16f60 45 4e 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  EN, .           
16f70 20 20 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20     "cannot open 
16f80 66 69 6c 65 20 61 74 20 6c 69 6e 65 20 25 64 20  file at line %d 
16f90 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20 20 20  of [%.10s]",.   
16fa0 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65 6e             linen
16fb0 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f 73 6f  o, 20+sqlite3_so
16fc0 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72 65 74  urceid());.  ret
16fd0 75 72 6e 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  urn SQLITE_CANTO
16fe0 50 45 4e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66  PEN;.}...#ifndef
16ff0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 50   SQLITE_OMIT_DEP
17000 52 45 43 41 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68  RECATED./*.** Th
17010 69 73 20 69 73 20 61 20 63 6f 6e 76 65 6e 69 65  is is a convenie
17020 6e 63 65 20 72 6f 75 74 69 6e 65 20 74 68 61 74  nce routine that
17030 20 6d 61 6b 65 73 20 73 75 72 65 20 74 68 61 74   makes sure that
17040 20 61 6c 6c 20 74 68 72 65 61 64 2d 73 70 65 63   all thread-spec
17050 69 66 69 63 0a 2a 2a 20 64 61 74 61 20 66 6f 72  ific.** data for
17060 20 74 68 69 73 20 74 68 72 65 61 64 20 68 61 73   this thread has
17070 20 62 65 65 6e 20 64 65 61 6c 6c 6f 63 61 74 65   been deallocate
17080 64 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 69 74 65 20  d..**.** SQLite 
17090 6e 6f 20 6c 6f 6e 67 65 72 20 75 73 65 73 20 74  no longer uses t
170a0 68 72 65 61 64 2d 73 70 65 63 69 66 69 63 20 64  hread-specific d
170b0 61 74 61 20 73 6f 20 74 68 69 73 20 72 6f 75 74  ata so this rout
170c0 69 6e 65 20 69 73 20 6e 6f 77 20 61 0a 2a 2a 20  ine is now a.** 
170d0 6e 6f 2d 6f 70 2e 20 20 49 74 20 69 73 20 72 65  no-op.  It is re
170e0 74 61 69 6e 65 64 20 66 6f 72 20 68 69 73 74 6f  tained for histo
170f0 72 69 63 61 6c 20 63 6f 6d 70 61 74 69 62 69 6c  rical compatibil
17100 69 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ity..*/.void sql
17110 69 74 65 33 5f 74 68 72 65 61 64 5f 63 6c 65 61  ite3_thread_clea
17120 6e 75 70 28 76 6f 69 64 29 7b 0a 7d 0a 23 65 6e  nup(void){.}.#en
17130 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
17140 6e 20 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69  n meta informati
17150 6f 6e 20 61 62 6f 75 74 20 61 20 73 70 65 63 69  on about a speci
17160 66 69 63 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  fic column of a 
17170 64 61 74 61 62 61 73 65 20 74 61 62 6c 65 2e 0a  database table..
17180 2a 2a 20 53 65 65 20 63 6f 6d 6d 65 6e 74 20 69  ** See comment i
17190 6e 20 73 71 6c 69 74 65 33 2e 68 20 28 73 71 6c  n sqlite3.h (sql
171a0 69 74 65 2e 68 2e 69 6e 29 20 66 6f 72 20 64 65  ite.h.in) for de
171b0 74 61 69 6c 73 2e 0a 2a 2f 0a 23 69 66 64 65 66  tails..*/.#ifdef
171c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
171d0 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 69  OLUMN_METADATA.i
171e0 6e 74 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  nt sqlite3_table
171f0 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
17200 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
17210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17220 2f 2a 20 43 6f 6e 6e 65 63 74 69 6f 6e 20 68 61  /* Connection ha
17230 6e 64 6c 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ndle */.  const 
17240 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 2c 20 20  char *zDbName,  
17250 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
17260 65 20 6e 61 6d 65 20 6f 72 20 4e 55 4c 4c 20 2a  e name or NULL *
17270 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
17280 7a 54 61 62 6c 65 4e 61 6d 65 2c 20 20 20 20 20  zTableName,     
17290 2f 2a 20 54 61 62 6c 65 20 6e 61 6d 65 20 2a 2f  /* Table name */
172a0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
172b0 43 6f 6c 75 6d 6e 4e 61 6d 65 2c 20 20 20 20 2f  ColumnName,    /
172c0 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 20 2a 2f  * Column name */
172d0 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a  .  char const **
172e0 70 7a 44 61 74 61 54 79 70 65 2c 20 20 20 20 2f  pzDataType,    /
172f0 2a 20 4f 55 54 50 55 54 3a 20 44 65 63 6c 61 72  * OUTPUT: Declar
17300 65 64 20 64 61 74 61 20 74 79 70 65 20 2a 2f 0a  ed data type */.
17310 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 2a 70    char const **p
17320 7a 43 6f 6c 6c 53 65 71 2c 20 20 20 20 20 2f 2a  zCollSeq,     /*
17330 20 4f 55 54 50 55 54 3a 20 43 6f 6c 6c 61 74 69   OUTPUT: Collati
17340 6f 6e 20 73 65 71 75 65 6e 63 65 20 6e 61 6d 65  on sequence name
17350 20 2a 2f 0a 20 20 69 6e 74 20 2a 70 4e 6f 74 4e   */.  int *pNotN
17360 75 6c 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  ull,            
17370 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75    /* OUTPUT: Tru
17380 65 20 69 66 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f  e if NOT NULL co
17390 6e 73 74 72 61 69 6e 74 20 65 78 69 73 74 73 20  nstraint exists 
173a0 2a 2f 0a 20 20 69 6e 74 20 2a 70 50 72 69 6d 61  */.  int *pPrima
173b0 72 79 4b 65 79 2c 20 20 20 20 20 20 20 20 20 20  ryKey,          
173c0 20 2f 2a 20 4f 55 54 50 55 54 3a 20 54 72 75 65   /* OUTPUT: True
173d0 20 69 66 20 63 6f 6c 75 6d 6e 20 70 61 72 74 20   if column part 
173e0 6f 66 20 50 4b 20 2a 2f 0a 20 20 69 6e 74 20 2a  of PK */.  int *
173f0 70 41 75 74 6f 69 6e 63 20 20 20 20 20 20 20 20  pAutoinc        
17400 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54         /* OUTPUT
17410 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d 6e  : True if column
17420 20 69 73 20 61 75 74 6f 2d 69 6e 63 72 65 6d 65   is auto-increme
17430 6e 74 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72  nt */.){.  int r
17440 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  c;.  char *zErrM
17450 73 67 20 3d 20 30 3b 0a 20 20 54 61 62 6c 65 20  sg = 0;.  Table 
17460 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 43 6f 6c  *pTab = 0;.  Col
17470 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 30 3b 0a 20  umn *pCol = 0;. 
17480 20 69 6e 74 20 69 43 6f 6c 3b 0a 0a 20 20 63 68   int iCol;..  ch
17490 61 72 20 63 6f 6e 73 74 20 2a 7a 44 61 74 61 54  ar const *zDataT
174a0 79 70 65 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ype = 0;.  char 
174b0 63 6f 6e 73 74 20 2a 7a 43 6f 6c 6c 53 65 71 20  const *zCollSeq 
174c0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 6f 74 6e 75  = 0;.  int notnu
174d0 6c 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70 72  ll = 0;.  int pr
174e0 69 6d 61 72 79 6b 65 79 20 3d 20 30 3b 0a 20 20  imarykey = 0;.  
174f0 69 6e 74 20 61 75 74 6f 69 6e 63 20 3d 20 30 3b  int autoinc = 0;
17500 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65 20 74 68  ..  /* Ensure th
17510 65 20 64 61 74 61 62 61 73 65 20 73 63 68 65 6d  e database schem
17520 61 20 68 61 73 20 62 65 65 6e 20 6c 6f 61 64 65  a has been loade
17530 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 6d  d */.  sqlite3_m
17540 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
17550 75 74 65 78 29 3b 0a 20 20 73 71 6c 69 74 65 33  utex);.  sqlite3
17560 42 74 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62  BtreeEnterAll(db
17570 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
17580 33 49 6e 69 74 28 64 62 2c 20 26 7a 45 72 72 4d  3Init(db, &zErrM
17590 73 67 29 3b 0a 20 20 69 66 28 20 53 51 4c 49 54  sg);.  if( SQLIT
175a0 45 5f 4f 4b 21 3d 72 63 20 29 7b 0a 20 20 20 20  E_OK!=rc ){.    
175b0 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
175c0 20 20 7d 0a 0a 20 20 2f 2a 20 4c 6f 63 61 74 65    }..  /* Locate
175d0 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 71 75   the table in qu
175e0 65 73 74 69 6f 6e 20 2a 2f 0a 20 20 70 54 61 62  estion */.  pTab
175f0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 54 61   = sqlite3FindTa
17600 62 6c 65 28 64 62 2c 20 7a 54 61 62 6c 65 4e 61  ble(db, zTableNa
17610 6d 65 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20  me, zDbName);.  
17620 69 66 28 20 21 70 54 61 62 20 7c 7c 20 70 54 61  if( !pTab || pTa
17630 62 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  b->pSelect ){.  
17640 20 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20    pTab = 0;.    
17650 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b 0a  goto error_out;.
17660 20 20 7d 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74    }..  /* Find t
17670 68 65 20 63 6f 6c 75 6d 6e 20 66 6f 72 20 77 68  he column for wh
17680 69 63 68 20 69 6e 66 6f 20 69 73 20 72 65 71 75  ich info is requ
17690 65 73 74 65 64 20 2a 2f 0a 20 20 69 66 28 20 73  ested */.  if( s
176a0 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
176b0 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20  olumnName) ){.  
176c0 20 20 69 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 69    iCol = pTab->i
176d0 50 4b 65 79 3b 0a 20 20 20 20 69 66 28 20 69 43  PKey;.    if( iC
176e0 6f 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ol>=0 ){.      p
176f0 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
17700 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 7d 0a 20  l[iCol];.    }. 
17710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28   }else{.    for(
17720 69 43 6f 6c 3d 30 3b 20 69 43 6f 6c 3c 70 54 61  iCol=0; iCol<pTa
17730 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 29  b->nCol; iCol++)
17740 7b 0a 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26  {.      pCol = &
17750 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d  pTab->aCol[iCol]
17760 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73  ;.      if( 0==s
17770 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
17780 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 75  ol->zName, zColu
17790 6d 6e 4e 61 6d 65 29 20 29 7b 0a 20 20 20 20 20  mnName) ){.     
177a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
177b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
177c0 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 6e 43 6f 6c  iCol==pTab->nCol
177d0 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20 3d   ){.      pTab =
177e0 20 30 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65   0;.      goto e
177f0 72 72 6f 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  rror_out;.    }.
17800 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f    }..  /* The fo
17810 6c 6c 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 73 74  llowing block st
17820 6f 72 65 73 20 74 68 65 20 6d 65 74 61 20 69 6e  ores the meta in
17830 66 6f 72 6d 61 74 69 6f 6e 20 74 68 61 74 20 77  formation that w
17840 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 0a  ill be returned.
17850 20 20 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c    ** to the call
17860 65 72 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69  er in local vari
17870 61 62 6c 65 73 20 7a 44 61 74 61 54 79 70 65 2c  ables zDataType,
17880 20 7a 43 6f 6c 6c 53 65 71 2c 20 6e 6f 74 6e 75   zCollSeq, notnu
17890 6c 6c 2c 20 70 72 69 6d 61 72 79 6b 65 79 0a 20  ll, primarykey. 
178a0 20 2a 2a 20 61 6e 64 20 61 75 74 6f 69 6e 63 2e   ** and autoinc.
178b0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
178c0 68 65 72 65 20 61 72 65 20 74 77 6f 20 70 6f 73  here are two pos
178d0 73 69 62 69 6c 69 74 69 65 73 3a 0a 20 20 2a 2a  sibilities:.  **
178e0 20 0a 20 20 2a 2a 20 20 20 20 20 31 2e 20 54 68   .  **     1. Th
178f0 65 20 73 70 65 63 69 66 69 65 64 20 63 6f 6c 75  e specified colu
17900 6d 6e 20 6e 61 6d 65 20 77 61 73 20 72 6f 77 69  mn name was rowi
17910 64 22 2c 20 22 6f 69 64 22 20 6f 72 20 22 5f 72  d", "oid" or "_r
17920 6f 77 69 64 5f 22 20 0a 20 20 2a 2a 20 20 20 20  owid_" .  **    
17930 20 20 20 20 61 6e 64 20 74 68 65 72 65 20 69 73      and there is
17940 20 6e 6f 20 65 78 70 6c 69 63 69 74 6c 79 20 64   no explicitly d
17950 65 63 6c 61 72 65 64 20 49 50 4b 20 63 6f 6c 75  eclared IPK colu
17960 6d 6e 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  mn. .  **.  **  
17970 20 20 20 32 2e 20 54 68 65 20 74 61 62 6c 65 20     2. The table 
17980 69 73 20 6e 6f 74 20 61 20 76 69 65 77 20 61 6e  is not a view an
17990 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  d the column nam
179a0 65 20 69 64 65 6e 74 69 66 69 65 64 20 61 6e 20  e identified an 
179b0 0a 20 20 2a 2a 20 20 20 20 20 20 20 20 65 78 70  .  **        exp
179c0 6c 69 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64  licitly declared
179d0 20 63 6f 6c 75 6d 6e 2e 20 43 6f 70 79 20 6d 65   column. Copy me
179e0 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ta information f
179f0 72 6f 6d 20 2a 70 43 6f 6c 2e 0a 20 20 2a 2f 20  rom *pCol..  */ 
17a00 0a 20 20 69 66 28 20 70 43 6f 6c 20 29 7b 0a 20  .  if( pCol ){. 
17a10 20 20 20 7a 44 61 74 61 54 79 70 65 20 3d 20 70     zDataType = p
17a20 43 6f 6c 2d 3e 7a 54 79 70 65 3b 0a 20 20 20 20  Col->zType;.    
17a30 7a 43 6f 6c 6c 53 65 71 20 3d 20 70 43 6f 6c 2d  zCollSeq = pCol-
17a40 3e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 6e 6f 74 6e  >zColl;.    notn
17a50 75 6c 6c 20 3d 20 70 43 6f 6c 2d 3e 6e 6f 74 4e  ull = pCol->notN
17a60 75 6c 6c 21 3d 30 3b 0a 20 20 20 20 70 72 69 6d  ull!=0;.    prim
17a70 61 72 79 6b 65 79 20 20 3d 20 28 70 43 6f 6c 2d  arykey  = (pCol-
17a80 3e 63 6f 6c 46 6c 61 67 73 20 26 20 43 4f 4c 46  >colFlags & COLF
17a90 4c 41 47 5f 50 52 49 4d 4b 45 59 29 21 3d 30 3b  LAG_PRIMKEY)!=0;
17aa0 0a 20 20 20 20 61 75 74 6f 69 6e 63 20 3d 20 70  .    autoinc = p
17ab0 54 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c  Tab->iPKey==iCol
17ac0 20 26 26 20 28 70 54 61 62 2d 3e 74 61 62 46 6c   && (pTab->tabFl
17ad0 61 67 73 20 26 20 54 46 5f 41 75 74 6f 69 6e 63  ags & TF_Autoinc
17ae0 72 65 6d 65 6e 74 29 21 3d 30 3b 0a 20 20 7d 65  rement)!=0;.  }e
17af0 6c 73 65 7b 0a 20 20 20 20 7a 44 61 74 61 54 79  lse{.    zDataTy
17b00 70 65 20 3d 20 22 49 4e 54 45 47 45 52 22 3b 0a  pe = "INTEGER";.
17b10 20 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 3d      primarykey =
17b20 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a   1;.  }.  if( !z
17b30 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 7a  CollSeq ){.    z
17b40 43 6f 6c 6c 53 65 71 20 3d 20 22 42 49 4e 41 52  CollSeq = "BINAR
17b50 59 22 3b 0a 20 20 7d 0a 0a 65 72 72 6f 72 5f 6f  Y";.  }..error_o
17b60 75 74 3a 0a 20 20 73 71 6c 69 74 65 33 42 74 72  ut:.  sqlite3Btr
17b70 65 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a  eeLeaveAll(db);.
17b80 0a 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68  .  /* Whether th
17b90 65 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20  e function call 
17ba0 73 75 63 63 65 65 64 65 64 20 6f 72 20 66 61 69  succeeded or fai
17bb0 6c 65 64 2c 20 73 65 74 20 74 68 65 20 6f 75 74  led, set the out
17bc0 70 75 74 20 70 61 72 61 6d 65 74 65 72 73 0a 20  put parameters. 
17bd0 20 2a 2a 20 74 6f 20 77 68 61 74 65 76 65 72 20   ** to whatever 
17be0 74 68 65 69 72 20 6c 6f 63 61 6c 20 63 6f 75 6e  their local coun
17bf0 74 65 72 70 61 72 74 73 20 63 6f 6e 74 61 69 6e  terparts contain
17c00 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 64 69  . If an error di
17c10 64 20 6f 63 63 75 72 2c 0a 20 20 2a 2a 20 74 68  d occur,.  ** th
17c20 69 73 20 68 61 73 20 74 68 65 20 65 66 66 65 63  is has the effec
17c30 74 20 6f 66 20 7a 65 72 6f 69 6e 67 20 61 6c 6c  t of zeroing all
17c40 20 6f 75 74 70 75 74 20 70 61 72 61 6d 65 74 65   output paramete
17c50 72 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  rs..  */.  if( p
17c60 7a 44 61 74 61 54 79 70 65 20 29 20 2a 70 7a 44  zDataType ) *pzD
17c70 61 74 61 54 79 70 65 20 3d 20 7a 44 61 74 61 54  ataType = zDataT
17c80 79 70 65 3b 0a 20 20 69 66 28 20 70 7a 43 6f 6c  ype;.  if( pzCol
17c90 6c 53 65 71 20 29 20 2a 70 7a 43 6f 6c 6c 53 65  lSeq ) *pzCollSe
17ca0 71 20 3d 20 7a 43 6f 6c 6c 53 65 71 3b 0a 20 20  q = zCollSeq;.  
17cb0 69 66 28 20 70 4e 6f 74 4e 75 6c 6c 20 29 20 2a  if( pNotNull ) *
17cc0 70 4e 6f 74 4e 75 6c 6c 20 3d 20 6e 6f 74 6e 75  pNotNull = notnu
17cd0 6c 6c 3b 0a 20 20 69 66 28 20 70 50 72 69 6d 61  ll;.  if( pPrima
17ce0 72 79 4b 65 79 20 29 20 2a 70 50 72 69 6d 61 72  ryKey ) *pPrimar
17cf0 79 4b 65 79 20 3d 20 70 72 69 6d 61 72 79 6b 65  yKey = primaryke
17d00 79 3b 0a 20 20 69 66 28 20 70 41 75 74 6f 69 6e  y;.  if( pAutoin
17d10 63 20 29 20 2a 70 41 75 74 6f 69 6e 63 20 3d 20  c ) *pAutoinc = 
17d20 61 75 74 6f 69 6e 63 3b 0a 0a 20 20 69 66 28 20  autoinc;..  if( 
17d30 53 51 4c 49 54 45 5f 4f 4b 3d 3d 72 63 20 26 26  SQLITE_OK==rc &&
17d40 20 21 70 54 61 62 20 29 7b 0a 20 20 20 20 73 71   !pTab ){.    sq
17d50 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
17d60 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 7a 45  zErrMsg);.    zE
17d70 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d  rrMsg = sqlite3M
17d80 50 72 69 6e 74 66 28 64 62 2c 20 22 6e 6f 20 73  Printf(db, "no s
17d90 75 63 68 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  uch table column
17da0 3a 20 25 73 2e 25 73 22 2c 20 7a 54 61 62 6c 65  : %s.%s", zTable
17db0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 7a 43  Name,.        zC
17dc0 6f 6c 75 6d 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  olumnName);.    
17dd0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
17de0 52 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  R;.  }.  sqlite3
17df0 45 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c  ErrorWithMsg(db,
17e00 20 72 63 2c 20 28 7a 45 72 72 4d 73 67 3f 22 25   rc, (zErrMsg?"%
17e10 73 22 3a 30 29 2c 20 7a 45 72 72 4d 73 67 29 3b  s":0), zErrMsg);
17e20 0a 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65  .  sqlite3DbFree
17e30 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  (db, zErrMsg);. 
17e40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69   rc = sqlite3Api
17e50 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20  Exit(db, rc);.  
17e60 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
17e70 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ave(db->mutex);.
17e80 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
17e90 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65  endif../*.** Sle
17ea0 65 70 20 66 6f 72 20 61 20 6c 69 74 74 6c 65 20  ep for a little 
17eb0 77 68 69 6c 65 2e 20 20 52 65 74 75 72 6e 20 74  while.  Return t
17ec0 68 65 20 61 6d 6f 75 6e 74 20 6f 66 20 74 69 6d  he amount of tim
17ed0 65 20 73 6c 65 70 74 2e 0a 2a 2f 0a 69 6e 74 20  e slept..*/.int 
17ee0 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 69 6e  sqlite3_sleep(in
17ef0 74 20 6d 73 29 7b 0a 20 20 73 71 6c 69 74 65 33  t ms){.  sqlite3
17f00 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20 20 69 6e  _vfs *pVfs;.  in
17f10 74 20 72 63 3b 0a 20 20 70 56 66 73 20 3d 20 73  t rc;.  pVfs = s
17f20 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28  qlite3_vfs_find(
17f30 30 29 3b 0a 20 20 69 66 28 20 70 56 66 73 3d 3d  0);.  if( pVfs==
17f40 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20  0 ) return 0;.. 
17f50 20 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f   /* This functio
17f60 6e 20 77 6f 72 6b 73 20 69 6e 20 6d 69 6c 6c 69  n works in milli
17f70 73 65 63 6f 6e 64 73 2c 20 62 75 74 20 74 68 65  seconds, but the
17f80 20 75 6e 64 65 72 6c 79 69 6e 67 20 4f 73 53 6c   underlying OsSl
17f90 65 65 70 28 29 20 0a 20 20 2a 2a 20 41 50 49 20  eep() .  ** API 
17fa0 75 73 65 73 20 6d 69 63 72 6f 73 65 63 6f 6e 64  uses microsecond
17fb0 73 2e 20 48 65 6e 63 65 20 74 68 65 20 31 30 30  s. Hence the 100
17fc0 30 27 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  0's..  */.  rc =
17fd0 20 28 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70   (sqlite3OsSleep
17fe0 28 70 56 66 73 2c 20 31 30 30 30 2a 6d 73 29 2f  (pVfs, 1000*ms)/
17ff0 31 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  1000);.  return 
18000 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61  rc;.}../*.** Ena
18010 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20 74  ble or disable t
18020 68 65 20 65 78 74 65 6e 64 65 64 20 72 65 73 75  he extended resu
18030 6c 74 20 63 6f 64 65 73 2e 0a 2a 2f 0a 69 6e 74  lt codes..*/.int
18040 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
18050 64 5f 72 65 73 75 6c 74 5f 63 6f 64 65 73 28 73  d_result_codes(s
18060 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
18070 6f 6e 6f 66 66 29 7b 0a 20 20 73 71 6c 69 74 65  onoff){.  sqlite
18080 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
18090 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
180a0 65 72 72 4d 61 73 6b 20 3d 20 6f 6e 6f 66 66 20  errMask = onoff 
180b0 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 30  ? 0xffffffff : 0
180c0 78 66 66 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  xff;.  sqlite3_m
180d0 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
180e0 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
180f0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
18100 0a 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 78  .** Invoke the x
18110 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 6d 65 74 68  FileControl meth
18120 6f 64 20 6f 6e 20 61 20 70 61 72 74 69 63 75 6c  od on a particul
18130 61 72 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  ar database..*/.
18140 69 6e 74 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  int sqlite3_file
18150 5f 63 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33  _control(sqlite3
18160 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72   *db, const char
18170 20 2a 7a 44 62 4e 61 6d 65 2c 20 69 6e 74 20 6f   *zDbName, int o
18180 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a  p, void *pArg){.
18190 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
181a0 45 5f 45 52 52 4f 52 3b 0a 20 20 42 74 72 65 65  E_ERROR;.  Btree
181b0 20 2a 70 42 74 72 65 65 3b 0a 0a 20 20 73 71 6c   *pBtree;..  sql
181c0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
181d0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
181e0 42 74 72 65 65 20 3d 20 73 71 6c 69 74 65 33 44  Btree = sqlite3D
181f0 62 4e 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c  bNameToBtree(db,
18200 20 7a 44 62 4e 61 6d 65 29 3b 0a 20 20 69 66 28   zDbName);.  if(
18210 20 70 42 74 72 65 65 20 29 7b 0a 20 20 20 20 50   pBtree ){.    P
18220 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20  ager *pPager;.  
18230 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
18240 66 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42  fd;.    sqlite3B
18250 74 72 65 65 45 6e 74 65 72 28 70 42 74 72 65 65  treeEnter(pBtree
18260 29 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  );.    pPager = 
18270 73 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65  sqlite3BtreePage
18280 72 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 61  r(pBtree);.    a
18290 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
182a0 20 29 3b 0a 20 20 20 20 66 64 20 3d 20 73 71 6c   );.    fd = sql
182b0 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 70 50  ite3PagerFile(pP
182c0 61 67 65 72 29 3b 0a 20 20 20 20 61 73 73 65 72  ager);.    asser
182d0 74 28 20 66 64 21 3d 30 20 29 3b 0a 20 20 20 20  t( fd!=0 );.    
182e0 69 66 28 20 6f 70 3d 3d 53 51 4c 49 54 45 5f 46  if( op==SQLITE_F
182f0 43 4e 54 4c 5f 46 49 4c 45 5f 50 4f 49 4e 54 45  CNTL_FILE_POINTE
18300 52 20 29 7b 0a 20 20 20 20 20 20 2a 28 73 71 6c  R ){.      *(sql
18310 69 74 65 33 5f 66 69 6c 65 2a 2a 29 70 41 72 67  ite3_file**)pArg
18320 20 3d 20 66 64 3b 0a 20 20 20 20 20 20 72 63 20   = fd;.      rc 
18330 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
18340 20 7d 65 6c 73 65 20 69 66 28 20 66 64 2d 3e 70   }else if( fd->p
18350 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
18360 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
18370 69 6c 65 43 6f 6e 74 72 6f 6c 28 66 64 2c 20 6f  ileControl(fd, o
18380 70 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 7d 65  p, pArg);.    }e
18390 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
183a0 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3b  SQLITE_NOTFOUND;
183b0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
183c0 65 33 42 74 72 65 65 4c 65 61 76 65 28 70 42 74  e3BtreeLeave(pBt
183d0 72 65 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ree);.  }.  sqli
183e0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
183f0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65  db->mutex);.  re
18400 74 75 72 6e 20 72 63 3b 20 20 20 0a 7d 0a 0a 2f  turn rc;   .}../
18410 2a 0a 2a 2a 20 49 6e 74 65 72 66 61 63 65 20 74  *.** Interface t
18420 6f 20 74 68 65 20 74 65 73 74 69 6e 67 20 6c 6f  o the testing lo
18430 67 69 63 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  gic..*/.int sqli
18440 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
18450 28 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20  (int op, ...){. 
18460 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 23 69 66   int rc = 0;.#if
18470 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
18480 5f 42 55 49 4c 54 49 4e 5f 54 45 53 54 0a 20 20  _BUILTIN_TEST.  
18490 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 61  va_list ap;.  va
184a0 5f 73 74 61 72 74 28 61 70 2c 20 6f 70 29 3b 0a  _start(ap, op);.
184b0 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
184c0 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 53  .    /*.    ** S
184d0 61 76 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ave the current 
184e0 73 74 61 74 65 20 6f 66 20 74 68 65 20 50 52 4e  state of the PRN
184f0 47 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  G..    */.    ca
18500 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
18510 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 20 7b 0a  RL_PRNG_SAVE: {.
18520 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 72 6e        sqlite3Prn
18530 67 53 61 76 65 53 74 61 74 65 28 29 3b 0a 20 20  gSaveState();.  
18540 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18550 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
18560 52 65 73 74 6f 72 65 20 74 68 65 20 73 74 61 74  Restore the stat
18570 65 20 6f 66 20 74 68 65 20 50 52 4e 47 20 74 6f  e of the PRNG to
18580 20 74 68 65 20 6c 61 73 74 20 73 74 61 74 65 20   the last state 
18590 73 61 76 65 64 20 75 73 69 6e 67 0a 20 20 20 20  saved using.    
185a0 2a 2a 20 50 52 4e 47 5f 53 41 56 45 2e 20 20 49  ** PRNG_SAVE.  I
185b0 66 20 50 52 4e 47 5f 53 41 56 45 20 68 61 73 20  f PRNG_SAVE has 
185c0 6e 65 76 65 72 20 62 65 66 6f 72 65 20 62 65 65  never before bee
185d0 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 0a 20  n called, then. 
185e0 20 20 20 2a 2a 20 74 68 69 73 20 76 65 72 62 20     ** this verb 
185f0 61 63 74 73 20 6c 69 6b 65 20 50 52 4e 47 5f 52  acts like PRNG_R
18600 45 53 45 54 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ESET..    */.   
18610 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
18620 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 54 4f  TCTRL_PRNG_RESTO
18630 52 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  RE: {.      sqli
18640 74 65 33 50 72 6e 67 52 65 73 74 6f 72 65 53 74  te3PrngRestoreSt
18650 61 74 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65  ate();.      bre
18660 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
18670 2a 0a 20 20 20 20 2a 2a 20 52 65 73 65 74 20 74  *.    ** Reset t
18680 68 65 20 50 52 4e 47 20 62 61 63 6b 20 74 6f 20  he PRNG back to 
18690 69 74 73 20 75 6e 69 6e 69 74 69 61 6c 69 7a 65  its uninitialize
186a0 64 20 73 74 61 74 65 2e 20 20 54 68 65 20 6e 65  d state.  The ne
186b0 78 74 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74  xt call.    ** t
186c0 6f 20 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d  o sqlite3_random
186d0 6e 65 73 73 28 29 20 77 69 6c 6c 20 72 65 73 65  ness() will rese
186e0 65 64 20 74 68 65 20 50 52 4e 47 20 75 73 69 6e  ed the PRNG usin
186f0 67 20 61 20 73 69 6e 67 6c 65 20 63 61 6c 6c 0a  g a single call.
18700 20 20 20 20 2a 2a 20 74 6f 20 74 68 65 20 78 52      ** to the xR
18710 61 6e 64 6f 6d 6e 65 73 73 20 6d 65 74 68 6f 64  andomness method
18720 20 6f 66 20 74 68 65 20 64 65 66 61 75 6c 74 20   of the default 
18730 56 46 53 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  VFS..    */.    
18740 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
18750 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 3a  CTRL_PRNG_RESET:
18760 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
18770 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 30 2c 30 29  _randomness(0,0)
18780 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
18790 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
187a0 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73   **  sqlite3_tes
187b0 74 5f 63 6f 6e 74 72 6f 6c 28 42 49 54 56 45 43  t_control(BITVEC
187c0 5f 54 45 53 54 2c 20 73 69 7a 65 2c 20 70 72 6f  _TEST, size, pro
187d0 67 72 61 6d 29 0a 20 20 20 20 2a 2a 0a 20 20 20  gram).    **.   
187e0 20 2a 2a 20 52 75 6e 20 61 20 74 65 73 74 20 61   ** Run a test a
187f0 67 61 69 6e 73 74 20 61 20 42 69 74 76 65 63 20  gainst a Bitvec 
18800 6f 62 6a 65 63 74 20 6f 66 20 73 69 7a 65 2e 20  object of size. 
18810 20 54 68 65 20 70 72 6f 67 72 61 6d 20 61 72 67   The program arg
18820 75 6d 65 6e 74 0a 20 20 20 20 2a 2a 20 69 73 20  ument.    ** is 
18830 61 6e 20 61 72 72 61 79 20 6f 66 20 69 6e 74 65  an array of inte
18840 67 65 72 73 20 74 68 61 74 20 64 65 66 69 6e 65  gers that define
18850 73 20 74 68 65 20 74 65 73 74 2e 20 20 52 65 74  s the test.  Ret
18860 75 72 6e 20 2d 31 20 6f 6e 20 61 0a 20 20 20 20  urn -1 on a.    
18870 2a 2a 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61  ** memory alloca
18880 74 69 6f 6e 20 65 72 72 6f 72 2c 20 30 20 6f 6e  tion error, 0 on
18890 20 73 75 63 63 65 73 73 2c 20 6f 72 20 6e 6f 6e   success, or non
188a0 2d 7a 65 72 6f 20 66 6f 72 20 61 6e 20 65 72 72  -zero for an err
188b0 6f 72 2e 0a 20 20 20 20 2a 2a 20 53 65 65 20 74  or..    ** See t
188c0 68 65 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  he sqlite3Bitvec
188d0 42 75 69 6c 74 69 6e 54 65 73 74 28 29 20 66 6f  BuiltinTest() fo
188e0 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
188f0 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
18900 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
18910 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43  _TESTCTRL_BITVEC
18920 5f 54 45 53 54 3a 20 7b 0a 20 20 20 20 20 20 69  _TEST: {.      i
18930 6e 74 20 73 7a 20 3d 20 76 61 5f 61 72 67 28 61  nt sz = va_arg(a
18940 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 69  p, int);.      i
18950 6e 74 20 2a 61 50 72 6f 67 20 3d 20 76 61 5f 61  nt *aProg = va_a
18960 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b 0a 20 20  rg(ap, int*);.  
18970 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18980 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65 73  BitvecBuiltinTes
18990 74 28 73 7a 2c 20 61 50 72 6f 67 29 3b 0a 20 20  t(sz, aProg);.  
189a0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
189b0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
189c0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
189d0 6e 74 72 6f 6c 28 46 41 55 4c 54 5f 49 4e 53 54  ntrol(FAULT_INST
189e0 41 4c 4c 2c 20 78 43 61 6c 6c 62 61 63 6b 29 0a  ALL, xCallback).
189f0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 72      **.    ** Ar
18a00 72 61 6e 67 65 20 74 6f 20 69 6e 76 6f 6b 65 20  range to invoke 
18a10 78 43 61 6c 6c 62 61 63 6b 28 29 20 77 68 65 6e  xCallback() when
18a20 65 76 65 72 20 73 71 6c 69 74 65 33 46 61 75 6c  ever sqlite3Faul
18a30 74 53 69 6d 28 29 20 69 73 20 63 61 6c 6c 65 64  tSim() is called
18a40 2c 0a 20 20 20 20 2a 2a 20 69 66 20 78 43 61 6c  ,.    ** if xCal
18a50 6c 62 61 63 6b 20 69 73 20 6e 6f 74 20 4e 55 4c  lback is not NUL
18a60 4c 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  L..    **.    **
18a70 20 41 73 20 61 20 74 65 73 74 20 6f 66 20 74 68   As a test of th
18a80 65 20 66 61 75 6c 74 20 73 69 6d 75 6c 61 74 6f  e fault simulato
18a90 72 20 6d 65 63 68 61 6e 69 73 6d 20 69 74 73 65  r mechanism itse
18aa0 6c 66 2c 20 73 71 6c 69 74 65 33 46 61 75 6c 74  lf, sqlite3Fault
18ab0 53 69 6d 28 30 29 0a 20 20 20 20 2a 2a 20 69 73  Sim(0).    ** is
18ac0 20 63 61 6c 6c 65 64 20 69 6d 6d 65 64 69 61 74   called immediat
18ad0 65 6c 79 20 61 66 74 65 72 20 69 6e 73 74 61 6c  ely after instal
18ae0 6c 69 6e 67 20 74 68 65 20 6e 65 77 20 63 61 6c  ling the new cal
18af0 6c 62 61 63 6b 20 61 6e 64 20 74 68 65 20 72 65  lback and the re
18b00 74 75 72 6e 0a 20 20 20 20 2a 2a 20 76 61 6c 75  turn.    ** valu
18b10 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 46 61  e from sqlite3Fa
18b20 75 6c 74 53 69 6d 28 30 29 20 62 65 63 6f 6d 65  ultSim(0) become
18b30 73 20 74 68 65 20 72 65 74 75 72 6e 20 66 72 6f  s the return fro
18b40 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  m.    ** sqlite3
18b50 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 29 2e  _test_control().
18b60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
18b70 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
18b80 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c 3a 20  _FAULT_INSTALL: 
18b90 7b 0a 20 20 20 20 20 20 2f 2a 20 4d 53 56 43 20  {.      /* MSVC 
18ba0 69 73 20 70 69 63 6b 79 20 61 62 6f 75 74 20 70  is picky about p
18bb0 75 6c 6c 69 6e 67 20 66 75 6e 63 20 70 74 72 73  ulling func ptrs
18bc0 20 66 72 6f 6d 20 76 61 20 6c 69 73 74 73 2e 0a   from va lists..
18bd0 20 20 20 20 20 20 2a 2a 20 68 74 74 70 3a 2f 2f        ** http://
18be0 73 75 70 70 6f 72 74 2e 6d 69 63 72 6f 73 6f 66  support.microsof
18bf0 74 2e 63 6f 6d 2f 6b 62 2f 34 37 39 36 31 0a 20  t.com/kb/47961. 
18c00 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 47       ** sqlite3G
18c10 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73  lobalConfig.xTes
18c20 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61  tCallback = va_a
18c30 72 67 28 61 70 2c 20 69 6e 74 28 2a 29 28 69 6e  rg(ap, int(*)(in
18c40 74 29 29 3b 0a 20 20 20 20 20 20 2a 2f 0a 20 20  t));.      */.  
18c50 20 20 20 20 74 79 70 65 64 65 66 20 69 6e 74 28      typedef int(
18c60 2a 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e  *TESTCALLBACKFUN
18c70 43 5f 74 29 28 69 6e 74 29 3b 0a 20 20 20 20 20  C_t)(int);.     
18c80 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
18c90 6e 66 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61  nfig.xTestCallba
18ca0 63 6b 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ck = va_arg(ap, 
18cb0 54 45 53 54 43 41 4c 4c 42 41 43 4b 46 55 4e 43  TESTCALLBACKFUNC
18cc0 5f 74 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  _t);.      rc = 
18cd0 73 71 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28  sqlite3FaultSim(
18ce0 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
18cf0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
18d00 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f 74     **  sqlite3_t
18d10 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 42 45 4e 49  est_control(BENI
18d20 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c  GN_MALLOC_HOOKS,
18d30 20 78 42 65 67 69 6e 2c 20 78 45 6e 64 29 0a 20   xBegin, xEnd). 
18d40 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 67     **.    ** Reg
18d50 69 73 74 65 72 20 68 6f 6f 6b 73 20 74 6f 20 63  ister hooks to c
18d60 61 6c 6c 20 74 6f 20 69 6e 64 69 63 61 74 65 20  all to indicate 
18d70 77 68 69 63 68 20 6d 61 6c 6c 6f 63 28 29 20 66  which malloc() f
18d80 61 69 6c 75 72 65 73 20 0a 20 20 20 20 2a 2a 20  ailures .    ** 
18d90 61 72 65 20 62 65 6e 69 67 6e 2e 0a 20 20 20 20  are benign..    
18da0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
18db0 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49  TE_TESTCTRL_BENI
18dc0 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 3a  GN_MALLOC_HOOKS:
18dd0 20 7b 0a 20 20 20 20 20 20 74 79 70 65 64 65 66   {.      typedef
18de0 20 76 6f 69 64 20 28 2a 76 6f 69 64 5f 66 75 6e   void (*void_fun
18df0 63 74 69 6f 6e 29 28 76 6f 69 64 29 3b 0a 20 20  ction)(void);.  
18e00 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74 69 6f      void_functio
18e10 6e 20 78 42 65 6e 69 67 6e 42 65 67 69 6e 3b 0a  n xBenignBegin;.
18e20 20 20 20 20 20 20 76 6f 69 64 5f 66 75 6e 63 74        void_funct
18e30 69 6f 6e 20 78 42 65 6e 69 67 6e 45 6e 64 3b 0a  ion xBenignEnd;.
18e40 20 20 20 20 20 20 78 42 65 6e 69 67 6e 42 65 67        xBenignBeg
18e50 69 6e 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  in = va_arg(ap, 
18e60 76 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a  void_function);.
18e70 20 20 20 20 20 20 78 42 65 6e 69 67 6e 45 6e 64        xBenignEnd
18e80 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
18e90 69 64 5f 66 75 6e 63 74 69 6f 6e 29 3b 0a 20 20  id_function);.  
18ea0 20 20 20 20 73 71 6c 69 74 65 33 42 65 6e 69 67      sqlite3Benig
18eb0 6e 4d 61 6c 6c 6f 63 48 6f 6f 6b 73 28 78 42 65  nMallocHooks(xBe
18ec0 6e 69 67 6e 42 65 67 69 6e 2c 20 78 42 65 6e 69  nignBegin, xBeni
18ed0 67 6e 45 6e 64 29 3b 0a 20 20 20 20 20 20 62 72  gnEnd);.      br
18ee0 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
18ef0 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74  /*.    **  sqlit
18f00 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
18f10 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
18f20 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 75 6e  PENDING_BYTE, un
18f30 73 69 67 6e 65 64 20 69 6e 74 20 58 29 0a 20 20  signed int X).  
18f40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20    **.    ** Set 
18f50 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
18f60 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 69 6e   to the value in
18f70 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2c 20 69   the argument, i
18f80 66 20 58 3e 30 2e 0a 20 20 20 20 2a 2a 20 4d 61  f X>0..    ** Ma
18f90 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66  ke no changes if
18fa0 20 58 3d 3d 30 2e 20 20 52 65 74 75 72 6e 20 74   X==0.  Return t
18fb0 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
18fc0 70 65 6e 64 69 6e 67 20 62 79 74 65 0a 20 20 20  pending byte.   
18fd0 20 2a 2a 20 61 73 20 69 74 20 65 78 69 73 74 69   ** as it existi
18fe0 6e 67 20 62 65 66 6f 72 65 20 74 68 69 73 20 72  ng before this r
18ff0 6f 75 74 69 6e 65 20 77 61 73 20 63 61 6c 6c 65  outine was calle
19000 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
19010 20 49 4d 50 4f 52 54 41 4e 54 3a 20 20 43 68 61   IMPORTANT:  Cha
19020 6e 67 69 6e 67 20 74 68 65 20 50 45 4e 44 49 4e  nging the PENDIN
19030 47 20 62 79 74 65 20 66 72 6f 6d 20 30 78 34 30  G byte from 0x40
19040 30 30 30 30 30 30 20 72 65 73 75 6c 74 73 20 69  000000 results i
19050 6e 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f  n.    ** an inco
19060 6d 70 61 74 69 62 6c 65 20 64 61 74 61 62 61 73  mpatible databas
19070 65 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 20 20  e file format.  
19080 43 68 61 6e 67 69 6e 67 20 74 68 65 20 50 45 4e  Changing the PEN
19090 44 49 4e 47 20 62 79 74 65 0a 20 20 20 20 2a 2a  DING byte.    **
190a0 20 77 68 69 6c 65 20 61 6e 79 20 64 61 74 61 62   while any datab
190b0 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69  ase connection i
190c0 73 20 6f 70 65 6e 20 72 65 73 75 6c 74 73 20 69  s open results i
190d0 6e 20 75 6e 64 65 66 69 6e 65 64 20 61 6e 64 0a  n undefined and.
190e0 20 20 20 20 2a 2a 20 64 65 6c 65 74 65 72 69 6f      ** deleterio
190f0 75 73 20 62 65 68 61 76 69 6f 72 2e 0a 20 20 20  us behavior..   
19100 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
19110 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45 4e  ITE_TESTCTRL_PEN
19120 44 49 4e 47 5f 42 59 54 45 3a 20 7b 0a 20 20 20  DING_BYTE: {.   
19130 20 20 20 72 63 20 3d 20 50 45 4e 44 49 4e 47 5f     rc = PENDING_
19140 42 59 54 45 3b 0a 23 69 66 6e 64 65 66 20 53 51  BYTE;.#ifndef SQ
19150 4c 49 54 45 5f 4f 4d 49 54 5f 57 53 44 0a 20 20  LITE_OMIT_WSD.  
19160 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 75 6e      {.        un
19170 73 69 67 6e 65 64 20 69 6e 74 20 6e 65 77 56 61  signed int newVa
19180 6c 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 75  l = va_arg(ap, u
19190 6e 73 69 67 6e 65 64 20 69 6e 74 29 3b 0a 20 20  nsigned int);.  
191a0 20 20 20 20 20 20 69 66 28 20 6e 65 77 56 61 6c        if( newVal
191b0 20 29 20 73 71 6c 69 74 65 33 50 65 6e 64 69 6e   ) sqlite3Pendin
191c0 67 42 79 74 65 20 3d 20 6e 65 77 56 61 6c 3b 0a  gByte = newVal;.
191d0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
191e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
191f0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
19200 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
19210 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
19220 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 69  STCTRL_ASSERT, i
19230 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20  nt X).    **.   
19240 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e 20   ** This action 
19250 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d 74  provides a run-t
19260 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65 20  ime test to see 
19270 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 0a 20  whether or not. 
19280 20 20 20 2a 2a 20 61 73 73 65 72 74 28 29 20 77     ** assert() w
19290 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  as enabled at co
192a0 6d 70 69 6c 65 2d 74 69 6d 65 2e 20 20 49 66 20  mpile-time.  If 
192b0 58 20 69 73 20 74 72 75 65 20 61 6e 64 20 61 73  X is true and as
192c0 73 65 72 74 28 29 0a 20 20 20 20 2a 2a 20 69 73  sert().    ** is
192d0 20 65 6e 61 62 6c 65 64 2c 20 74 68 65 6e 20 74   enabled, then t
192e0 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
192f0 69 73 20 74 72 75 65 2e 20 20 49 66 20 58 20 69  is true.  If X i
19300 73 20 74 72 75 65 20 61 6e 64 0a 20 20 20 20 2a  s true and.    *
19310 2a 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69  * assert() is di
19320 73 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65  sabled, then the
19330 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
19340 20 7a 65 72 6f 2e 20 20 49 66 20 58 20 69 73 0a   zero.  If X is.
19350 20 20 20 20 2a 2a 20 66 61 6c 73 65 20 61 6e 64      ** false and
19360 20 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61   assert() is ena
19370 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 20 61  bled, then the a
19380 73 73 65 72 74 69 6f 6e 20 66 69 72 65 73 20 61  ssertion fires a
19390 6e 64 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 72  nd the.    ** pr
193a0 6f 63 65 73 73 20 61 62 6f 72 74 73 2e 20 20 49  ocess aborts.  I
193b0 66 20 58 20 69 73 20 66 61 6c 73 65 20 61 6e 64  f X is false and
193c0 20 61 73 73 65 72 74 28 29 20 69 73 20 64 69 73   assert() is dis
193d0 61 62 6c 65 64 2c 20 74 68 65 6e 20 74 68 65 0a  abled, then the.
193e0 20 20 20 20 2a 2a 20 72 65 74 75 72 6e 20 76 61      ** return va
193f0 6c 75 65 20 69 73 20 7a 65 72 6f 2e 0a 20 20 20  lue is zero..   
19400 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
19410 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53  ITE_TESTCTRL_ASS
19420 45 52 54 3a 20 7b 0a 20 20 20 20 20 20 76 6f 6c  ERT: {.      vol
19430 61 74 69 6c 65 20 69 6e 74 20 78 20 3d 20 30 3b  atile int x = 0;
19440 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
19450 78 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e  x = va_arg(ap,in
19460 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  t))!=0 );.      
19470 72 63 20 3d 20 78 3b 0a 20 20 20 20 20 20 62 72  rc = x;.      br
19480 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  eak;.    }...   
19490 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
194a0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
194b0 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
194c0 5f 41 4c 57 41 59 53 2c 20 69 6e 74 20 58 29 0a  _ALWAYS, int X).
194d0 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
194e0 69 73 20 61 63 74 69 6f 6e 20 70 72 6f 76 69 64  is action provid
194f0 65 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 74 65  es a run-time te
19500 73 74 20 74 6f 20 73 65 65 20 68 6f 77 20 74 68  st to see how th
19510 65 20 41 4c 57 41 59 53 20 61 6e 64 0a 20 20 20  e ALWAYS and.   
19520 20 2a 2a 20 4e 45 56 45 52 20 6d 61 63 72 6f 73   ** NEVER macros
19530 20 77 65 72 65 20 64 65 66 69 6e 65 64 20 61 74   were defined at
19540 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2e 0a 20   compile-time.. 
19550 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
19560 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
19570 20 41 4c 57 41 59 53 28 58 29 2e 20 20 0a 20 20   ALWAYS(X).  .  
19580 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
19590 72 65 63 6f 6d 6d 65 6e 64 65 64 20 74 65 73 74  recommended test
195a0 20 69 73 20 58 3d 3d 32 2e 20 20 49 66 20 74 68   is X==2.  If th
195b0 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
195c0 73 20 32 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a  s 2, that means.
195d0 20 20 20 20 2a 2a 20 41 4c 57 41 59 53 28 29 20      ** ALWAYS() 
195e0 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72 65 20  and NEVER() are 
195f0 62 6f 74 68 20 6e 6f 2d 6f 70 20 70 61 73 73 2d  both no-op pass-
19600 74 68 72 6f 75 67 68 20 6d 61 63 72 6f 73 2c 20  through macros, 
19610 77 68 69 63 68 20 69 73 20 74 68 65 0a 20 20 20  which is the.   
19620 20 2a 2a 20 64 65 66 61 75 6c 74 20 73 65 74 74   ** default sett
19630 69 6e 67 2e 20 20 49 66 20 74 68 65 20 72 65 74  ing.  If the ret
19640 75 72 6e 20 76 61 6c 75 65 20 69 73 20 31 2c 20  urn value is 1, 
19650 74 68 65 6e 20 41 4c 57 41 59 53 28 29 20 69 73  then ALWAYS() is
19660 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 68   either.    ** h
19670 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74 72 75  ard-coded to tru
19680 65 20 6f 72 20 65 6c 73 65 20 69 74 20 61 73 73  e or else it ass
19690 65 72 74 73 20 69 66 20 69 74 73 20 61 72 67 75  erts if its argu
196a0 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2e 0a 20  ment is false.. 
196b0 20 20 20 2a 2a 20 54 68 65 20 66 69 72 73 74 20     ** The first 
196c0 62 65 68 61 76 69 6f 72 20 28 68 61 72 64 2d 63  behavior (hard-c
196d0 6f 64 65 64 20 74 6f 20 74 72 75 65 29 20 69 73  oded to true) is
196e0 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20 20   the case if.   
196f0 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54 43   ** SQLITE_TESTC
19700 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77 73  TRL_ASSERT shows
19710 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20 69   that assert() i
19720 73 20 64 69 73 61 62 6c 65 64 20 61 6e 64 20 74  s disabled and t
19730 68 65 20 73 65 63 6f 6e 64 0a 20 20 20 20 2a 2a  he second.    **
19740 20 62 65 68 61 76 69 6f 72 20 28 61 73 73 65 72   behavior (asser
19750 74 20 69 66 20 74 68 65 20 61 72 67 75 6d 65 6e  t if the argumen
19760 74 20 74 6f 20 41 4c 57 41 59 53 28 29 20 69 73  t to ALWAYS() is
19770 20 66 61 6c 73 65 29 20 69 73 20 74 68 65 20 63   false) is the c
19780 61 73 65 20 69 66 0a 20 20 20 20 2a 2a 20 53 51  ase if.    ** SQ
19790 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
197a0 53 45 52 54 20 73 68 6f 77 73 20 74 68 61 74 20  SERT shows that 
197b0 61 73 73 65 72 74 28 29 20 69 73 20 65 6e 61 62  assert() is enab
197c0 6c 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  led..    **.    
197d0 2a 2a 20 54 68 65 20 72 75 6e 2d 74 69 6d 65 20  ** The run-time 
197e0 74 65 73 74 20 70 72 6f 63 65 64 75 72 65 20 6d  test procedure m
197f0 69 67 68 74 20 6c 6f 6f 6b 20 73 6f 6d 65 74 68  ight look someth
19800 69 6e 67 20 6c 69 6b 65 20 74 68 69 73 3a 0a 20  ing like this:. 
19810 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
19820 69 66 28 20 73 71 6c 69 74 65 33 5f 74 65 73 74  if( sqlite3_test
19830 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
19840 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c  TESTCTRL_ALWAYS,
19850 20 32 29 3d 3d 32 20 29 7b 0a 20 20 20 20 2a 2a   2)==2 ){.    **
19860 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
19870 29 20 61 6e 64 20 4e 45 56 45 52 28 29 20 61 72  ) and NEVER() ar
19880 65 20 6e 6f 2d 6f 70 20 70 61 73 73 2d 74 68 72  e no-op pass-thr
19890 6f 75 67 68 20 6d 61 63 72 6f 73 0a 20 20 20 20  ough macros.    
198a0 2a 2a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  **    }else if( 
198b0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
198c0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
198d0 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 31 29 20  CTRL_ASSERT, 1) 
198e0 29 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f  ){.    **      /
198f0 2f 20 41 4c 57 41 59 53 28 78 29 20 61 73 73 65  / ALWAYS(x) asse
19900 72 74 73 20 74 68 61 74 20 78 20 69 73 20 74 72  rts that x is tr
19910 75 65 2e 20 4e 45 56 45 52 28 78 29 20 61 73 73  ue. NEVER(x) ass
19920 65 72 74 73 20 78 20 69 73 20 66 61 6c 73 65 2e  erts x is false.
19930 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c 73 65  .    **    }else
19940 7b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f  {.    **      //
19950 20 41 4c 57 41 59 53 28 78 29 20 69 73 20 61 20   ALWAYS(x) is a 
19960 63 6f 6e 73 74 61 6e 74 20 31 2e 20 20 4e 45 56  constant 1.  NEV
19970 45 52 28 78 29 20 69 73 20 61 20 63 6f 6e 73 74  ER(x) is a const
19980 61 6e 74 20 30 2e 0a 20 20 20 20 2a 2a 20 20 20  ant 0..    **   
19990 20 7d 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61   }.    */.    ca
199a0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
199b0 52 4c 5f 41 4c 57 41 59 53 3a 20 7b 0a 20 20 20  RL_ALWAYS: {.   
199c0 20 20 20 69 6e 74 20 78 20 3d 20 76 61 5f 61 72     int x = va_ar
199d0 67 28 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20  g(ap,int);.     
199e0 20 72 63 20 3d 20 41 4c 57 41 59 53 28 78 29 3b   rc = ALWAYS(x);
199f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19a00 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
19a10 2a 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  **   sqlite3_tes
19a20 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
19a30 5f 54 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52  _TESTCTRL_BYTEOR
19a40 44 45 52 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  DER);.    **.   
19a50 20 2a 2a 20 54 68 65 20 69 6e 74 65 67 65 72 20   ** The integer 
19a60 72 65 74 75 72 6e 65 64 20 72 65 76 65 61 6c 73  returned reveals
19a70 20 74 68 65 20 62 79 74 65 2d 6f 72 64 65 72 20   the byte-order 
19a80 6f 66 20 74 68 65 20 63 6f 6d 70 75 74 65 72 20  of the computer 
19a90 6f 6e 20 77 68 69 63 68 0a 20 20 20 20 2a 2a 20  on which.    ** 
19aa0 53 51 4c 69 74 65 20 69 73 20 72 75 6e 6e 69 6e  SQLite is runnin
19ab0 67 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  g:.    **.    **
19ac0 20 20 20 20 20 20 20 31 20 20 20 20 20 62 69 67         1     big
19ad0 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65 74 65  -endian,    dete
19ae0 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69  rmined at run-ti
19af0 6d 65 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 31  me.    **      1
19b00 30 20 20 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64  0     little-end
19b10 69 61 6e 2c 20 64 65 74 65 72 6d 69 6e 65 64 20  ian, determined 
19b20 61 74 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20  at run-time.    
19b30 2a 2a 20 20 34 33 32 31 30 31 20 20 20 20 20 62  **  432101     b
19b40 69 67 2d 65 6e 64 69 61 6e 2c 20 20 20 20 64 65  ig-endian,    de
19b50 74 65 72 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70  termined at comp
19b60 69 6c 65 2d 74 69 6d 65 0a 20 20 20 20 2a 2a 20  ile-time.    ** 
19b70 20 31 32 33 34 31 30 20 20 20 20 20 6c 69 74 74   123410     litt
19b80 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65 72  le-endian, deter
19b90 6d 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65  mined at compile
19ba0 2d 74 69 6d 65 0a 20 20 20 20 2a 2f 20 0a 20 20  -time.    */ .  
19bb0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
19bc0 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52  STCTRL_BYTEORDER
19bd0 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  : {.      rc = S
19be0 51 4c 49 54 45 5f 42 59 54 45 4f 52 44 45 52 2a  QLITE_BYTEORDER*
19bf0 31 30 30 20 2b 20 53 51 4c 49 54 45 5f 4c 49 54  100 + SQLITE_LIT
19c00 54 4c 45 45 4e 44 49 41 4e 2a 31 30 20 2b 20 53  TLEENDIAN*10 + S
19c10 51 4c 49 54 45 5f 42 49 47 45 4e 44 49 41 4e 3b  QLITE_BIGENDIAN;
19c20 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19c30 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71    }..    /*   sq
19c40 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
19c50 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
19c60 52 4c 5f 52 45 53 45 52 56 45 2c 20 73 71 6c 69  RL_RESERVE, sqli
19c70 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a  te3 *db, int N).
19c80 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65      **.    ** Se
19c90 74 20 74 68 65 20 6e 52 65 73 65 72 76 65 20 73  t the nReserve s
19ca0 69 7a 65 20 74 6f 20 4e 20 66 6f 72 20 74 68 65  ize to N for the
19cb0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 6f   main database o
19cc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  n the database. 
19cd0 20 20 20 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e     ** connection
19ce0 20 64 62 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   db..    */.    
19cf0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
19d00 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 20 7b 0a  CTRL_RESERVE: {.
19d10 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64        sqlite3 *d
19d20 62 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 73  b = va_arg(ap, s
19d30 71 6c 69 74 65 33 2a 29 3b 0a 20 20 20 20 20 20  qlite3*);.      
19d40 69 6e 74 20 78 20 3d 20 76 61 5f 61 72 67 28 61  int x = va_arg(a
19d50 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 73 71  p,int);.      sq
19d60 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
19d70 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
19d80 20 20 20 20 73 71 6c 69 74 65 33 42 74 72 65 65      sqlite3Btree
19d90 53 65 74 50 61 67 65 53 69 7a 65 28 64 62 2d 3e  SetPageSize(db->
19da0 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c 20 78  aDb[0].pBt, 0, x
19db0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
19dc0 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
19dd0 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20  db->mutex);.    
19de0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
19df0 20 20 20 20 2f 2a 20 20 73 71 6c 69 74 65 33 5f      /*  sqlite3_
19e00 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
19e10 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54  ITE_TESTCTRL_OPT
19e20 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 73 71 6c 69  IMIZATIONS, sqli
19e30 74 65 33 20 2a 64 62 2c 20 69 6e 74 20 4e 29 0a  te3 *db, int N).
19e40 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 45 6e      **.    ** En
19e50 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65 20  able or disable 
19e60 76 61 72 69 6f 75 73 20 6f 70 74 69 6d 69 7a 61  various optimiza
19e70 74 69 6f 6e 73 20 66 6f 72 20 74 65 73 74 69 6e  tions for testin
19e80 67 20 70 75 72 70 6f 73 65 73 2e 20 20 54 68 65  g purposes.  The
19e90 20 0a 20 20 20 20 2a 2a 20 61 72 67 75 6d 65 6e   .    ** argumen
19ea0 74 20 4e 20 69 73 20 61 20 62 69 74 6d 61 73 6b  t N is a bitmask
19eb0 20 6f 66 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e   of optimization
19ec0 73 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  s to be disabled
19ed0 2e 20 20 46 6f 72 20 6e 6f 72 6d 61 6c 0a 20 20  .  For normal.  
19ee0 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 4e    ** operation N
19ef0 20 73 68 6f 75 6c 64 20 62 65 20 30 2e 20 20 54   should be 0.  T
19f00 68 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20  he idea is that 
19f10 61 20 74 65 73 74 20 70 72 6f 67 72 61 6d 20 28  a test program (
19f20 6c 69 6b 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  like the.    ** 
19f30 53 51 4c 20 4c 6f 67 69 63 20 54 65 73 74 20 6f  SQL Logic Test o
19f40 72 20 53 4c 54 20 74 65 73 74 20 6d 6f 64 75 6c  r SLT test modul
19f50 65 29 20 63 61 6e 20 72 75 6e 20 74 68 65 20 73  e) can run the s
19f60 61 6d 65 20 53 51 4c 20 6d 75 6c 74 69 70 6c 65  ame SQL multiple
19f70 20 74 69 6d 65 73 0a 20 20 20 20 2a 2a 20 77 69   times.    ** wi
19f80 74 68 20 76 61 72 69 6f 75 73 20 6f 70 74 69 6d  th various optim
19f90 69 7a 61 74 69 6f 6e 73 20 64 69 73 61 62 6c 65  izations disable
19fa0 64 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  d to verify that
19fb0 20 74 68 65 20 73 61 6d 65 20 61 6e 73 77 65 72   the same answer
19fc0 0a 20 20 20 20 2a 2a 20 69 73 20 6f 62 74 61 69  .    ** is obtai
19fd0 6e 65 64 20 69 6e 20 65 76 65 72 79 20 63 61 73  ned in every cas
19fe0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  e..    */.    ca
19ff0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1a000 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53  RL_OPTIMIZATIONS
1a010 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1a020 33 20 2a 64 62 20 3d 20 76 61 5f 61 72 67 28 61  3 *db = va_arg(a
1a030 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  p, sqlite3*);.  
1a040 20 20 20 20 64 62 2d 3e 64 62 4f 70 74 46 6c 61      db->dbOptFla
1a050 67 73 20 3d 20 28 75 31 36 29 28 76 61 5f 61 72  gs = (u16)(va_ar
1a060 67 28 61 70 2c 20 69 6e 74 29 20 26 20 30 78 66  g(ap, int) & 0xf
1a070 66 66 66 29 3b 0a 20 20 20 20 20 20 62 72 65 61  fff);.      brea
1a080 6b 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66  k;.    }..#ifdef
1a090 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52   SQLITE_N_KEYWOR
1a0a0 44 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33  D.    /* sqlite3
1a0b0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
1a0c0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53  LITE_TESTCTRL_IS
1a0d0 4b 45 59 57 4f 52 44 2c 20 63 6f 6e 73 74 20 63  KEYWORD, const c
1a0e0 68 61 72 20 2a 7a 57 6f 72 64 29 0a 20 20 20 20  har *zWord).    
1a0f0 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 7a 57 6f  **.    ** If zWo
1a100 72 64 20 69 73 20 61 20 6b 65 79 77 6f 72 64 20  rd is a keyword 
1a110 72 65 63 6f 67 6e 69 7a 65 64 20 62 79 20 74 68  recognized by th
1a120 65 20 70 61 72 73 65 72 2c 20 74 68 65 6e 20 72  e parser, then r
1a130 65 74 75 72 6e 20 74 68 65 0a 20 20 20 20 2a 2a  eturn the.    **
1a140 20 6e 75 6d 62 65 72 20 6f 66 20 6b 65 79 77 6f   number of keywo
1a150 72 64 73 2e 20 20 4f 72 20 69 66 20 7a 57 6f 72  rds.  Or if zWor
1a160 64 20 69 73 20 6e 6f 74 20 61 20 6b 65 79 77 6f  d is not a keywo
1a170 72 64 2c 20 72 65 74 75 72 6e 20 30 2e 0a 20 20  rd, return 0..  
1a180 20 20 2a 2a 20 0a 20 20 20 20 2a 2a 20 54 68 69    ** .    ** Thi
1a190 73 20 74 65 73 74 20 66 65 61 74 75 72 65 20 69  s test feature i
1a1a0 73 20 6f 6e 6c 79 20 61 76 61 69 6c 61 62 6c 65  s only available
1a1b0 20 69 6e 20 74 68 65 20 61 6d 61 6c 67 61 6d 61   in the amalgama
1a1c0 74 69 6f 6e 20 73 69 6e 63 65 0a 20 20 20 20 2a  tion since.    *
1a1d0 2a 20 74 68 65 20 53 51 4c 49 54 45 5f 4e 5f 4b  * the SQLITE_N_K
1a1e0 45 59 57 4f 52 44 20 6d 61 63 72 6f 20 69 73 20  EYWORD macro is 
1a1f0 6e 6f 74 20 64 65 66 69 6e 65 64 20 69 6e 20 74  not defined in t
1a200 68 69 73 20 66 69 6c 65 20 69 66 20 53 51 4c 69  his file if SQLi
1a210 74 65 0a 20 20 20 20 2a 2a 20 69 73 20 62 75 69  te.    ** is bui
1a220 6c 74 20 75 73 69 6e 67 20 73 65 70 61 72 61 74  lt using separat
1a230 65 20 73 6f 75 72 63 65 20 66 69 6c 65 73 2e 0a  e source files..
1a240 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
1a250 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1a260 49 53 4b 45 59 57 4f 52 44 3a 20 7b 0a 20 20 20  ISKEYWORD: {.   
1a270 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1a280 57 6f 72 64 20 3d 20 76 61 5f 61 72 67 28 61 70  Word = va_arg(ap
1a290 2c 20 63 6f 6e 73 74 20 63 68 61 72 2a 29 3b 0a  , const char*);.
1a2a0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 71        int n = sq
1a2b0 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 57  lite3Strlen30(zW
1a2c0 6f 72 64 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ord);.      rc =
1a2d0 20 28 73 71 6c 69 74 65 33 4b 65 79 77 6f 72 64   (sqlite3Keyword
1a2e0 43 6f 64 65 28 28 75 38 2a 29 7a 57 6f 72 64 2c  Code((u8*)zWord,
1a2f0 20 6e 29 21 3d 54 4b 5f 49 44 29 20 3f 20 53 51   n)!=TK_ID) ? SQ
1a300 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 3a  LITE_N_KEYWORD :
1a310 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
1a320 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 0a 0a  .    }.#endif ..
1a330 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74      /* sqlite3_t
1a340 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
1a350 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43 52 41  TE_TESTCTRL_SCRA
1a360 54 43 48 4d 41 4c 4c 4f 43 2c 20 73 7a 2c 20 26  TCHMALLOC, sz, &
1a370 70 4e 65 77 2c 20 70 46 72 65 65 29 3b 0a 20 20  pNew, pFree);.  
1a380 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 50 61 73 73    **.    ** Pass
1a390 20 70 46 72 65 65 20 69 6e 74 6f 20 73 71 6c 69   pFree into sqli
1a3a0 74 65 33 53 63 72 61 74 63 68 46 72 65 65 28 29  te3ScratchFree()
1a3b0 2e 20 0a 20 20 20 20 2a 2a 20 49 66 20 73 7a 3e  . .    ** If sz>
1a3c0 30 20 74 68 65 6e 20 61 6c 6c 6f 63 61 74 65 20  0 then allocate 
1a3d0 61 20 73 63 72 61 74 63 68 20 62 75 66 66 65 72  a scratch buffer
1a3e0 20 69 6e 74 6f 20 70 4e 65 77 2e 20 20 0a 20 20   into pNew.  .  
1a3f0 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51    */.    case SQ
1a400 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 43  LITE_TESTCTRL_SC
1a410 52 41 54 43 48 4d 41 4c 4c 4f 43 3a 20 7b 0a 20  RATCHMALLOC: {. 
1a420 20 20 20 20 20 76 6f 69 64 20 2a 70 46 72 65 65       void *pFree
1a430 2c 20 2a 2a 70 70 4e 65 77 3b 0a 20 20 20 20 20  , **ppNew;.     
1a440 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 73   int sz;.      s
1a450 7a 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  z = va_arg(ap, i
1a460 6e 74 29 3b 0a 20 20 20 20 20 20 70 70 4e 65 77  nt);.      ppNew
1a470 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f   = va_arg(ap, vo
1a480 69 64 2a 2a 29 3b 0a 20 20 20 20 20 20 70 46 72  id**);.      pFr
1a490 65 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20  ee = va_arg(ap, 
1a4a0 76 6f 69 64 2a 29 3b 0a 20 20 20 20 20 20 69 66  void*);.      if
1a4b0 28 20 73 7a 20 29 20 2a 70 70 4e 65 77 20 3d 20  ( sz ) *ppNew = 
1a4c0 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 4d 61  sqlite3ScratchMa
1a4d0 6c 6c 6f 63 28 73 7a 29 3b 0a 20 20 20 20 20 20  lloc(sz);.      
1a4e0 73 71 6c 69 74 65 33 53 63 72 61 74 63 68 46 72  sqlite3ScratchFr
1a4f0 65 65 28 70 46 72 65 65 29 3b 0a 20 20 20 20 20  ee(pFree);.     
1a500 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1a510 20 20 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f     /*   sqlite3_
1a520 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
1a530 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
1a540 41 4c 54 49 4d 45 5f 46 41 55 4c 54 2c 20 69 6e  ALTIME_FAULT, in
1a550 74 20 6f 6e 6f 66 66 29 3b 0a 20 20 20 20 2a 2a  t onoff);.    **
1a560 0a 20 20 20 20 2a 2a 20 49 66 20 70 61 72 61 6d  .    ** If param
1a570 65 74 65 72 20 6f 6e 6f 66 66 20 69 73 20 6e 6f  eter onoff is no
1a580 6e 2d 7a 65 72 6f 2c 20 63 6f 6e 66 69 67 75 72  n-zero, configur
1a590 65 20 74 68 65 20 77 72 61 70 70 65 72 73 20 73  e the wrappers s
1a5a0 6f 20 74 68 61 74 20 61 6c 6c 0a 20 20 20 20 2a  o that all.    *
1a5b0 2a 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * subsequent cal
1a5c0 6c 73 20 74 6f 20 6c 6f 63 61 6c 74 69 6d 65 28  ls to localtime(
1a5d0 29 20 61 6e 64 20 76 61 72 69 61 6e 74 73 20 66  ) and variants f
1a5e0 61 69 6c 2e 20 49 66 20 6f 6e 6f 66 66 20 69 73  ail. If onoff is
1a5f0 20 7a 65 72 6f 2c 0a 20 20 20 20 2a 2a 20 75 6e   zero,.    ** un
1a600 64 6f 20 74 68 69 73 20 73 65 74 74 69 6e 67 2e  do this setting.
1a610 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
1a620 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
1a630 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
1a640 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1a650 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4c  3GlobalConfig.bL
1a660 6f 63 61 6c 74 69 6d 65 46 61 75 6c 74 20 3d 20  ocaltimeFault = 
1a670 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b  va_arg(ap, int);
1a680 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1a690 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64    }..#if defined
1a6a0 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 54  (SQLITE_ENABLE_T
1a6b0 52 45 45 5f 45 58 50 4c 41 49 4e 29 0a 20 20 20  REE_EXPLAIN).   
1a6c0 20 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65   /*   sqlite3_te
1a6d0 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54  st_control(SQLIT
1a6e0 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50 4c 41  E_TESTCTRL_EXPLA
1a6f0 49 4e 5f 53 54 4d 54 2c 0a 20 20 20 20 2a 2a 20  IN_STMT,.    ** 
1a700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a710 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
1a720 74 6d 74 2a 2c 63 6f 6e 73 74 20 63 68 61 72 2a  tmt*,const char*
1a730 2a 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  *);.    **.    *
1a740 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 77 69  * If compiled wi
1a750 74 68 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  th SQLITE_ENABLE
1a760 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 2c 20 65  _TREE_EXPLAIN, e
1a770 61 63 68 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ach sqlite3_stmt
1a780 20 68 6f 6c 64 73 0a 20 20 20 20 2a 2a 20 61 20   holds.    ** a 
1a790 73 74 72 69 6e 67 20 74 68 61 74 20 64 65 73 63  string that desc
1a7a0 72 69 62 65 73 20 74 68 65 20 6f 70 74 69 6d 69  ribes the optimi
1a7b0 7a 65 64 20 70 61 72 73 65 20 74 72 65 65 2e 20  zed parse tree. 
1a7c0 20 54 68 69 73 20 74 65 73 74 2d 63 6f 6e 74 72   This test-contr
1a7d0 6f 6c 0a 20 20 20 20 2a 2a 20 72 65 74 75 72 6e  ol.    ** return
1a7e0 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
1a7f0 68 61 74 20 73 74 72 69 6e 67 2e 0a 20 20 20 20  hat string..    
1a800 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
1a810 54 45 5f 54 45 53 54 43 54 52 4c 5f 45 58 50 4c  TE_TESTCTRL_EXPL
1a820 41 49 4e 5f 53 54 4d 54 3a 20 7b 0a 20 20 20 20  AIN_STMT: {.    
1a830 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1a840 70 53 74 6d 74 20 3d 20 76 61 5f 61 72 67 28 61  pStmt = va_arg(a
1a850 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 2a  p, sqlite3_stmt*
1a860 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
1a870 68 61 72 20 2a 2a 70 7a 52 65 74 20 3d 20 76 61  har **pzRet = va
1a880 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63  _arg(ap, const c
1a890 68 61 72 2a 2a 29 3b 0a 20 20 20 20 20 20 2a 70  har**);.      *p
1a8a0 7a 52 65 74 20 3d 20 73 71 6c 69 74 65 33 56 64  zRet = sqlite3Vd
1a8b0 62 65 45 78 70 6c 61 6e 61 74 69 6f 6e 28 28 56  beExplanation((V
1a8c0 64 62 65 2a 29 70 53 74 6d 74 29 3b 0a 20 20 20  dbe*)pStmt);.   
1a8d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a8e0 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 20  #endif..    /*  
1a8f0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
1a900 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
1a910 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52  TCTRL_NEVER_CORR
1a920 55 50 54 2c 20 69 6e 74 29 3b 0a 20 20 20 20 2a  UPT, int);.    *
1a930 2a 0a 20 20 20 20 2a 2a 20 53 65 74 20 6f 72 20  *.    ** Set or 
1a940 63 6c 65 61 72 20 61 20 66 6c 61 67 20 74 68 61  clear a flag tha
1a950 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74  t indicates that
1a960 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a970 6c 65 20 69 73 20 61 6c 77 61 79 73 20 77 65 6c  le is always wel
1a980 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 65 64  l-.    ** formed
1a990 20 61 6e 64 20 6e 65 76 65 72 20 63 6f 72 72 75   and never corru
1a9a0 70 74 2e 20 20 54 68 69 73 20 66 6c 61 67 20 69  pt.  This flag i
1a9b0 73 20 63 6c 65 61 72 20 62 79 20 64 65 66 61 75  s clear by defau
1a9c0 6c 74 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  lt, indicating t
1a9d0 68 61 74 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  hat.    ** datab
1a9e0 61 73 65 20 66 69 6c 65 73 20 6d 69 67 68 74 20  ase files might 
1a9f0 68 61 76 65 20 61 72 62 69 74 72 61 72 79 20 63  have arbitrary c
1aa00 6f 72 72 75 70 74 69 6f 6e 2e 20 20 53 65 74 74  orruption.  Sett
1aa10 69 6e 67 20 74 68 65 20 66 6c 61 67 20 64 75 72  ing the flag dur
1aa20 69 6e 67 0a 20 20 20 20 2a 2a 20 74 65 73 74 69  ing.    ** testi
1aa30 6e 67 20 63 61 75 73 65 73 20 63 65 72 74 61 69  ng causes certai
1aa40 6e 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  n assert() state
1aa50 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 63 6f 64  ments in the cod
1aa60 65 20 74 6f 20 62 65 20 61 63 74 69 76 61 74 65  e to be activate
1aa70 64 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 64 65  d.    ** that de
1aa80 6d 6f 6e 73 74 72 61 74 20 69 6e 76 61 72 69 61  monstrat invaria
1aa90 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d 66 6f 72 6d  nts on well-form
1aaa0 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
1aab0 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
1aac0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
1aad0 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52 55 50 54  RL_NEVER_CORRUPT
1aae0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1aaf0 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 6e 65  3GlobalConfig.ne
1ab00 76 65 72 43 6f 72 72 75 70 74 20 3d 20 76 61 5f  verCorrupt = va_
1ab10 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1ab20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ab30 0a 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69  ...    /*   sqli
1ab40 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
1ab50 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
1ab60 5f 56 44 42 45 5f 43 4f 56 45 52 41 47 45 2c 20  _VDBE_COVERAGE, 
1ab70 78 43 61 6c 6c 62 61 63 6b 2c 20 70 74 72 29 3b  xCallback, ptr);
1ab80 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53  .    **.    ** S
1ab90 65 74 20 74 68 65 20 56 44 42 45 20 63 6f 76 65  et the VDBE cove
1aba0 72 61 67 65 20 63 61 6c 6c 62 61 63 6b 20 66 75  rage callback fu
1abb0 6e 63 74 69 6f 6e 20 74 6f 20 78 43 61 6c 6c 62  nction to xCallb
1abc0 61 63 6b 20 77 69 74 68 20 63 6f 6e 74 65 78 74  ack with context
1abd0 20 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 72   .    ** pointer
1abe0 20 70 74 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   ptr..    */.   
1abf0 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
1ac00 54 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52  TCTRL_VDBE_COVER
1ac10 41 47 45 3a 20 7b 0a 23 69 66 64 65 66 20 53 51  AGE: {.#ifdef SQ
1ac20 4c 49 54 45 5f 56 44 42 45 5f 43 4f 56 45 52 41  LITE_VDBE_COVERA
1ac30 47 45 0a 20 20 20 20 20 20 74 79 70 65 64 65 66  GE.      typedef
1ac40 20 76 6f 69 64 20 28 2a 62 72 61 6e 63 68 5f 63   void (*branch_c
1ac50 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69  allback)(void*,i
1ac60 6e 74 2c 75 38 2c 75 38 29 3b 0a 20 20 20 20 20  nt,u8,u8);.     
1ac70 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1ac80 6e 66 69 67 2e 78 56 64 62 65 42 72 61 6e 63 68  nfig.xVdbeBranch
1ac90 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 62 72 61   = va_arg(ap,bra
1aca0 6e 63 68 5f 63 61 6c 6c 62 61 63 6b 29 3b 0a 20  nch_callback);. 
1acb0 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1acc0 61 6c 43 6f 6e 66 69 67 2e 70 56 64 62 65 42 72  alConfig.pVdbeBr
1acd0 61 6e 63 68 41 72 67 20 3d 20 76 61 5f 61 72 67  anchArg = va_arg
1ace0 28 61 70 2c 76 6f 69 64 2a 29 3b 0a 23 65 6e 64  (ap,void*);.#end
1acf0 69 66 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  if.      break;.
1ad00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20      }..    /*   
1ad10 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1ad20 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1ad30 43 54 52 4c 5f 53 4f 52 54 45 52 5f 4d 4d 41 50  CTRL_SORTER_MMAP
1ad40 2c 20 64 62 2c 20 6e 4d 61 78 29 3b 20 2a 2f 0a  , db, nMax); */.
1ad50 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1ad60 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f  TESTCTRL_SORTER_
1ad70 4d 4d 41 50 3a 20 7b 0a 20 20 20 20 20 20 73 71  MMAP: {.      sq
1ad80 6c 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61  lite3 *db = va_a
1ad90 72 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29  rg(ap, sqlite3*)
1ada0 3b 0a 20 20 20 20 20 20 64 62 2d 3e 6e 4d 61 78  ;.      db->nMax
1adb0 53 6f 72 74 65 72 4d 6d 61 70 20 3d 20 76 61 5f  SorterMmap = va_
1adc0 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
1add0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1ade0 0a 0a 20 20 20 20 2f 2a 20 20 20 73 71 6c 69 74  ..    /*   sqlit
1adf0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
1ae00 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
1ae10 49 53 49 4e 49 54 29 3b 0a 20 20 20 20 2a 2a 0a  ISINIT);.    **.
1ae20 20 20 20 20 2a 2a 20 52 65 74 75 72 6e 20 53 51      ** Return SQ
1ae30 4c 49 54 45 5f 4f 4b 20 69 66 20 53 51 4c 69 74  LITE_OK if SQLit
1ae40 65 20 68 61 73 20 62 65 65 6e 20 69 6e 69 74 69  e has been initi
1ae50 61 6c 69 7a 65 64 20 61 6e 64 20 53 51 4c 49 54  alized and SQLIT
1ae60 45 5f 45 52 52 4f 52 20 69 66 0a 20 20 20 20 2a  E_ERROR if.    *
1ae70 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  * not..    */.  
1ae80 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1ae90 53 54 43 54 52 4c 5f 49 53 49 4e 49 54 3a 20 7b  STCTRL_ISINIT: {
1aea0 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
1aeb0 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 69  e3GlobalConfig.i
1aec0 73 49 6e 69 74 3d 3d 30 20 29 20 72 63 20 3d 20  sInit==0 ) rc = 
1aed0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
1aee0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1aef0 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
1af00 29 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  );.#endif /* SQL
1af10 49 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e  ITE_OMIT_BUILTIN
1af20 5f 54 45 53 54 20 2a 2f 0a 20 20 72 65 74 75 72  _TEST */.  retur
1af30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
1af40 68 69 73 20 69 73 20 61 20 75 74 69 6c 69 74 79  his is a utility
1af50 20 72 6f 75 74 69 6e 65 2c 20 75 73 65 66 75 6c   routine, useful
1af60 20 74 6f 20 56 46 53 20 69 6d 70 6c 65 6d 65 6e   to VFS implemen
1af70 74 61 74 69 6f 6e 73 2c 20 74 68 61 74 20 63 68  tations, that ch
1af80 65 63 6b 73 0a 2a 2a 20 74 6f 20 73 65 65 20 69  ecks.** to see i
1af90 66 20 61 20 64 61 74 61 62 61 73 65 20 66 69 6c  f a database fil
1afa0 65 20 77 61 73 20 61 20 55 52 49 20 74 68 61 74  e was a URI that
1afb0 20 63 6f 6e 74 61 69 6e 65 64 20 61 20 73 70 65   contained a spe
1afc0 63 69 66 69 63 20 71 75 65 72 79 20 0a 2a 2a 20  cific query .** 
1afd0 70 61 72 61 6d 65 74 65 72 2c 20 61 6e 64 20 69  parameter, and i
1afe0 66 20 73 6f 20 6f 62 74 61 69 6e 73 20 74 68 65  f so obtains the
1aff0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 71 75   value of the qu
1b000 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
1b010 2a 0a 2a 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61  *.** The zFilena
1b020 6d 65 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  me argument is t
1b030 68 65 20 66 69 6c 65 6e 61 6d 65 20 70 6f 69 6e  he filename poin
1b040 74 65 72 20 70 61 73 73 65 64 20 69 6e 74 6f 20  ter passed into 
1b050 74 68 65 20 78 4f 70 65 6e 28 29 0a 2a 2a 20 6d  the xOpen().** m
1b060 65 74 68 6f 64 20 6f 66 20 61 20 56 46 53 20 69  ethod of a VFS i
1b070 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 2e 20 20  mplementation.  
1b080 54 68 65 20 7a 50 61 72 61 6d 20 61 72 67 75 6d  The zParam argum
1b090 65 6e 74 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ent is the name 
1b0a0 6f 66 20 74 68 65 0a 2a 2a 20 71 75 65 72 79 20  of the.** query 
1b0b0 70 61 72 61 6d 65 74 65 72 20 77 65 20 73 65 65  parameter we see
1b0c0 6b 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  k.  This routine
1b0d0 20 72 65 74 75 72 6e 73 20 74 68 65 20 76 61 6c   returns the val
1b0e0 75 65 20 6f 66 20 74 68 65 20 7a 50 61 72 61 6d  ue of the zParam
1b0f0 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69 66  .** parameter if
1b100 20 69 74 20 65 78 69 73 74 73 2e 20 20 49 66 20   it exists.  If 
1b110 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 64 6f  the parameter do
1b120 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  es not exist, th
1b130 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
1b140 74 75 72 6e 73 20 61 20 4e 55 4c 4c 20 70 6f 69  turns a NULL poi
1b150 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  nter..*/.const c
1b160 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 75 72 69  har *sqlite3_uri
1b170 5f 70 61 72 61 6d 65 74 65 72 28 63 6f 6e 73 74  _parameter(const
1b180 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1b190 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
1b1a0 61 72 61 6d 29 7b 0a 20 20 69 66 28 20 7a 46 69  aram){.  if( zFi
1b1b0 6c 65 6e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75  lename==0 ) retu
1b1c0 72 6e 20 30 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d  rn 0;.  zFilenam
1b1d0 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  e += sqlite3Strl
1b1e0 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29 20  en30(zFilename) 
1b1f0 2b 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 7a 46  + 1;.  while( zF
1b200 69 6c 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 20 20  ilename[0] ){.  
1b210 20 20 69 6e 74 20 78 20 3d 20 73 74 72 63 6d 70    int x = strcmp
1b220 28 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50 61 72  (zFilename, zPar
1b230 61 6d 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61  am);.    zFilena
1b240 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53 74 72  me += sqlite3Str
1b250 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d 65 29  len30(zFilename)
1b260 20 2b 20 31 3b 0a 20 20 20 20 69 66 28 20 78 3d   + 1;.    if( x=
1b270 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 46 69 6c  =0 ) return zFil
1b280 65 6e 61 6d 65 3b 0a 20 20 20 20 7a 46 69 6c 65  ename;.    zFile
1b290 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33 53  name += sqlite3S
1b2a0 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61 6d  trlen30(zFilenam
1b2b0 65 29 20 2b 20 31 3b 0a 20 20 7d 0a 20 20 72 65  e) + 1;.  }.  re
1b2c0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1b2d0 20 52 65 74 75 72 6e 20 61 20 62 6f 6f 6c 65 61   Return a boolea
1b2e0 6e 20 76 61 6c 75 65 20 66 6f 72 20 61 20 71 75  n value for a qu
1b2f0 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  ery parameter..*
1b300 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 75 72  /.int sqlite3_ur
1b310 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f 6e 73 74 20  i_boolean(const 
1b320 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c  char *zFilename,
1b330 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
1b340 72 61 6d 2c 20 69 6e 74 20 62 44 66 6c 74 29 7b  ram, int bDflt){
1b350 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1b360 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 70   = sqlite3_uri_p
1b370 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61  arameter(zFilena
1b380 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20 62  me, zParam);.  b
1b390 44 66 6c 74 20 3d 20 62 44 66 6c 74 21 3d 30 3b  Dflt = bDflt!=0;
1b3a0 0a 20 20 72 65 74 75 72 6e 20 7a 20 3f 20 73 71  .  return z ? sq
1b3b0 6c 69 74 65 33 47 65 74 42 6f 6f 6c 65 61 6e 28  lite3GetBoolean(
1b3c0 7a 2c 20 62 44 66 6c 74 29 20 3a 20 62 44 66 6c  z, bDflt) : bDfl
1b3d0 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t;.}../*.** Retu
1b3e0 72 6e 20 61 20 36 34 2d 62 69 74 20 69 6e 74 65  rn a 64-bit inte
1b3f0 67 65 72 20 76 61 6c 75 65 20 66 6f 72 20 61 20  ger value for a 
1b400 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72 2e  query parameter.
1b410 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 69 6e 74 36  .*/.sqlite3_int6
1b420 34 20 73 71 6c 69 74 65 33 5f 75 72 69 5f 69 6e  4 sqlite3_uri_in
1b430 74 36 34 28 0a 20 20 63 6f 6e 73 74 20 63 68 61  t64(.  const cha
1b440 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
1b450 20 2f 2a 20 46 69 6c 65 6e 61 6d 65 20 61 73 20   /* Filename as 
1b460 70 61 73 73 65 64 20 74 6f 20 78 4f 70 65 6e 20  passed to xOpen 
1b470 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1b480 2a 7a 50 61 72 61 6d 2c 20 20 20 20 20 20 20 2f  *zParam,       /
1b490 2a 20 55 52 49 20 70 61 72 61 6d 65 74 65 72 20  * URI parameter 
1b4a0 73 6f 75 67 68 74 20 2a 2f 0a 20 20 73 71 6c 69  sought */.  sqli
1b4b0 74 65 33 5f 69 6e 74 36 34 20 62 44 66 6c 74 20  te3_int64 bDflt 
1b4c0 20 20 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20        /* return 
1b4d0 69 66 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  if parameter is 
1b4e0 6d 69 73 73 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20  missing */.){.  
1b4f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1b500 73 71 6c 69 74 65 33 5f 75 72 69 5f 70 61 72 61  sqlite3_uri_para
1b510 6d 65 74 65 72 28 7a 46 69 6c 65 6e 61 6d 65 2c  meter(zFilename,
1b520 20 7a 50 61 72 61 6d 29 3b 0a 20 20 73 71 6c 69   zParam);.  sqli
1b530 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 69  te3_int64 v;.  i
1b540 66 28 20 7a 20 26 26 20 73 71 6c 69 74 65 33 44  f( z && sqlite3D
1b550 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20  ecOrHexToI64(z, 
1b560 26 76 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  &v)==SQLITE_OK )
1b570 7b 0a 20 20 20 20 62 44 66 6c 74 20 3d 20 76 3b  {.    bDflt = v;
1b580 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 62 44  .  }.  return bD
1b590 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  flt;.}../*.** Re
1b5a0 74 75 72 6e 20 74 68 65 20 42 74 72 65 65 20 70  turn the Btree p
1b5b0 6f 69 6e 74 65 72 20 69 64 65 6e 74 69 66 69 65  ointer identifie
1b5c0 64 20 62 79 20 7a 44 62 4e 61 6d 65 2e 20 20 52  d by zDbName.  R
1b5d0 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 6e 6f  eturn NULL if no
1b5e0 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 42 74 72 65  t found..*/.Btre
1b5f0 65 20 2a 73 71 6c 69 74 65 33 44 62 4e 61 6d 65  e *sqlite3DbName
1b600 54 6f 42 74 72 65 65 28 73 71 6c 69 74 65 33 20  ToBtree(sqlite3 
1b610 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  *db, const char 
1b620 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 69 6e 74  *zDbName){.  int
1b630 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
1b640 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a  <db->nDb; i++){.
1b650 20 20 20 20 69 66 28 20 64 62 2d 3e 61 44 62 5b      if( db->aDb[
1b660 69 5d 2e 70 42 74 0a 20 20 20 20 20 26 26 20 28  i].pBt.     && (
1b670 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71  zDbName==0 || sq
1b680 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 44 62  lite3StrICmp(zDb
1b690 4e 61 6d 65 2c 20 64 62 2d 3e 61 44 62 5b 69 5d  Name, db->aDb[i]
1b6a0 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a 20 20 20 20  .zName)==0).    
1b6b0 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
1b6c0 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 3b 0a  db->aDb[i].pBt;.
1b6d0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1b6e0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  rn 0;.}../*.** R
1b6f0 65 74 75 72 6e 20 74 68 65 20 66 69 6c 65 6e 61  eturn the filena
1b700 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1b710 73 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  se associated wi
1b720 74 68 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a  th a database.**
1b730 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a   connection..*/.
1b740 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
1b750 74 65 33 5f 64 62 5f 66 69 6c 65 6e 61 6d 65 28  te3_db_filename(
1b760 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
1b770 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
1b780 29 7b 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20  ){.  Btree *pBt 
1b790 3d 20 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54  = sqlite3DbNameT
1b7a0 6f 42 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61  oBtree(db, zDbNa
1b7b0 6d 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  me);.  return pB
1b7c0 74 20 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65  t ? sqlite3Btree
1b7d0 47 65 74 46 69 6c 65 6e 61 6d 65 28 70 42 74 29  GetFilename(pBt)
1b7e0 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   : 0;.}../*.** R
1b7f0 65 74 75 72 6e 20 31 20 69 66 20 64 61 74 61 62  eturn 1 if datab
1b800 61 73 65 20 69 73 20 72 65 61 64 2d 6f 6e 6c 79  ase is read-only
1b810 20 6f 72 20 30 20 69 66 20 72 65 61 64 2f 77 72   or 0 if read/wr
1b820 69 74 65 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  ite.  Return -1 
1b830 69 66 0a 2a 2a 20 6e 6f 20 73 75 63 68 20 64 61  if.** no such da
1b840 74 61 62 61 73 65 20 65 78 69 73 74 73 2e 0a 2a  tabase exists..*
1b850 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 64 62  /.int sqlite3_db
1b860 5f 72 65 61 64 6f 6e 6c 79 28 73 71 6c 69 74 65  _readonly(sqlite
1b870 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63 68 61  3 *db, const cha
1b880 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20 20 42  r *zDbName){.  B
1b890 74 72 65 65 20 2a 70 42 74 20 3d 20 73 71 6c 69  tree *pBt = sqli
1b8a0 74 65 33 44 62 4e 61 6d 65 54 6f 42 74 72 65 65  te3DbNameToBtree
1b8b0 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29 3b 0a 20  (db, zDbName);. 
1b8c0 20 72 65 74 75 72 6e 20 70 42 74 20 3f 20 73 71   return pBt ? sq
1b8d0 6c 69 74 65 33 42 74 72 65 65 49 73 52 65 61 64  lite3BtreeIsRead
1b8e0 6f 6e 6c 79 28 70 42 74 29 20 3a 20 2d 31 3b 0a  only(pBt) : -1;.
1b8f0 7d 0a                                            }.