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

Artifact 8207ece1b4005b1efab55d1505d8ffb45bfced05:


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 2f 2a  k;.    }..    /*
4070: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
4080: 35 35 35 34 38 2d 33 33 38 31 37 20 54 68 65 20  55548-33817 The 
4090: 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 73 65 74  compile-time set
40a0: 74 69 6e 67 20 66 6f 72 20 55 52 49 20 66 69 6c  ting for URI fil
40b0: 65 6e 61 6d 65 73 0a 20 20 20 20 2a 2a 20 63 61  enames.    ** ca
40c0: 6e 20 62 65 20 63 68 61 6e 67 65 64 20 61 74 20  n be changed at 
40d0: 73 74 61 72 74 2d 74 69 6d 65 20 75 73 69 6e 67  start-time using
40e0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69   the.    ** sqli
40f0: 74 65 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54  te3_config(SQLIT
4100: 45 5f 43 4f 4e 46 49 47 5f 55 52 49 2c 31 29 20  E_CONFIG_URI,1) 
4110: 6f 72 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  or.    ** sqlite
4120: 33 5f 63 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f  3_config(SQLITE_
4130: 43 4f 4e 46 49 47 5f 55 52 49 2c 30 29 20 63 6f  CONFIG_URI,0) co
4140: 6e 66 69 67 75 72 61 74 69 6f 6e 20 63 61 6c 6c  nfiguration call
4150: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
4160: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  se SQLITE_CONFIG
4170: 5f 55 52 49 3a 20 7b 0a 20 20 20 20 20 20 73 71  _URI: {.      sq
4180: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4190: 67 2e 62 4f 70 65 6e 55 72 69 20 3d 20 76 61 5f  g.bOpenUri = va_
41a0: 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20  arg(ap, int);.  
41b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
41c0: 0a 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ..    case SQLIT
41d0: 45 5f 43 4f 4e 46 49 47 5f 43 4f 56 45 52 49 4e  E_CONFIG_COVERIN
41e0: 47 5f 49 4e 44 45 58 5f 53 43 41 4e 3a 20 7b 0a  G_INDEX_SCAN: {.
41f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f        sqlite3Glo
4200: 62 61 6c 43 6f 6e 66 69 67 2e 62 55 73 65 43 69  balConfig.bUseCi
4210: 73 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69  s = va_arg(ap, i
4220: 6e 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  nt);.      break
4230: 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
4240: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 51  SQLITE_ENABLE_SQ
4250: 4c 4c 4f 47 0a 20 20 20 20 63 61 73 65 20 53 51  LLOG.    case SQ
4260: 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 53 51 4c 4c  LITE_CONFIG_SQLL
4270: 4f 47 3a 20 7b 0a 20 20 20 20 20 20 74 79 70 65  OG: {.      type
4280: 64 65 66 20 76 6f 69 64 28 2a 53 51 4c 4c 4f 47  def void(*SQLLOG
4290: 46 55 4e 43 5f 74 29 28 76 6f 69 64 2a 2c 20 73  FUNC_t)(void*, s
42a0: 71 6c 69 74 65 33 2a 2c 20 63 6f 6e 73 74 20 63  qlite3*, const c
42b0: 68 61 72 2a 2c 20 69 6e 74 29 3b 0a 20 20 20 20  har*, int);.    
42c0: 20 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43    sqlite3GlobalC
42d0: 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67 20 3d 20  onfig.xSqllog = 
42e0: 76 61 5f 61 72 67 28 61 70 2c 20 53 51 4c 4c 4f  va_arg(ap, SQLLO
42f0: 47 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20 20 20  GFUNC_t);.      
4300: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
4310: 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67 20 3d  fig.pSqllogArg =
4320: 20 76 61 5f 61 72 67 28 61 70 2c 20 76 6f 69 64   va_arg(ap, void
4330: 20 2a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   *);.      break
4340: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
4350: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
4360: 43 4f 4e 46 49 47 5f 4d 4d 41 50 5f 53 49 5a 45  CONFIG_MMAP_SIZE
4370: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4380: 33 5f 69 6e 74 36 34 20 73 7a 4d 6d 61 70 20 3d  3_int64 szMmap =
4390: 20 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69   va_arg(ap, sqli
43a0: 74 65 33 5f 69 6e 74 36 34 29 3b 0a 20 20 20 20  te3_int64);.    
43b0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
43c0: 6d 78 4d 6d 61 70 20 3d 20 76 61 5f 61 72 67 28  mxMmap = va_arg(
43d0: 61 70 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ap, sqlite3_int6
43e0: 34 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6d 78  4);.      if( mx
43f0: 4d 6d 61 70 3c 30 20 7c 7c 20 6d 78 4d 6d 61 70  Mmap<0 || mxMmap
4400: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 4d 4d 41 50  >SQLITE_MAX_MMAP
4410: 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  _SIZE ){.       
4420: 20 6d 78 4d 6d 61 70 20 3d 20 53 51 4c 49 54 45   mxMmap = SQLITE
4430: 5f 4d 41 58 5f 4d 4d 41 50 5f 53 49 5a 45 3b 0a  _MAX_MMAP_SIZE;.
4440: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
4450: 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
4460: 67 2e 6d 78 4d 6d 61 70 20 3d 20 6d 78 4d 6d 61  g.mxMmap = mxMma
4470: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 4d  p;.      if( szM
4480: 6d 61 70 3c 30 20 29 20 73 7a 4d 6d 61 70 20 3d  map<0 ) szMmap =
4490: 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
44a0: 4d 4d 41 50 5f 53 49 5a 45 3b 0a 20 20 20 20 20  MMAP_SIZE;.     
44b0: 20 69 66 28 20 73 7a 4d 6d 61 70 3e 6d 78 4d 6d   if( szMmap>mxMm
44c0: 61 70 29 20 73 7a 4d 6d 61 70 20 3d 20 6d 78 4d  ap) szMmap = mxM
44d0: 6d 61 70 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  map;.      sqlit
44e0: 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73  e3GlobalConfig.s
44f0: 7a 4d 6d 61 70 20 3d 20 73 7a 4d 6d 61 70 3b 0a  zMmap = szMmap;.
4500: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4510: 20 7d 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 4f   }..#if SQLITE_O
4520: 53 5f 57 49 4e 20 26 26 20 64 65 66 69 6e 65 64  S_WIN && defined
4530: 28 53 51 4c 49 54 45 5f 57 49 4e 33 32 5f 4d 41  (SQLITE_WIN32_MA
4540: 4c 4c 4f 43 29 0a 20 20 20 20 63 61 73 65 20 53  LLOC).    case S
4550: 51 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 57 49 4e  QLITE_CONFIG_WIN
4560: 33 32 5f 48 45 41 50 53 49 5a 45 3a 20 7b 0a 20  32_HEAPSIZE: {. 
4570: 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
4580: 61 6c 43 6f 6e 66 69 67 2e 6e 48 65 61 70 20 3d  alConfig.nHeap =
4590: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
45a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
45b0: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
45c0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
45d0: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
45e0: 52 4f 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ROR;.      break
45f0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61  ;.    }.  }.  va
4600: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74 75  _end(ap);.  retu
4610: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4620: 53 65 74 20 75 70 20 74 68 65 20 6c 6f 6f 6b 61  Set up the looka
4630: 73 69 64 65 20 62 75 66 66 65 72 73 20 66 6f 72  side buffers for
4640: 20 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e   a database conn
4650: 65 63 74 69 6f 6e 2e 0a 2a 2a 20 52 65 74 75 72  ection..** Retur
4660: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
4670: 75 63 63 65 73 73 2e 20 20 0a 2a 2a 20 49 66 20  uccess.  .** If 
4680: 6c 6f 6f 6b 61 73 69 64 65 20 69 73 20 61 6c 72  lookaside is alr
4690: 65 61 64 79 20 61 63 74 69 76 65 2c 20 72 65 74  eady active, ret
46a0: 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
46b0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 7a 20 70 61  .**.** The sz pa
46c0: 72 61 6d 65 74 65 72 20 69 73 20 74 68 65 20 6e  rameter is the n
46d0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
46e0: 6e 20 65 61 63 68 20 6c 6f 6f 6b 61 73 69 64 65  n each lookaside
46f0: 20 73 6c 6f 74 2e 0a 2a 2a 20 54 68 65 20 63 6e   slot..** The cn
4700: 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  t parameter is t
4710: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 6c 6f  he number of slo
4720: 74 73 2e 20 20 49 66 20 70 53 74 61 72 74 20 69  ts.  If pStart i
4730: 73 20 4e 55 4c 4c 20 74 68 65 0a 2a 2a 20 73 70  s NULL the.** sp
4740: 61 63 65 20 66 6f 72 20 74 68 65 20 6c 6f 6f 6b  ace for the look
4750: 61 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20  aside memory is 
4760: 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71  obtained from sq
4770: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 2e 0a  lite3_malloc()..
4780: 2a 2a 20 49 66 20 70 53 74 61 72 74 20 69 73 20  ** If pStart is 
4790: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
47a0: 20 69 73 20 73 7a 2a 63 6e 74 20 62 79 74 65 73   is sz*cnt bytes
47b0: 20 6f 66 20 6d 65 6d 6f 72 79 20 74 6f 20 75 73   of memory to us
47c0: 65 20 66 6f 72 0a 2a 2a 20 74 68 65 20 6c 6f 6f  e for.** the loo
47d0: 6b 61 73 69 64 65 20 6d 65 6d 6f 72 79 2e 0a 2a  kaside memory..*
47e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 74  /.static int set
47f0: 75 70 4c 6f 6f 6b 61 73 69 64 65 28 73 71 6c 69  upLookaside(sqli
4800: 74 65 33 20 2a 64 62 2c 20 76 6f 69 64 20 2a 70  te3 *db, void *p
4810: 42 75 66 2c 20 69 6e 74 20 73 7a 2c 20 69 6e 74  Buf, int sz, int
4820: 20 63 6e 74 29 7b 0a 20 20 76 6f 69 64 20 2a 70   cnt){.  void *p
4830: 53 74 61 72 74 3b 0a 20 20 69 66 28 20 64 62 2d  Start;.  if( db-
4840: 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e 4f 75 74 20  >lookaside.nOut 
4850: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
4860: 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20  LITE_BUSY;.  }. 
4870: 20 2f 2a 20 46 72 65 65 20 61 6e 79 20 65 78 69   /* Free any exi
4880: 73 74 69 6e 67 20 6c 6f 6f 6b 61 73 69 64 65 20  sting lookaside 
4890: 62 75 66 66 65 72 20 66 6f 72 20 74 68 69 73 20  buffer for this 
48a0: 68 61 6e 64 6c 65 20 62 65 66 6f 72 65 0a 20 20  handle before.  
48b0: 2a 2a 20 61 6c 6c 6f 63 61 74 69 6e 67 20 61 20  ** allocating a 
48c0: 6e 65 77 20 6f 6e 65 20 73 6f 20 77 65 20 64 6f  new one so we do
48d0: 6e 27 74 20 68 61 76 65 20 74 6f 20 68 61 76 65  n't have to have
48e0: 20 73 70 61 63 65 20 66 6f 72 20 0a 20 20 2a 2a   space for .  **
48f0: 20 62 6f 74 68 20 61 74 20 74 68 65 20 73 61 6d   both at the sam
4900: 65 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a 20 20 69  e time..  */.  i
4910: 66 28 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65  f( db->lookaside
4920: 2e 62 4d 61 6c 6c 6f 63 65 64 20 29 7b 0a 20 20  .bMalloced ){.  
4930: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64    sqlite3_free(d
4940: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
4950: 61 72 74 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 54  art);.  }.  /* T
4960: 68 65 20 73 69 7a 65 20 6f 66 20 61 20 6c 6f 6f  he size of a loo
4970: 6b 61 73 69 64 65 20 73 6c 6f 74 20 61 66 74 65  kaside slot afte
4980: 72 20 52 4f 55 4e 44 44 4f 57 4e 38 20 6e 65 65  r ROUNDDOWN8 nee
4990: 64 73 20 74 6f 20 62 65 20 6c 61 72 67 65 72 0a  ds to be larger.
49a0: 20 20 2a 2a 20 74 68 61 6e 20 61 20 70 6f 69 6e    ** than a poin
49b0: 74 65 72 20 74 6f 20 62 65 20 75 73 65 66 75 6c  ter to be useful
49c0: 2e 0a 20 20 2a 2f 0a 20 20 73 7a 20 3d 20 52 4f  ..  */.  sz = RO
49d0: 55 4e 44 44 4f 57 4e 38 28 73 7a 29 3b 20 20 2f  UNDDOWN8(sz);  /
49e0: 2a 20 49 4d 50 3a 20 52 2d 33 33 30 33 38 2d 30  * IMP: R-33038-0
49f0: 39 33 38 32 20 2a 2f 0a 20 20 69 66 28 20 73 7a  9382 */.  if( sz
4a00: 3c 3d 28 69 6e 74 29 73 69 7a 65 6f 66 28 4c 6f  <=(int)sizeof(Lo
4a10: 6f 6b 61 73 69 64 65 53 6c 6f 74 2a 29 20 29 20  okasideSlot*) ) 
4a20: 73 7a 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 6e  sz = 0;.  if( cn
4a30: 74 3c 30 20 29 20 63 6e 74 20 3d 20 30 3b 0a 20  t<0 ) cnt = 0;. 
4a40: 20 69 66 28 20 73 7a 3d 3d 30 20 7c 7c 20 63 6e   if( sz==0 || cn
4a50: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 7a 20 3d  t==0 ){.    sz =
4a60: 20 30 3b 0a 20 20 20 20 70 53 74 61 72 74 20 3d   0;.    pStart =
4a70: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
4a80: 70 42 75 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73  pBuf==0 ){.    s
4a90: 71 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67  qlite3BeginBenig
4aa0: 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 70  nMalloc();.    p
4ab0: 53 74 61 72 74 20 3d 20 73 71 6c 69 74 65 33 4d  Start = sqlite3M
4ac0: 61 6c 6c 6f 63 28 20 73 7a 2a 63 6e 74 20 29 3b  alloc( sz*cnt );
4ad0: 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 36 31 39 34    /* IMP: R-6194
4ae0: 39 2d 33 35 37 32 37 20 2a 2f 0a 20 20 20 20 73  9-35727 */.    s
4af0: 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d  qlite3EndBenignM
4b00: 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 69 66 28  alloc();.    if(
4b10: 20 70 53 74 61 72 74 20 29 20 63 6e 74 20 3d 20   pStart ) cnt = 
4b20: 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 53 69 7a  sqlite3MallocSiz
4b30: 65 28 70 53 74 61 72 74 29 2f 73 7a 3b 0a 20 20  e(pStart)/sz;.  
4b40: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 53 74 61 72  }else{.    pStar
4b50: 74 20 3d 20 70 42 75 66 3b 0a 20 20 7d 0a 20 20  t = pBuf;.  }.  
4b60: 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53  db->lookaside.pS
4b70: 74 61 72 74 20 3d 20 70 53 74 61 72 74 3b 0a 20  tart = pStart;. 
4b80: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70   db->lookaside.p
4b90: 46 72 65 65 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Free = 0;.  db->
4ba0: 6c 6f 6f 6b 61 73 69 64 65 2e 73 7a 20 3d 20 28  lookaside.sz = (
4bb0: 75 31 36 29 73 7a 3b 0a 20 20 69 66 28 20 70 53  u16)sz;.  if( pS
4bc0: 74 61 72 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  tart ){.    int 
4bd0: 69 3b 0a 20 20 20 20 4c 6f 6f 6b 61 73 69 64 65  i;.    Lookaside
4be0: 53 6c 6f 74 20 2a 70 3b 0a 20 20 20 20 61 73 73  Slot *p;.    ass
4bf0: 65 72 74 28 20 73 7a 20 3e 20 28 69 6e 74 29 73  ert( sz > (int)s
4c00: 69 7a 65 6f 66 28 4c 6f 6f 6b 61 73 69 64 65 53  izeof(LookasideS
4c10: 6c 6f 74 2a 29 20 29 3b 0a 20 20 20 20 70 20 3d  lot*) );.    p =
4c20: 20 28 4c 6f 6f 6b 61 73 69 64 65 53 6c 6f 74 2a   (LookasideSlot*
4c30: 29 70 53 74 61 72 74 3b 0a 20 20 20 20 66 6f 72  )pStart;.    for
4c40: 28 69 3d 63 6e 74 2d 31 3b 20 69 3e 3d 30 3b 20  (i=cnt-1; i>=0; 
4c50: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  i--){.      p->p
4c60: 4e 65 78 74 20 3d 20 64 62 2d 3e 6c 6f 6f 6b 61  Next = db->looka
4c70: 73 69 64 65 2e 70 46 72 65 65 3b 0a 20 20 20 20  side.pFree;.    
4c80: 20 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e    db->lookaside.
4c90: 70 46 72 65 65 20 3d 20 70 3b 0a 20 20 20 20 20  pFree = p;.     
4ca0: 20 70 20 3d 20 28 4c 6f 6f 6b 61 73 69 64 65 53   p = (LookasideS
4cb0: 6c 6f 74 2a 29 26 28 28 75 38 2a 29 70 29 5b 73  lot*)&((u8*)p)[s
4cc0: 7a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 62  z];.    }.    db
4cd0: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
4ce0: 20 3d 20 70 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = p;.    db->lo
4cf0: 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65 64  okaside.bEnabled
4d00: 20 3d 20 31 3b 0a 20 20 20 20 64 62 2d 3e 6c 6f   = 1;.    db->lo
4d10: 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65  okaside.bMalloce
4d20: 64 20 3d 20 70 42 75 66 3d 3d 30 20 3f 31 3a 30  d = pBuf==0 ?1:0
4d30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
4d40: 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 53 74  b->lookaside.pSt
4d50: 61 72 74 20 3d 20 64 62 3b 0a 20 20 20 20 64 62  art = db;.    db
4d60: 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 70 45 6e 64  ->lookaside.pEnd
4d70: 20 3d 20 64 62 3b 0a 20 20 20 20 64 62 2d 3e 6c   = db;.    db->l
4d80: 6f 6f 6b 61 73 69 64 65 2e 62 45 6e 61 62 6c 65  ookaside.bEnable
4d90: 64 20 3d 20 30 3b 0a 20 20 20 20 64 62 2d 3e 6c  d = 0;.    db->l
4da0: 6f 6f 6b 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63  ookaside.bMalloc
4db0: 65 64 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ed = 0;.  }.  re
4dc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
4dd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4de0: 74 68 65 20 6d 75 74 65 78 20 61 73 73 6f 63 69  the mutex associ
4df0: 61 74 65 64 20 77 69 74 68 20 61 20 64 61 74 61  ated with a data
4e00: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  base connection.
4e10: 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 6d 75 74 65  .*/.sqlite3_mute
4e20: 78 20 2a 73 71 6c 69 74 65 33 5f 64 62 5f 6d 75  x *sqlite3_db_mu
4e30: 74 65 78 28 73 71 6c 69 74 65 33 20 2a 64 62 29  tex(sqlite3 *db)
4e40: 7b 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6d  {.  return db->m
4e50: 75 74 65 78 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  utex;.}../*.** F
4e60: 72 65 65 20 75 70 20 61 73 20 6d 75 63 68 20 6d  ree up as much m
4e70: 65 6d 6f 72 79 20 61 73 20 77 65 20 63 61 6e 20  emory as we can 
4e80: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 64  from the given d
4e90: 61 74 61 62 61 73 65 0a 2a 2a 20 63 6f 6e 6e 65  atabase.** conne
4ea0: 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
4eb0: 6c 69 74 65 33 5f 64 62 5f 72 65 6c 65 61 73 65  lite3_db_release
4ec0: 5f 6d 65 6d 6f 72 79 28 73 71 6c 69 74 65 33 20  _memory(sqlite3 
4ed0: 2a 64 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *db){.  int i;. 
4ee0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
4ef0: 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
4f00: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 45  .  sqlite3BtreeE
4f10: 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a 20 20 66  nterAll(db);.  f
4f20: 6f 72 28 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44  or(i=0; i<db->nD
4f30: 62 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; i++){.    Btr
4f40: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
4f50: 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[i].pBt;.    if
4f60: 28 20 70 42 74 20 29 7b 0a 20 20 20 20 20 20 50  ( pBt ){.      P
4f70: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 73  ager *pPager = s
4f80: 71 6c 69 74 65 33 42 74 72 65 65 50 61 67 65 72  qlite3BtreePager
4f90: 28 70 42 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pBt);.      sql
4fa0: 69 74 65 33 50 61 67 65 72 53 68 72 69 6e 6b 28  ite3PagerShrink(
4fb0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
4fc0: 20 7d 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65   }.  sqlite3Btre
4fd0: 65 4c 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 20  eLeaveAll(db);. 
4fe0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
4ff0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
5000: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
5010: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  _OK;.}../*.** Co
5020: 6e 66 69 67 75 72 61 74 69 6f 6e 20 73 65 74 74  nfiguration sett
5030: 69 6e 67 73 20 66 6f 72 20 61 6e 20 69 6e 64 69  ings for an indi
5040: 76 69 64 75 61 6c 20 64 61 74 61 62 61 73 65 20  vidual database 
5050: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2f 0a 69 6e  connection.*/.in
5060: 74 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e  t sqlite3_db_con
5070: 66 69 67 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  fig(sqlite3 *db,
5080: 20 69 6e 74 20 6f 70 2c 20 2e 2e 2e 29 7b 0a 20   int op, ...){. 
5090: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69   va_list ap;.  i
50a0: 6e 74 20 72 63 3b 0a 20 20 76 61 5f 73 74 61 72  nt rc;.  va_star
50b0: 74 28 61 70 2c 20 6f 70 29 3b 0a 20 20 73 77 69  t(ap, op);.  swi
50c0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
50d0: 61 73 65 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  ase SQLITE_DBCON
50e0: 46 49 47 5f 4c 4f 4f 4b 41 53 49 44 45 3a 20 7b  FIG_LOOKASIDE: {
50f0: 0a 20 20 20 20 20 20 76 6f 69 64 20 2a 70 42 75  .      void *pBu
5100: 66 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 76  f = va_arg(ap, v
5110: 6f 69 64 2a 29 3b 20 2f 2a 20 49 4d 50 3a 20 52  oid*); /* IMP: R
5120: 2d 32 36 38 33 35 2d 31 30 39 36 34 20 2a 2f 0a  -26835-10964 */.
5130: 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
5140: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
5150: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
5160: 34 37 38 37 31 2d 32 35 39 39 34 20 2a 2f 0a 20  47871-25994 */. 
5170: 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 76       int cnt = v
5180: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 20  a_arg(ap, int); 
5190: 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 30       /* IMP: R-0
51a0: 34 34 36 30 2d 35 33 33 38 36 20 2a 2f 0a 20 20  4460-53386 */.  
51b0: 20 20 20 20 72 63 20 3d 20 73 65 74 75 70 4c 6f      rc = setupLo
51c0: 6f 6b 61 73 69 64 65 28 64 62 2c 20 70 42 75 66  okaside(db, pBuf
51d0: 2c 20 73 7a 2c 20 63 6e 74 29 3b 0a 20 20 20 20  , sz, cnt);.    
51e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
51f0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
5200: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
5210: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
5220: 20 20 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 2f    int op;      /
5230: 2a 20 54 68 65 20 6f 70 63 6f 64 65 20 2a 2f 0a  * The opcode */.
5240: 20 20 20 20 20 20 20 20 75 33 32 20 6d 61 73 6b          u32 mask
5250: 3b 20 20 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20  ;    /* Mask of 
5260: 74 68 65 20 62 69 74 20 69 6e 20 73 71 6c 69 74  the bit in sqlit
5270: 65 33 2e 66 6c 61 67 73 20 74 6f 20 73 65 74 2f  e3.flags to set/
5280: 63 6c 65 61 72 20 2a 2f 0a 20 20 20 20 20 20 7d  clear */.      }
5290: 20 61 46 6c 61 67 4f 70 5b 5d 20 3d 20 7b 0a 20   aFlagOp[] = {. 
52a0: 20 20 20 20 20 20 20 7b 20 53 51 4c 49 54 45 5f         { SQLITE_
52b0: 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f  DBCONFIG_ENABLE_
52c0: 46 4b 45 59 2c 20 20 20 20 53 51 4c 49 54 45 5f  FKEY,    SQLITE_
52d0: 46 6f 72 65 69 67 6e 4b 65 79 73 20 20 20 20 7d  ForeignKeys    }
52e0: 2c 0a 20 20 20 20 20 20 20 20 7b 20 53 51 4c 49  ,.        { SQLI
52f0: 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45 4e 41 42  TE_DBCONFIG_ENAB
5300: 4c 45 5f 54 52 49 47 47 45 52 2c 20 53 51 4c 49  LE_TRIGGER, SQLI
5310: 54 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72  TE_EnableTrigger
5320: 20 20 7d 2c 0a 20 20 20 20 20 20 7d 3b 0a 20 20    },.      };.  
5330: 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74      unsigned int
5340: 20 69 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   i;.      rc = S
5350: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 20 2f 2a 20  QLITE_ERROR; /* 
5360: 49 4d 50 3a 20 52 2d 34 32 37 39 30 2d 32 33 33  IMP: R-42790-233
5370: 37 32 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28  72 */.      for(
5380: 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
5390: 28 61 46 6c 61 67 4f 70 29 3b 20 69 2b 2b 29 7b  (aFlagOp); i++){
53a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 46 6c  .        if( aFl
53b0: 61 67 4f 70 5b 69 5d 2e 6f 70 3d 3d 6f 70 20 29  agOp[i].op==op )
53c0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
53d0: 6f 6e 6f 66 66 20 3d 20 76 61 5f 61 72 67 28 61  onoff = va_arg(a
53e0: 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20  p, int);.       
53f0: 20 20 20 69 6e 74 20 2a 70 52 65 73 20 3d 20 76     int *pRes = v
5400: 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 2a 29 3b  a_arg(ap, int*);
5410: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f  .          int o
5420: 6c 64 46 6c 61 67 73 20 3d 20 64 62 2d 3e 66 6c  ldFlags = db->fl
5430: 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ags;.          i
5440: 66 28 20 6f 6e 6f 66 66 3e 30 20 29 7b 0a 20 20  f( onoff>0 ){.  
5450: 20 20 20 20 20 20 20 20 20 20 64 62 2d 3e 66 6c            db->fl
5460: 61 67 73 20 7c 3d 20 61 46 6c 61 67 4f 70 5b 69  ags |= aFlagOp[i
5470: 5d 2e 6d 61 73 6b 3b 0a 20 20 20 20 20 20 20 20  ].mask;.        
5480: 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 6e 6f 66    }else if( onof
5490: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
54a0: 20 20 20 20 64 62 2d 3e 66 6c 61 67 73 20 26 3d      db->flags &=
54b0: 20 7e 61 46 6c 61 67 4f 70 5b 69 5d 2e 6d 61 73   ~aFlagOp[i].mas
54c0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
54d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6f 6c 64           if( old
54e0: 46 6c 61 67 73 21 3d 64 62 2d 3e 66 6c 61 67 73  Flags!=db->flags
54f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5500: 73 71 6c 69 74 65 33 45 78 70 69 72 65 50 72 65  sqlite3ExpirePre
5510: 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74 73 28  paredStatements(
5520: 64 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  db);.          }
5530: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5540: 52 65 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Res ){.         
5550: 20 20 20 2a 70 52 65 73 20 3d 20 28 64 62 2d 3e     *pRes = (db->
5560: 66 6c 61 67 73 20 26 20 61 46 6c 61 67 4f 70 5b  flags & aFlagOp[
5570: 69 5d 2e 6d 61 73 6b 29 21 3d 30 3b 0a 20 20 20  i].mask)!=0;.   
5580: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5590: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
55a0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  K;.          bre
55b0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
55c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
55d0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 76  k;.    }.  }.  v
55e0: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 72 65 74  a_end(ap);.  ret
55f0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
5600: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
5610: 20 74 68 65 20 62 75 66 66 65 72 20 7a 5b 30 2e   the buffer z[0.
5620: 2e 6e 2d 31 5d 20 63 6f 6e 74 61 69 6e 73 20 61  .n-1] contains a
5630: 6c 6c 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74  ll spaces..*/.st
5640: 61 74 69 63 20 69 6e 74 20 61 6c 6c 53 70 61 63  atic int allSpac
5650: 65 73 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  es(const char *z
5660: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 77 68 69 6c  , int n){.  whil
5670: 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d 31 5d  e( n>0 && z[n-1]
5680: 3d 3d 27 20 27 20 29 7b 20 6e 2d 2d 3b 20 7d 0a  ==' ' ){ n--; }.
5690: 20 20 72 65 74 75 72 6e 20 6e 3d 3d 30 3b 0a 7d    return n==0;.}
56a0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
56b0: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
56c0: 61 74 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 6e  ating function n
56d0: 61 6d 65 64 20 22 42 49 4e 41 52 59 22 20 77 68  amed "BINARY" wh
56e0: 69 63 68 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a  ich is always.**
56f0: 20 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2a 0a 2a   available..**.*
5700: 2a 20 49 66 20 74 68 65 20 70 61 64 46 6c 61 67  * If the padFlag
5710: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 74   argument is not
5720: 20 4e 55 4c 4c 20 74 68 65 6e 20 73 70 61 63 65   NULL then space
5730: 20 70 61 64 64 69 6e 67 20 61 74 20 74 68 65 20   padding at the 
5740: 65 6e 64 0a 2a 2a 20 6f 66 20 73 74 72 69 6e 67  end.** of string
5750: 73 20 69 73 20 69 67 6e 6f 72 65 64 2e 20 20 54  s is ignored.  T
5760: 68 69 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  his implements t
5770: 68 65 20 52 54 52 49 4d 20 63 6f 6c 6c 61 74 69  he RTRIM collati
5780: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
5790: 74 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 28 0a 20  t binCollFunc(. 
57a0: 20 76 6f 69 64 20 2a 70 61 64 46 6c 61 67 2c 0a   void *padFlag,.
57b0: 20 20 69 6e 74 20 6e 4b 65 79 31 2c 20 63 6f 6e    int nKey1, con
57c0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 31 2c 0a  st void *pKey1,.
57d0: 20 20 69 6e 74 20 6e 4b 65 79 32 2c 20 63 6f 6e    int nKey2, con
57e0: 73 74 20 76 6f 69 64 20 2a 70 4b 65 79 32 0a 29  st void *pKey2.)
57f0: 7b 0a 20 20 69 6e 74 20 72 63 2c 20 6e 3b 0a 20  {.  int rc, n;. 
5800: 20 6e 20 3d 20 6e 4b 65 79 31 3c 6e 4b 65 79 32   n = nKey1<nKey2
5810: 20 3f 20 6e 4b 65 79 31 20 3a 20 6e 4b 65 79 32   ? nKey1 : nKey2
5820: 3b 0a 20 20 72 63 20 3d 20 6d 65 6d 63 6d 70 28  ;.  rc = memcmp(
5830: 70 4b 65 79 31 2c 20 70 4b 65 79 32 2c 20 6e 29  pKey1, pKey2, n)
5840: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
5850: 0a 20 20 20 20 69 66 28 20 70 61 64 46 6c 61 67  .    if( padFlag
5860: 0a 20 20 20 20 20 26 26 20 61 6c 6c 53 70 61 63  .     && allSpac
5870: 65 73 28 28 28 63 68 61 72 2a 29 70 4b 65 79 31  es(((char*)pKey1
5880: 29 2b 6e 2c 20 6e 4b 65 79 31 2d 6e 29 0a 20 20  )+n, nKey1-n).  
5890: 20 20 20 26 26 20 61 6c 6c 53 70 61 63 65 73 28     && allSpaces(
58a0: 28 28 63 68 61 72 2a 29 70 4b 65 79 32 29 2b 6e  ((char*)pKey2)+n
58b0: 2c 20 6e 4b 65 79 32 2d 6e 29 0a 20 20 20 20 29  , nKey2-n).    )
58c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65  {.      /* Leave
58d0: 20 72 63 20 75 6e 63 68 61 6e 67 65 64 20 61 74   rc unchanged at
58e0: 20 30 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b   0 */.    }else{
58f0: 0a 20 20 20 20 20 20 72 63 20 3d 20 6e 4b 65 79  .      rc = nKey
5900: 31 20 2d 20 6e 4b 65 79 32 3b 0a 20 20 20 20 7d  1 - nKey2;.    }
5910: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5920: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 6f 74 68  ;.}../*.** Anoth
5930: 65 72 20 62 75 69 6c 74 2d 69 6e 20 63 6f 6c 6c  er built-in coll
5940: 61 74 69 6e 67 20 73 65 71 75 65 6e 63 65 3a 20  ating sequence: 
5950: 4e 4f 43 41 53 45 2e 20 0a 2a 2a 0a 2a 2a 20 54  NOCASE. .**.** T
5960: 68 69 73 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65  his collating se
5970: 71 75 65 6e 63 65 20 69 73 20 69 6e 74 65 6e 64  quence is intend
5980: 65 64 20 74 6f 20 62 65 20 75 73 65 64 20 66 6f  ed to be used fo
5990: 72 20 22 63 61 73 65 20 69 6e 64 65 70 65 6e 64  r "case independ
59a0: 65 6e 74 0a 2a 2a 20 63 6f 6d 70 61 72 69 73 6f  ent.** compariso
59b0: 6e 22 2e 20 53 51 4c 69 74 65 27 73 20 6b 6e 6f  n". SQLite's kno
59c0: 77 6c 65 64 67 65 20 6f 66 20 75 70 70 65 72 20  wledge of upper 
59d0: 61 6e 64 20 6c 6f 77 65 72 20 63 61 73 65 20 65  and lower case e
59e0: 71 75 69 76 61 6c 65 6e 74 73 0a 2a 2a 20 65 78  quivalents.** ex
59f0: 74 65 6e 64 73 20 6f 6e 6c 79 20 74 6f 20 74 68  tends only to th
5a00: 65 20 32 36 20 63 68 61 72 61 63 74 65 72 73 20  e 26 characters 
5a10: 75 73 65 64 20 69 6e 20 74 68 65 20 45 6e 67 6c  used in the Engl
5a20: 69 73 68 20 6c 61 6e 67 75 61 67 65 2e 0a 2a 2a  ish language..**
5a30: 0a 2a 2a 20 41 74 20 74 68 65 20 6d 6f 6d 65 6e  .** At the momen
5a40: 74 20 74 68 65 72 65 20 69 73 20 6f 6e 6c 79 20  t there is only 
5a50: 61 20 55 54 46 2d 38 20 69 6d 70 6c 65 6d 65 6e  a UTF-8 implemen
5a60: 74 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  tation..*/.stati
5a70: 63 20 69 6e 74 20 6e 6f 63 61 73 65 43 6f 6c 6c  c int nocaseColl
5a80: 61 74 69 6e 67 46 75 6e 63 28 0a 20 20 76 6f 69  atingFunc(.  voi
5a90: 64 20 2a 4e 6f 74 55 73 65 64 2c 0a 20 20 69 6e  d *NotUsed,.  in
5aa0: 74 20 6e 4b 65 79 31 2c 20 63 6f 6e 73 74 20 76  t nKey1, const v
5ab0: 6f 69 64 20 2a 70 4b 65 79 31 2c 0a 20 20 69 6e  oid *pKey1,.  in
5ac0: 74 20 6e 4b 65 79 32 2c 20 63 6f 6e 73 74 20 76  t nKey2, const v
5ad0: 6f 69 64 20 2a 70 4b 65 79 32 0a 29 7b 0a 20 20  oid *pKey2.){.  
5ae0: 69 6e 74 20 72 20 3d 20 73 71 6c 69 74 65 33 53  int r = sqlite3S
5af0: 74 72 4e 49 43 6d 70 28 0a 20 20 20 20 20 20 28  trNICmp(.      (
5b00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 29 70 4b 65  const char *)pKe
5b10: 79 31 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 20  y1, (const char 
5b20: 2a 29 70 4b 65 79 32 2c 20 28 6e 4b 65 79 31 3c  *)pKey2, (nKey1<
5b30: 6e 4b 65 79 32 29 3f 6e 4b 65 79 31 3a 6e 4b 65  nKey2)?nKey1:nKe
5b40: 79 32 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  y2);.  UNUSED_PA
5b50: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
5b60: 3b 0a 20 20 69 66 28 20 30 3d 3d 72 20 29 7b 0a  ;.  if( 0==r ){.
5b70: 20 20 20 20 72 20 3d 20 6e 4b 65 79 31 2d 6e 4b      r = nKey1-nK
5b80: 65 79 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ey2;.  }.  retur
5b90: 6e 20 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n r;.}../*.** Re
5ba0: 74 75 72 6e 20 74 68 65 20 52 4f 57 49 44 20 6f  turn the ROWID o
5bb0: 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  f the most recen
5bc0: 74 20 69 6e 73 65 72 74 0a 2a 2f 0a 73 71 6c 69  t insert.*/.sqli
5bd0: 74 65 5f 69 6e 74 36 34 20 73 71 6c 69 74 65 33  te_int64 sqlite3
5be0: 5f 6c 61 73 74 5f 69 6e 73 65 72 74 5f 72 6f 77  _last_insert_row
5bf0: 69 64 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  id(sqlite3 *db){
5c00: 0a 20 20 72 65 74 75 72 6e 20 64 62 2d 3e 6c 61  .  return db->la
5c10: 73 74 52 6f 77 69 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  stRowid;.}../*.*
5c20: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
5c30: 62 65 72 20 6f 66 20 63 68 61 6e 67 65 73 20 69  ber of changes i
5c40: 6e 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e  n the most recen
5c50: 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65  t call to sqlite
5c60: 33 5f 65 78 65 63 28 29 2e 0a 2a 2f 0a 69 6e 74  3_exec()..*/.int
5c70: 20 73 71 6c 69 74 65 33 5f 63 68 61 6e 67 65 73   sqlite3_changes
5c80: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
5c90: 20 72 65 74 75 72 6e 20 64 62 2d 3e 6e 43 68 61   return db->nCha
5ca0: 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nge;.}../*.** Re
5cb0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
5cc0: 6f 66 20 63 68 61 6e 67 65 73 20 73 69 6e 63 65  of changes since
5cd0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
5ce0: 6e 64 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 2e  ndle was opened.
5cf0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
5d00: 74 6f 74 61 6c 5f 63 68 61 6e 67 65 73 28 73 71  total_changes(sq
5d10: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 72 65  lite3 *db){.  re
5d20: 74 75 72 6e 20 64 62 2d 3e 6e 54 6f 74 61 6c 43  turn db->nTotalC
5d30: 68 61 6e 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  hange;.}../*.** 
5d40: 43 6c 6f 73 65 20 61 6c 6c 20 6f 70 65 6e 20 73  Close all open s
5d50: 61 76 65 70 6f 69 6e 74 73 2e 20 54 68 69 73 20  avepoints. This 
5d60: 66 75 6e 63 74 69 6f 6e 20 6f 6e 6c 79 20 6d 61  function only ma
5d70: 6e 69 70 75 6c 61 74 65 73 20 66 69 65 6c 64 73  nipulates fields
5d80: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
5d90: 61 73 65 20 68 61 6e 64 6c 65 20 6f 62 6a 65 63  ase handle objec
5da0: 74 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63  t, it does not c
5db0: 6c 6f 73 65 20 61 6e 79 20 73 61 76 65 70 6f 69  lose any savepoi
5dc0: 6e 74 73 20 74 68 61 74 20 6d 61 79 20 62 65 20  nts that may be 
5dd0: 6f 70 65 6e 0a 2a 2a 20 61 74 20 74 68 65 20 62  open.** at the b
5de0: 2d 74 72 65 65 2f 70 61 67 65 72 20 6c 65 76 65  -tree/pager leve
5df0: 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
5e00: 65 33 43 6c 6f 73 65 53 61 76 65 70 6f 69 6e 74  e3CloseSavepoint
5e10: 73 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  s(sqlite3 *db){.
5e20: 20 20 77 68 69 6c 65 28 20 64 62 2d 3e 70 53 61    while( db->pSa
5e30: 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 53  vepoint ){.    S
5e40: 61 76 65 70 6f 69 6e 74 20 2a 70 54 6d 70 20 3d  avepoint *pTmp =
5e50: 20 64 62 2d 3e 70 53 61 76 65 70 6f 69 6e 74 3b   db->pSavepoint;
5e60: 0a 20 20 20 20 64 62 2d 3e 70 53 61 76 65 70 6f  .    db->pSavepo
5e70: 69 6e 74 20 3d 20 70 54 6d 70 2d 3e 70 4e 65 78  int = pTmp->pNex
5e80: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  t;.    sqlite3Db
5e90: 46 72 65 65 28 64 62 2c 20 70 54 6d 70 29 3b 0a  Free(db, pTmp);.
5ea0: 20 20 7d 0a 20 20 64 62 2d 3e 6e 53 61 76 65 70    }.  db->nSavep
5eb0: 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  oint = 0;.  db->
5ec0: 6e 53 74 61 74 65 6d 65 6e 74 20 3d 20 30 3b 0a  nStatement = 0;.
5ed0: 20 20 64 62 2d 3e 69 73 54 72 61 6e 73 61 63 74    db->isTransact
5ee0: 69 6f 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ionSavepoint = 0
5ef0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
5f00: 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72  e the destructor
5f10: 20 66 75 6e 63 74 69 6f 6e 20 61 73 73 6f 63 69   function associ
5f20: 61 74 65 64 20 77 69 74 68 20 46 75 6e 63 44 65  ated with FuncDe
5f30: 66 20 70 2c 20 69 66 20 61 6e 79 2e 20 45 78 63  f p, if any. Exc
5f40: 65 70 74 2c 0a 2a 2a 20 69 66 20 74 68 69 73 20  ept,.** if this 
5f50: 69 73 20 6e 6f 74 20 74 68 65 20 6c 61 73 74 20  is not the last 
5f60: 63 6f 70 79 20 6f 66 20 74 68 65 20 66 75 6e 63  copy of the func
5f70: 74 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 69 6e 76  tion, do not inv
5f80: 6f 6b 65 20 69 74 2e 20 4d 75 6c 74 69 70 6c 65  oke it. Multiple
5f90: 0a 2a 2a 20 63 6f 70 69 65 73 20 6f 66 20 61 20  .** copies of a 
5fa0: 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f 6e 20  single function 
5fb0: 61 72 65 20 63 72 65 61 74 65 64 20 77 68 65 6e  are created when
5fc0: 20 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e   create_function
5fd0: 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  () is called.** 
5fe0: 77 69 74 68 20 53 51 4c 49 54 45 5f 41 4e 59 20  with SQLITE_ANY 
5ff0: 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 2e  as the encoding.
6000: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
6010: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
6020: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 46 75 6e  sqlite3 *db, Fun
6030: 63 44 65 66 20 2a 70 29 7b 0a 20 20 46 75 6e 63  cDef *p){.  Func
6040: 44 65 73 74 72 75 63 74 6f 72 20 2a 70 44 65 73  Destructor *pDes
6050: 74 72 75 63 74 6f 72 20 3d 20 70 2d 3e 70 44 65  tructor = p->pDe
6060: 73 74 72 75 63 74 6f 72 3b 0a 20 20 69 66 28 20  structor;.  if( 
6070: 70 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  pDestructor ){. 
6080: 20 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e     pDestructor->
6090: 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 69 66 28 20  nRef--;.    if( 
60a0: 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e 52 65  pDestructor->nRe
60b0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 44  f==0 ){.      pD
60c0: 65 73 74 72 75 63 74 6f 72 2d 3e 78 44 65 73 74  estructor->xDest
60d0: 72 6f 79 28 70 44 65 73 74 72 75 63 74 6f 72 2d  roy(pDestructor-
60e0: 3e 70 55 73 65 72 44 61 74 61 29 3b 0a 20 20 20  >pUserData);.   
60f0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
6100: 28 64 62 2c 20 70 44 65 73 74 72 75 63 74 6f 72  (db, pDestructor
6110: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
6120: 2f 2a 0a 2a 2a 20 44 69 73 63 6f 6e 6e 65 63 74  /*.** Disconnect
6130: 20 61 6c 6c 20 73 71 6c 69 74 65 33 5f 76 74 61   all sqlite3_vta
6140: 62 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 62  b objects that b
6150: 65 6c 6f 6e 67 20 74 6f 20 64 61 74 61 62 61 73  elong to databas
6160: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20  e connection.** 
6170: 64 62 2e 20 54 68 69 73 20 69 73 20 63 61 6c 6c  db. This is call
6180: 65 64 20 77 68 65 6e 20 64 62 20 69 73 20 62 65  ed when db is be
6190: 69 6e 67 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  ing closed..*/.s
61a0: 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 63 6f  tatic void disco
61b0: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 73 71 6c  nnectAllVtab(sql
61c0: 69 74 65 33 20 2a 64 62 29 7b 0a 23 69 66 6e 64  ite3 *db){.#ifnd
61d0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
61e0: 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 6e  IRTUALTABLE.  in
61f0: 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 42 74  t i;.  sqlite3Bt
6200: 72 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b  reeEnterAll(db);
6210: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
6220: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
6230: 20 53 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61   Schema *pSchema
6240: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53   = db->aDb[i].pS
6250: 63 68 65 6d 61 3b 0a 20 20 20 20 69 66 28 20 64  chema;.    if( d
6260: 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63 68 65 6d  b->aDb[i].pSchem
6270: 61 20 29 7b 0a 20 20 20 20 20 20 48 61 73 68 45  a ){.      HashE
6280: 6c 65 6d 20 2a 70 3b 0a 20 20 20 20 20 20 66 6f  lem *p;.      fo
6290: 72 28 70 3d 73 71 6c 69 74 65 48 61 73 68 46 69  r(p=sqliteHashFi
62a0: 72 73 74 28 26 70 53 63 68 65 6d 61 2d 3e 74 62  rst(&pSchema->tb
62b0: 6c 48 61 73 68 29 3b 20 70 3b 20 70 3d 73 71 6c  lHash); p; p=sql
62c0: 69 74 65 48 61 73 68 4e 65 78 74 28 70 29 29 7b  iteHashNext(p)){
62d0: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
62e0: 70 54 61 62 20 3d 20 28 54 61 62 6c 65 20 2a 29  pTab = (Table *)
62f0: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 70  sqliteHashData(p
6300: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49  );.        if( I
6310: 73 56 69 72 74 75 61 6c 28 70 54 61 62 29 20 29  sVirtual(pTab) )
6320: 20 73 71 6c 69 74 65 33 56 74 61 62 44 69 73 63   sqlite3VtabDisc
6330: 6f 6e 6e 65 63 74 28 64 62 2c 20 70 54 61 62 29  onnect(db, pTab)
6340: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
6350: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 56 74 61    }.  sqlite3Vta
6360: 62 55 6e 6c 6f 63 6b 4c 69 73 74 28 64 62 29 3b  bUnlockList(db);
6370: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
6380: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 23 65 6c  eaveAll(db);.#el
6390: 73 65 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  se.  UNUSED_PARA
63a0: 4d 45 54 45 52 28 64 62 29 3b 0a 23 65 6e 64 69  METER(db);.#endi
63b0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
63c0: 6e 20 54 52 55 45 20 69 66 20 64 61 74 61 62 61  n TRUE if databa
63d0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62  se connection db
63e0: 20 68 61 73 20 75 6e 66 69 6e 61 6c 69 7a 65 64   has unfinalized
63f0: 20 70 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61   prepared.** sta
6400: 74 65 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e  tements or unfin
6410: 69 73 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61  ished sqlite3_ba
6420: 63 6b 75 70 20 6f 62 6a 65 63 74 73 2e 20 20 0a  ckup objects.  .
6430: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
6440: 6e 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 73  nnectionIsBusy(s
6450: 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69  qlite3 *db){.  i
6460: 6e 74 20 6a 3b 0a 20 20 61 73 73 65 72 74 28 20  nt j;.  assert( 
6470: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65  sqlite3_mutex_he
6480: 6c 64 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b  ld(db->mutex) );
6490: 0a 20 20 69 66 28 20 64 62 2d 3e 70 56 64 62 65  .  if( db->pVdbe
64a0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 66   ) return 1;.  f
64b0: 6f 72 28 6a 3d 30 3b 20 6a 3c 64 62 2d 3e 6e 44  or(j=0; j<db->nD
64c0: 62 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 42 74 72  b; j++){.    Btr
64d0: 65 65 20 2a 70 42 74 20 3d 20 64 62 2d 3e 61 44  ee *pBt = db->aD
64e0: 62 5b 6a 5d 2e 70 42 74 3b 0a 20 20 20 20 69 66  b[j].pBt;.    if
64f0: 28 20 70 42 74 20 26 26 20 73 71 6c 69 74 65 33  ( pBt && sqlite3
6500: 42 74 72 65 65 49 73 49 6e 42 61 63 6b 75 70 28  BtreeIsInBackup(
6510: 70 42 74 29 20 29 20 72 65 74 75 72 6e 20 31 3b  pBt) ) return 1;
6520: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
6530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
6540: 61 6e 20 65 78 69 73 74 69 6e 67 20 53 51 4c 69  an existing SQLi
6550: 74 65 20 64 61 74 61 62 61 73 65 0a 2a 2f 0a 73  te database.*/.s
6560: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
6570: 33 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a  3Close(sqlite3 *
6580: 64 62 2c 20 69 6e 74 20 66 6f 72 63 65 5a 6f 6d  db, int forceZom
6590: 62 69 65 29 7b 0a 20 20 69 66 28 20 21 64 62 20  bie){.  if( !db 
65a0: 29 7b 0a 20 20 20 20 2f 2a 20 45 56 49 44 45 4e  ){.    /* EVIDEN
65b0: 43 45 2d 4f 46 3a 20 52 2d 36 33 32 35 37 2d 31  CE-OF: R-63257-1
65c0: 31 37 34 30 20 43 61 6c 6c 69 6e 67 20 73 71 6c  1740 Calling sql
65d0: 69 74 65 33 5f 63 6c 6f 73 65 28 29 20 6f 72 0a  ite3_close() or.
65e0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 63      ** sqlite3_c
65f0: 6c 6f 73 65 5f 76 32 28 29 20 77 69 74 68 20 61  lose_v2() with a
6600: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 61 72   NULL pointer ar
6610: 67 75 6d 65 6e 74 20 69 73 20 61 20 68 61 72 6d  gument is a harm
6620: 6c 65 73 73 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20  less no-op. */. 
6630: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
6640: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  _OK;.  }.  if( !
6650: 73 71 6c 69 74 65 33 53 61 66 65 74 79 43 68 65  sqlite3SafetyChe
6660: 63 6b 53 69 63 6b 4f 72 4f 6b 28 64 62 29 20 29  ckSickOrOk(db) )
6670: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
6680: 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
6690: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
66a0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
66b0: 75 74 65 78 29 3b 0a 0a 20 20 2f 2a 20 46 6f 72  utex);..  /* For
66c0: 63 65 20 78 44 69 73 63 6f 6e 6e 65 63 74 20 63  ce xDisconnect c
66d0: 61 6c 6c 73 20 6f 6e 20 61 6c 6c 20 76 69 72 74  alls on all virt
66e0: 75 61 6c 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20  ual tables */.  
66f0: 64 69 73 63 6f 6e 6e 65 63 74 41 6c 6c 56 74 61  disconnectAllVta
6700: 62 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  b(db);..  /* If 
6710: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
6720: 20 6f 70 65 6e 2c 20 74 68 65 20 64 69 73 63 6f   open, the disco
6730: 6e 6e 65 63 74 41 6c 6c 56 74 61 62 28 29 20 63  nnectAllVtab() c
6740: 61 6c 6c 20 61 62 6f 76 65 0a 20 20 2a 2a 20 77  all above.  ** w
6750: 69 6c 6c 20 6e 6f 74 20 68 61 76 65 20 63 61 6c  ill not have cal
6760: 6c 65 64 20 74 68 65 20 78 44 69 73 63 6f 6e 6e  led the xDisconn
6770: 65 63 74 28 29 20 6d 65 74 68 6f 64 20 6f 6e 20  ect() method on 
6780: 61 6e 79 20 76 69 72 74 75 61 6c 0a 20 20 2a 2a  any virtual.  **
6790: 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 64   tables in the d
67a0: 62 2d 3e 61 56 54 72 61 6e 73 5b 5d 20 61 72 72  b->aVTrans[] arr
67b0: 61 79 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ay. The followin
67c0: 67 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c  g sqlite3VtabRol
67d0: 6c 62 61 63 6b 28 29 0a 20 20 2a 2a 20 63 61 6c  lback().  ** cal
67e0: 6c 20 77 69 6c 6c 20 64 6f 20 73 6f 2e 20 57 65  l will do so. We
67f0: 20 6e 65 65 64 20 74 6f 20 64 6f 20 74 68 69 73   need to do this
6800: 20 62 65 66 6f 72 65 20 74 68 65 20 63 68 65 63   before the chec
6810: 6b 20 66 6f 72 20 61 63 74 69 76 65 0a 20 20 2a  k for active.  *
6820: 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73  * SQL statements
6830: 20 62 65 6c 6f 77 2c 20 61 73 20 74 68 65 20 76   below, as the v
6840: 2d 74 61 62 6c 65 20 69 6d 70 6c 65 6d 65 6e 74  -table implement
6850: 61 74 69 6f 6e 20 6d 61 79 20 62 65 20 73 74 6f  ation may be sto
6860: 72 69 6e 67 0a 20 20 2a 2a 20 73 6f 6d 65 20 70  ring.  ** some p
6870: 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
6880: 74 73 20 69 6e 74 65 72 6e 61 6c 6c 79 2e 0a 20  ts internally.. 
6890: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 56 74 61   */.  sqlite3Vta
68a0: 62 52 6f 6c 6c 62 61 63 6b 28 64 62 29 3b 0a 0a  bRollback(db);..
68b0: 20 20 2f 2a 20 4c 65 67 61 63 79 20 62 65 68 61    /* Legacy beha
68c0: 76 69 6f 72 20 28 73 71 6c 69 74 65 33 5f 63 6c  vior (sqlite3_cl
68d0: 6f 73 65 28 29 20 62 65 68 61 76 69 6f 72 29 20  ose() behavior) 
68e0: 69 73 20 74 6f 20 72 65 74 75 72 6e 0a 20 20 2a  is to return.  *
68f0: 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  * SQLITE_BUSY if
6900: 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20   the connection 
6910: 63 61 6e 20 6e 6f 74 20 62 65 20 63 6c 6f 73 65  can not be close
6920: 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  d immediately.. 
6930: 20 2a 2f 0a 20 20 69 66 28 20 21 66 6f 72 63 65   */.  if( !force
6940: 5a 6f 6d 62 69 65 20 26 26 20 63 6f 6e 6e 65 63  Zombie && connec
6950: 74 69 6f 6e 49 73 42 75 73 79 28 64 62 29 20 29  tionIsBusy(db) )
6960: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  {.    sqlite3Err
6970: 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51  orWithMsg(db, SQ
6980: 4c 49 54 45 5f 42 55 53 59 2c 20 22 75 6e 61 62  LITE_BUSY, "unab
6990: 6c 65 20 74 6f 20 63 6c 6f 73 65 20 64 75 65 20  le to close due 
69a0: 74 6f 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 22  to unfinalized "
69b0: 0a 20 20 20 20 20 20 20 22 73 74 61 74 65 6d 65  .       "stateme
69c0: 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73 68 65  nts or unfinishe
69d0: 64 20 62 61 63 6b 75 70 73 22 29 3b 0a 20 20 20  d backups");.   
69e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
69f0: 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b  eave(db->mutex);
6a00: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6a10: 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 0a 23 69  TE_BUSY;.  }..#i
6a20: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6a30: 4c 45 5f 53 51 4c 4c 4f 47 0a 20 20 69 66 28 20  LE_SQLLOG.  if( 
6a40: 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e  sqlite3GlobalCon
6a50: 66 69 67 2e 78 53 71 6c 6c 6f 67 20 29 7b 0a 20  fig.xSqllog ){. 
6a60: 20 20 20 2f 2a 20 43 6c 6f 73 69 6e 67 20 74 68     /* Closing th
6a70: 65 20 68 61 6e 64 6c 65 2e 20 46 6f 75 72 74 68  e handle. Fourth
6a80: 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 70 61   parameter is pa
6a90: 73 73 65 64 20 74 68 65 20 76 61 6c 75 65 20 32  ssed the value 2
6aa0: 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
6ab0: 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71  GlobalConfig.xSq
6ac0: 6c 6c 6f 67 28 73 71 6c 69 74 65 33 47 6c 6f 62  llog(sqlite3Glob
6ad0: 61 6c 43 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67  alConfig.pSqllog
6ae0: 41 72 67 2c 20 64 62 2c 20 30 2c 20 32 29 3b 0a  Arg, db, 0, 2);.
6af0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
6b00: 20 43 6f 6e 76 65 72 74 20 74 68 65 20 63 6f 6e   Convert the con
6b10: 6e 65 63 74 69 6f 6e 20 69 6e 74 6f 20 61 20 7a  nection into a z
6b20: 6f 6d 62 69 65 20 61 6e 64 20 74 68 65 6e 20 63  ombie and then c
6b30: 6c 6f 73 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  lose it..  */.  
6b40: 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c 49  db->magic = SQLI
6b50: 54 45 5f 4d 41 47 49 43 5f 5a 4f 4d 42 49 45 3b  TE_MAGIC_ZOMBIE;
6b60: 0a 20 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d  .  sqlite3LeaveM
6b70: 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62  utexAndCloseZomb
6b80: 69 65 28 64 62 29 3b 0a 20 20 72 65 74 75 72 6e  ie(db);.  return
6b90: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
6ba0: 2a 0a 2a 2a 20 54 77 6f 20 76 61 72 69 61 74 69  *.** Two variati
6bb0: 6f 6e 73 20 6f 6e 20 74 68 65 20 70 75 62 6c 69  ons on the publi
6bc0: 63 20 69 6e 74 65 72 66 61 63 65 20 66 6f 72 20  c interface for 
6bd0: 63 6c 6f 73 69 6e 67 20 61 20 64 61 74 61 62 61  closing a databa
6be0: 73 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e  se.** connection
6bf0: 2e 20 54 68 65 20 73 71 6c 69 74 65 33 5f 63 6c  . The sqlite3_cl
6c00: 6f 73 65 28 29 20 76 65 72 73 69 6f 6e 20 72 65  ose() version re
6c10: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53  turns SQLITE_BUS
6c20: 59 20 61 6e 64 0a 2a 2a 20 6c 65 61 76 65 73 20  Y and.** leaves 
6c30: 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6f  the connection o
6c40: 70 74 69 6f 6e 20 69 66 20 74 68 65 72 65 20 61  ption if there a
6c50: 72 65 20 75 6e 66 69 6e 61 6c 69 7a 65 64 20 70  re unfinalized p
6c60: 72 65 70 61 72 65 64 0a 2a 2a 20 73 74 61 74 65  repared.** state
6c70: 6d 65 6e 74 73 20 6f 72 20 75 6e 66 69 6e 69 73  ments or unfinis
6c80: 68 65 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  hed sqlite3_back
6c90: 75 70 73 2e 20 20 54 68 65 20 73 71 6c 69 74 65  ups.  The sqlite
6ca0: 33 5f 63 6c 6f 73 65 5f 76 32 28 29 0a 2a 2a 20  3_close_v2().** 
6cb0: 76 65 72 73 69 6f 6e 20 66 6f 72 63 65 73 20 74  version forces t
6cc0: 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f  he connection to
6cd0: 20 62 65 63 6f 6d 65 20 61 20 7a 6f 6d 62 69 65   become a zombie
6ce0: 20 69 66 20 74 68 65 72 65 20 61 72 65 0a 2a 2a   if there are.**
6cf0: 20 75 6e 63 6c 6f 73 65 64 20 72 65 73 6f 75 72   unclosed resour
6d00: 63 65 73 2c 20 61 6e 64 20 61 72 72 61 6e 67 65  ces, and arrange
6d10: 73 20 66 6f 72 20 64 65 61 6c 6c 6f 63 61 74 69  s for deallocati
6d20: 6f 6e 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74  on when the last
6d30: 0a 2a 2a 20 70 72 65 70 61 72 65 20 73 74 61 74  .** prepare stat
6d40: 65 6d 65 6e 74 20 6f 72 20 73 71 6c 69 74 65 33  ement or sqlite3
6d50: 5f 62 61 63 6b 75 70 20 63 6c 6f 73 65 73 2e 0a  _backup closes..
6d60: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63  */.int sqlite3_c
6d70: 6c 6f 73 65 28 73 71 6c 69 74 65 33 20 2a 64 62  lose(sqlite3 *db
6d80: 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ){ return sqlite
6d90: 33 43 6c 6f 73 65 28 64 62 2c 30 29 3b 20 7d 0a  3Close(db,0); }.
6da0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73  int sqlite3_clos
6db0: 65 5f 76 32 28 73 71 6c 69 74 65 33 20 2a 64 62  e_v2(sqlite3 *db
6dc0: 29 7b 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  ){ return sqlite
6dd0: 33 43 6c 6f 73 65 28 64 62 2c 31 29 3b 20 7d 0a  3Close(db,1); }.
6de0: 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68  ../*.** Close th
6df0: 65 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62  e mutex on datab
6e00: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64  ase connection d
6e10: 62 2e 0a 2a 2a 0a 2a 2a 20 46 75 72 74 68 65 72  b..**.** Further
6e20: 6d 6f 72 65 2c 20 69 66 20 64 61 74 61 62 61 73  more, if databas
6e30: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 64 62 20  e connection db 
6e40: 69 73 20 61 20 7a 6f 6d 62 69 65 20 28 6d 65 61  is a zombie (mea
6e50: 6e 69 6e 67 20 74 68 61 74 20 74 68 65 72 65 0a  ning that there.
6e60: 2a 2a 20 68 61 73 20 62 65 65 6e 20 61 20 70 72  ** has been a pr
6e70: 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69  ior call to sqli
6e80: 74 65 33 5f 63 6c 6f 73 65 28 64 62 29 20 6f 72  te3_close(db) or
6e90: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
6ea0: 32 28 64 62 29 29 20 61 6e 64 0a 2a 2a 20 65 76  2(db)) and.** ev
6eb0: 65 72 79 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ery sqlite3_stmt
6ec0: 20 68 61 73 20 6e 6f 77 20 62 65 65 6e 20 66 69   has now been fi
6ed0: 6e 61 6c 69 7a 65 64 20 61 6e 64 20 65 76 65 72  nalized and ever
6ee0: 79 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  y sqlite3_backup
6ef0: 20 68 61 73 0a 2a 2a 20 66 69 6e 69 73 68 65 64   has.** finished
6f00: 2c 20 74 68 65 6e 20 66 72 65 65 20 61 6c 6c 20  , then free all 
6f10: 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 76 6f  resources..*/.vo
6f20: 69 64 20 73 71 6c 69 74 65 33 4c 65 61 76 65 4d  id sqlite3LeaveM
6f30: 75 74 65 78 41 6e 64 43 6c 6f 73 65 5a 6f 6d 62  utexAndCloseZomb
6f40: 69 65 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  ie(sqlite3 *db){
6f50: 0a 20 20 48 61 73 68 45 6c 65 6d 20 2a 69 3b 20  .  HashElem *i; 
6f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f70: 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65     /* Hash table
6f80: 20 69 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 69   iterator */.  i
6f90: 6e 74 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  nt j;..  /* If t
6fa0: 68 65 72 65 20 61 72 65 20 6f 75 74 73 74 61 6e  here are outstan
6fb0: 64 69 6e 67 20 73 71 6c 69 74 65 33 5f 73 74 6d  ding sqlite3_stm
6fc0: 74 20 6f 72 20 73 71 6c 69 74 65 33 5f 62 61 63  t or sqlite3_bac
6fd0: 6b 75 70 20 6f 62 6a 65 63 74 73 0a 20 20 2a 2a  kup objects.  **
6fe0: 20 6f 72 20 69 66 20 74 68 65 20 63 6f 6e 6e 65   or if the conne
6ff0: 63 74 69 6f 6e 20 68 61 73 20 6e 6f 74 20 79 65  ction has not ye
7000: 74 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 62 79  t been closed by
7010: 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 5f 76   sqlite3_close_v
7020: 32 28 29 2c 0a 20 20 2a 2a 20 74 68 65 6e 20 6a  2(),.  ** then j
7030: 75 73 74 20 6c 65 61 76 65 20 74 68 65 20 6d 75  ust leave the mu
7040: 74 65 78 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a  tex and return..
7050: 20 20 2a 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6d    */.  if( db->m
7060: 61 67 69 63 21 3d 53 51 4c 49 54 45 5f 4d 41 47  agic!=SQLITE_MAG
7070: 49 43 5f 5a 4f 4d 42 49 45 20 7c 7c 20 63 6f 6e  IC_ZOMBIE || con
7080: 6e 65 63 74 69 6f 6e 49 73 42 75 73 79 28 64 62  nectionIsBusy(db
7090: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
70a0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
70b0: 3e 6d 75 74 65 78 29 3b 0a 20 20 20 20 72 65 74  >mutex);.    ret
70c0: 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  urn;.  }..  /* I
70d0: 66 20 77 65 20 72 65 61 63 68 20 74 68 69 73 20  f we reach this 
70e0: 70 6f 69 6e 74 2c 20 69 74 20 6d 65 61 6e 73 20  point, it means 
70f0: 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
7100: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  e connection has
7110: 0a 20 20 2a 2a 20 63 6c 6f 73 65 64 20 61 6c 6c  .  ** closed all
7120: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 61 6e   sqlite3_stmt an
7130: 64 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  d sqlite3_backup
7140: 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 68 61 73   objects and has
7150: 20 62 65 65 6e 0a 20 20 2a 2a 20 70 61 73 73 65   been.  ** passe
7160: 64 20 74 6f 20 73 71 6c 69 74 65 33 5f 63 6c 6f  d to sqlite3_clo
7170: 73 65 20 28 6d 65 61 6e 69 6e 67 20 74 68 61 74  se (meaning that
7180: 20 69 74 20 69 73 20 61 20 7a 6f 6d 62 69 65 29   it is a zombie)
7190: 2e 20 20 54 68 65 72 65 66 6f 72 65 2c 0a 20 20  .  Therefore,.  
71a0: 2a 2a 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  ** go ahead and 
71b0: 66 72 65 65 20 61 6c 6c 20 72 65 73 6f 75 72 63  free all resourc
71c0: 65 73 2e 0a 20 20 2a 2f 0a 0a 20 20 2f 2a 20 49  es..  */..  /* I
71d0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
71e0: 69 73 20 6f 70 65 6e 2c 20 72 6f 6c 6c 20 69 74  is open, roll it
71f0: 20 62 61 63 6b 2e 20 54 68 69 73 20 61 6c 73 6f   back. This also
7200: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 69 66   ensures that if
7210: 0a 20 20 2a 2a 20 61 6e 79 20 64 61 74 61 62 61  .  ** any databa
7220: 73 65 20 73 63 68 65 6d 61 73 20 68 61 76 65 20  se schemas have 
7230: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 62 79  been modified by
7240: 20 61 6e 20 75 6e 63 6f 6d 6d 69 74 74 65 64 20   an uncommitted 
7250: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 2a 2a  transaction.  **
7260: 20 74 68 65 79 20 61 72 65 20 72 65 73 65 74 2e   they are reset.
7270: 20 41 6e 64 20 74 68 61 74 20 74 68 65 20 72 65   And that the re
7280: 71 75 69 72 65 64 20 62 2d 74 72 65 65 20 6d 75  quired b-tree mu
7290: 74 65 78 20 69 73 20 68 65 6c 64 20 74 6f 20 6d  tex is held to m
72a0: 61 6b 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ake.  ** the pag
72b0: 65 72 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20  er rollback and 
72c0: 73 63 68 65 6d 61 20 72 65 73 65 74 20 61 6e 20  schema reset an 
72d0: 61 74 6f 6d 69 63 20 6f 70 65 72 61 74 69 6f 6e  atomic operation
72e0: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 52 6f  . */.  sqlite3Ro
72f0: 6c 6c 62 61 63 6b 41 6c 6c 28 64 62 2c 20 53 51  llbackAll(db, SQ
7300: 4c 49 54 45 5f 4f 4b 29 3b 0a 0a 20 20 2f 2a 20  LITE_OK);..  /* 
7310: 46 72 65 65 20 61 6e 79 20 6f 75 74 73 74 61 6e  Free any outstan
7320: 64 69 6e 67 20 53 61 76 65 70 6f 69 6e 74 20 73  ding Savepoint s
7330: 74 72 75 63 74 75 72 65 73 2e 20 2a 2f 0a 20 20  tructures. */.  
7340: 73 71 6c 69 74 65 33 43 6c 6f 73 65 53 61 76 65  sqlite3CloseSave
7350: 70 6f 69 6e 74 73 28 64 62 29 3b 0a 0a 20 20 2f  points(db);..  /
7360: 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 64 61 74 61  * Close all data
7370: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  base connections
7380: 20 2a 2f 0a 20 20 66 6f 72 28 6a 3d 30 3b 20 6a   */.  for(j=0; j
7390: 3c 64 62 2d 3e 6e 44 62 3b 20 6a 2b 2b 29 7b 0a  <db->nDb; j++){.
73a0: 20 20 20 20 73 74 72 75 63 74 20 44 62 20 2a 70      struct Db *p
73b0: 44 62 20 3d 20 26 64 62 2d 3e 61 44 62 5b 6a 5d  Db = &db->aDb[j]
73c0: 3b 0a 20 20 20 20 69 66 28 20 70 44 62 2d 3e 70  ;.    if( pDb->p
73d0: 42 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Bt ){.      sqli
73e0: 74 65 33 42 74 72 65 65 43 6c 6f 73 65 28 70 44  te3BtreeClose(pD
73f0: 62 2d 3e 70 42 74 29 3b 0a 20 20 20 20 20 20 70  b->pBt);.      p
7400: 44 62 2d 3e 70 42 74 20 3d 20 30 3b 0a 20 20 20  Db->pBt = 0;.   
7410: 20 20 20 69 66 28 20 6a 21 3d 31 20 29 7b 0a 20     if( j!=1 ){. 
7420: 20 20 20 20 20 20 20 70 44 62 2d 3e 70 53 63 68         pDb->pSch
7430: 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  ema = 0;.      }
7440: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a 20  .    }.  }.  /* 
7450: 43 6c 65 61 72 20 74 68 65 20 54 45 4d 50 20 73  Clear the TEMP s
7460: 63 68 65 6d 61 20 73 65 70 61 72 61 74 65 6c 79  chema separately
7470: 20 61 6e 64 20 6c 61 73 74 20 2a 2f 0a 20 20 69   and last */.  i
7480: 66 28 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53  f( db->aDb[1].pS
7490: 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 73 71 6c  chema ){.    sql
74a0: 69 74 65 33 53 63 68 65 6d 61 43 6c 65 61 72 28  ite3SchemaClear(
74b0: 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68 65  db->aDb[1].pSche
74c0: 6d 61 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ma);.  }.  sqlit
74d0: 65 33 56 74 61 62 55 6e 6c 6f 63 6b 4c 69 73 74  e3VtabUnlockList
74e0: 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 46 72 65 65  (db);..  /* Free
74f0: 20 75 70 20 74 68 65 20 61 72 72 61 79 20 6f 66   up the array of
7500: 20 61 75 78 69 6c 69 61 72 79 20 64 61 74 61 62   auxiliary datab
7510: 61 73 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ases */.  sqlite
7520: 33 43 6f 6c 6c 61 70 73 65 44 61 74 61 62 61 73  3CollapseDatabas
7530: 65 41 72 72 61 79 28 64 62 29 3b 0a 20 20 61 73  eArray(db);.  as
7540: 73 65 72 74 28 20 64 62 2d 3e 6e 44 62 3c 3d 32  sert( db->nDb<=2
7550: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64 62   );.  assert( db
7560: 2d 3e 61 44 62 3d 3d 64 62 2d 3e 61 44 62 53 74  ->aDb==db->aDbSt
7570: 61 74 69 63 20 29 3b 0a 0a 20 20 2f 2a 20 54 65  atic );..  /* Te
7580: 6c 6c 20 74 68 65 20 63 6f 64 65 20 69 6e 20 6e  ll the code in n
7590: 6f 74 69 66 79 2e 63 20 74 68 61 74 20 74 68 65  otify.c that the
75a0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6e 6f 20 6c   connection no l
75b0: 6f 6e 67 65 72 20 68 6f 6c 64 73 20 61 6e 79 0a  onger holds any.
75c0: 20 20 2a 2a 20 6c 6f 63 6b 73 20 61 6e 64 20 64    ** locks and d
75d0: 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20  oes not require 
75e0: 61 6e 79 20 66 75 72 74 68 65 72 20 75 6e 6c 6f  any further unlo
75f0: 63 6b 2d 6e 6f 74 69 66 79 20 63 61 6c 6c 62 61  ck-notify callba
7600: 63 6b 73 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  cks..  */.  sqli
7610: 74 65 33 43 6f 6e 6e 65 63 74 69 6f 6e 43 6c 6f  te3ConnectionClo
7620: 73 65 64 28 64 62 29 3b 0a 0a 20 20 66 6f 72 28  sed(db);..  for(
7630: 6a 3d 30 3b 20 6a 3c 41 72 72 61 79 53 69 7a 65  j=0; j<ArraySize
7640: 28 64 62 2d 3e 61 46 75 6e 63 2e 61 29 3b 20 6a  (db->aFunc.a); j
7650: 2b 2b 29 7b 0a 20 20 20 20 46 75 6e 63 44 65 66  ++){.    FuncDef
7660: 20 2a 70 4e 65 78 74 2c 20 2a 70 48 61 73 68 2c   *pNext, *pHash,
7670: 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70 3d 64   *p;.    for(p=d
7680: 62 2d 3e 61 46 75 6e 63 2e 61 5b 6a 5d 3b 20 70  b->aFunc.a[j]; p
7690: 3b 20 70 3d 70 48 61 73 68 29 7b 0a 20 20 20 20  ; p=pHash){.    
76a0: 20 20 70 48 61 73 68 20 3d 20 70 2d 3e 70 48 61    pHash = p->pHa
76b0: 73 68 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  sh;.      while(
76c0: 20 70 20 29 7b 0a 20 20 20 20 20 20 20 20 66 75   p ){.        fu
76d0: 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28 64 62  nctionDestroy(db
76e0: 2c 20 70 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  , p);.        pN
76f0: 65 78 74 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a  ext = p->pNext;.
7700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 44          sqlite3D
7710: 62 46 72 65 65 28 64 62 2c 20 70 29 3b 0a 20 20  bFree(db, p);.  
7720: 20 20 20 20 20 20 70 20 3d 20 70 4e 65 78 74 3b        p = pNext;
7730: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7740: 20 7d 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74   }.  for(i=sqlit
7750: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
7760: 61 43 6f 6c 6c 53 65 71 29 3b 20 69 3b 20 69 3d  aCollSeq); i; i=
7770: 73 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69  sqliteHashNext(i
7780: 29 29 7b 0a 20 20 20 20 43 6f 6c 6c 53 65 71 20  )){.    CollSeq 
7790: 2a 70 43 6f 6c 6c 20 3d 20 28 43 6f 6c 6c 53 65  *pColl = (CollSe
77a0: 71 20 2a 29 73 71 6c 69 74 65 48 61 73 68 44 61  q *)sqliteHashDa
77b0: 74 61 28 69 29 3b 0a 20 20 20 20 2f 2a 20 49 6e  ta(i);.    /* In
77c0: 76 6f 6b 65 20 61 6e 79 20 64 65 73 74 72 75 63  voke any destruc
77d0: 74 6f 72 73 20 72 65 67 69 73 74 65 72 65 64 20  tors registered 
77e0: 66 6f 72 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  for collation se
77f0: 71 75 65 6e 63 65 20 75 73 65 72 20 64 61 74 61  quence user data
7800: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 6a 3d 30  . */.    for(j=0
7810: 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<3; j++){.   
7820: 20 20 20 69 66 28 20 70 43 6f 6c 6c 5b 6a 5d 2e     if( pColl[j].
7830: 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  xDel ){.        
7840: 70 43 6f 6c 6c 5b 6a 5d 2e 78 44 65 6c 28 70 43  pColl[j].xDel(pC
7850: 6f 6c 6c 5b 6a 5d 2e 70 55 73 65 72 29 3b 0a 20  oll[j].pUser);. 
7860: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
7870: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
7880: 62 2c 20 70 43 6f 6c 6c 29 3b 0a 20 20 7d 0a 20  b, pColl);.  }. 
7890: 20 73 71 6c 69 74 65 33 48 61 73 68 43 6c 65 61   sqlite3HashClea
78a0: 72 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 29  r(&db->aCollSeq)
78b0: 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ;.#ifndef SQLITE
78c0: 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
78d0: 4c 45 0a 20 20 66 6f 72 28 69 3d 73 71 6c 69 74  LE.  for(i=sqlit
78e0: 65 48 61 73 68 46 69 72 73 74 28 26 64 62 2d 3e  eHashFirst(&db->
78f0: 61 4d 6f 64 75 6c 65 29 3b 20 69 3b 20 69 3d 73  aModule); i; i=s
7900: 71 6c 69 74 65 48 61 73 68 4e 65 78 74 28 69 29  qliteHashNext(i)
7910: 29 7b 0a 20 20 20 20 4d 6f 64 75 6c 65 20 2a 70  ){.    Module *p
7920: 4d 6f 64 20 3d 20 28 4d 6f 64 75 6c 65 20 2a 29  Mod = (Module *)
7930: 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 69  sqliteHashData(i
7940: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 6f 64 2d  );.    if( pMod-
7950: 3e 78 44 65 73 74 72 6f 79 20 29 7b 0a 20 20 20  >xDestroy ){.   
7960: 20 20 20 70 4d 6f 64 2d 3e 78 44 65 73 74 72 6f     pMod->xDestro
7970: 79 28 70 4d 6f 64 2d 3e 70 41 75 78 29 3b 0a 20  y(pMod->pAux);. 
7980: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7990: 44 62 46 72 65 65 28 64 62 2c 20 70 4d 6f 64 29  DbFree(db, pMod)
79a0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 48  ;.  }.  sqlite3H
79b0: 61 73 68 43 6c 65 61 72 28 26 64 62 2d 3e 61 4d  ashClear(&db->aM
79c0: 6f 64 75 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a  odule);.#endif..
79d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64    sqlite3Error(d
79e0: 62 2c 20 53 51 4c 49 54 45 5f 4f 4b 29 3b 20 2f  b, SQLITE_OK); /
79f0: 2a 20 44 65 61 6c 6c 6f 63 61 74 65 73 20 61 6e  * Deallocates an
7a00: 79 20 63 61 63 68 65 64 20 65 72 72 6f 72 20 73  y cached error s
7a10: 74 72 69 6e 67 73 2e 20 2a 2f 0a 20 20 73 71 6c  trings. */.  sql
7a20: 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 64 62  ite3ValueFree(db
7a30: 2d 3e 70 45 72 72 29 3b 0a 20 20 73 71 6c 69 74  ->pErr);.  sqlit
7a40: 65 33 43 6c 6f 73 65 45 78 74 65 6e 73 69 6f 6e  e3CloseExtension
7a50: 73 28 64 62 29 3b 0a 23 69 66 20 53 51 4c 49 54  s(db);.#if SQLIT
7a60: 45 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43  E_USER_AUTHENTIC
7a70: 41 54 49 4f 4e 0a 20 20 73 71 6c 69 74 65 33 5f  ATION.  sqlite3_
7a80: 66 72 65 65 28 64 62 2d 3e 61 75 74 68 2e 7a 41  free(db->auth.zA
7a90: 75 74 68 55 73 65 72 29 3b 0a 20 20 73 71 6c 69  uthUser);.  sqli
7aa0: 74 65 33 5f 66 72 65 65 28 64 62 2d 3e 61 75 74  te3_free(db->aut
7ab0: 68 2e 7a 41 75 74 68 50 57 29 3b 0a 23 65 6e 64  h.zAuthPW);.#end
7ac0: 69 66 0a 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20  if..  db->magic 
7ad0: 3d 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 45  = SQLITE_MAGIC_E
7ae0: 52 52 4f 52 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  RROR;..  /* The 
7af0: 74 65 6d 70 2d 64 61 74 61 62 61 73 65 20 73 63  temp-database sc
7b00: 68 65 6d 61 20 69 73 20 61 6c 6c 6f 63 61 74 65  hema is allocate
7b10: 64 20 64 69 66 66 65 72 65 6e 74 6c 79 20 66 72  d differently fr
7b20: 6f 6d 20 74 68 65 20 6f 74 68 65 72 20 73 63 68  om the other sch
7b30: 65 6d 61 0a 20 20 2a 2a 20 6f 62 6a 65 63 74 73  ema.  ** objects
7b40: 20 28 75 73 69 6e 67 20 73 71 6c 69 74 65 4d 61   (using sqliteMa
7b50: 6c 6c 6f 63 28 29 20 64 69 72 65 63 74 6c 79 2c  lloc() directly,
7b60: 20 69 6e 73 74 65 61 64 20 6f 66 20 73 71 6c 69   instead of sqli
7b70: 74 65 33 42 74 72 65 65 53 63 68 65 6d 61 28 29  te3BtreeSchema()
7b80: 29 2e 0a 20 20 2a 2a 20 53 6f 20 69 74 20 6e 65  )..  ** So it ne
7b90: 65 64 73 20 74 6f 20 62 65 20 66 72 65 65 64 20  eds to be freed 
7ba0: 68 65 72 65 2e 20 54 6f 64 6f 3a 20 57 68 79 20  here. Todo: Why 
7bb0: 6e 6f 74 20 72 6f 6c 6c 20 74 68 65 20 74 65 6d  not roll the tem
7bc0: 70 20 73 63 68 65 6d 61 20 69 6e 74 6f 0a 20 20  p schema into.  
7bd0: 2a 2a 20 74 68 65 20 73 61 6d 65 20 73 71 6c 69  ** the same sqli
7be0: 74 65 4d 61 6c 6c 6f 63 28 29 20 61 73 20 74 68  teMalloc() as th
7bf0: 65 20 6f 6e 65 20 74 68 61 74 20 61 6c 6c 6f 63  e one that alloc
7c00: 61 74 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ates the databas
7c10: 65 20 0a 20 20 2a 2a 20 73 74 72 75 63 74 75 72  e .  ** structur
7c20: 65 3f 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  e?.  */.  sqlite
7c30: 33 44 62 46 72 65 65 28 64 62 2c 20 64 62 2d 3e  3DbFree(db, db->
7c40: 61 44 62 5b 31 5d 2e 70 53 63 68 65 6d 61 29 3b  aDb[1].pSchema);
7c50: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
7c60: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
7c70: 29 3b 0a 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d  );.  db->magic =
7c80: 20 53 51 4c 49 54 45 5f 4d 41 47 49 43 5f 43 4c   SQLITE_MAGIC_CL
7c90: 4f 53 45 44 3b 0a 20 20 73 71 6c 69 74 65 33 5f  OSED;.  sqlite3_
7ca0: 6d 75 74 65 78 5f 66 72 65 65 28 64 62 2d 3e 6d  mutex_free(db->m
7cb0: 75 74 65 78 29 3b 0a 20 20 61 73 73 65 72 74 28  utex);.  assert(
7cc0: 20 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64 65 2e 6e   db->lookaside.n
7cd0: 4f 75 74 3d 3d 30 20 29 3b 20 20 2f 2a 20 46 61  Out==0 );  /* Fa
7ce0: 69 6c 73 20 6f 6e 20 61 20 6c 6f 6f 6b 61 73 69  ils on a lookasi
7cf0: 64 65 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 2a  de memory leak *
7d00: 2f 0a 20 20 69 66 28 20 64 62 2d 3e 6c 6f 6f 6b  /.  if( db->look
7d10: 61 73 69 64 65 2e 62 4d 61 6c 6c 6f 63 65 64 20  aside.bMalloced 
7d20: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
7d30: 72 65 65 28 64 62 2d 3e 6c 6f 6f 6b 61 73 69 64  ree(db->lookasid
7d40: 65 2e 70 53 74 61 72 74 29 3b 0a 20 20 7d 0a 20  e.pStart);.  }. 
7d50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 64 62   sqlite3_free(db
7d60: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
7d70: 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73  back all databas
7d80: 65 20 66 69 6c 65 73 2e 20 20 49 66 20 74 72 69  e files.  If tri
7d90: 70 43 6f 64 65 20 69 73 20 6e 6f 74 20 53 51 4c  pCode is not SQL
7da0: 49 54 45 5f 4f 4b 2c 20 74 68 65 6e 0a 2a 2a 20  ITE_OK, then.** 
7db0: 61 6e 79 20 6f 70 65 6e 20 63 75 72 73 6f 72 73  any open cursors
7dc0: 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64   are invalidated
7dd0: 20 28 22 74 72 69 70 70 65 64 22 20 2d 20 61 73   ("tripped" - as
7de0: 20 69 6e 20 22 74 72 69 70 70 69 6e 67 20 61 20   in "tripping a 
7df0: 63 69 72 63 75 69 74 0a 2a 2a 20 62 72 65 61 6b  circuit.** break
7e00: 65 72 22 29 20 61 6e 64 20 6d 61 64 65 20 74 6f  er") and made to
7e10: 20 72 65 74 75 72 6e 20 74 72 69 70 43 6f 64 65   return tripCode
7e20: 20 69 66 20 74 68 65 72 65 20 61 72 65 20 61 6e   if there are an
7e30: 79 20 66 75 72 74 68 65 72 0a 2a 2a 20 61 74 74  y further.** att
7e40: 65 6d 70 74 73 20 74 6f 20 75 73 65 20 74 68 61  empts to use tha
7e50: 74 20 63 75 72 73 6f 72 2e 0a 2a 2f 0a 76 6f 69  t cursor..*/.voi
7e60: 64 20 73 71 6c 69 74 65 33 52 6f 6c 6c 62 61 63  d sqlite3Rollbac
7e70: 6b 41 6c 6c 28 73 71 6c 69 74 65 33 20 2a 64 62  kAll(sqlite3 *db
7e80: 2c 20 69 6e 74 20 74 72 69 70 43 6f 64 65 29 7b  , int tripCode){
7e90: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
7ea0: 69 6e 54 72 61 6e 73 20 3d 20 30 3b 0a 20 20 61  inTrans = 0;.  a
7eb0: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
7ec0: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
7ed0: 74 65 78 29 20 29 3b 0a 20 20 73 71 6c 69 74 65  tex) );.  sqlite
7ee0: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
7ef0: 6f 63 28 29 3b 0a 0a 20 20 2f 2a 20 4f 62 74 61  oc();..  /* Obta
7f00: 69 6e 20 61 6c 6c 20 62 2d 74 72 65 65 20 6d 75  in all b-tree mu
7f10: 74 65 78 65 73 20 62 65 66 6f 72 65 20 6d 61 6b  texes before mak
7f20: 69 6e 67 20 61 6e 79 20 63 61 6c 6c 73 20 74 6f  ing any calls to
7f30: 20 42 74 72 65 65 52 6f 6c 6c 62 61 63 6b 28 29   BtreeRollback()
7f40: 2e 20 0a 20 20 2a 2a 20 54 68 69 73 20 69 73 20  . .  ** This is 
7f50: 69 6d 70 6f 72 74 61 6e 74 20 69 6e 20 63 61 73  important in cas
7f60: 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
7f70: 6e 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  n being rolled b
7f80: 61 63 6b 20 68 61 73 0a 20 20 2a 2a 20 6d 6f 64  ack has.  ** mod
7f90: 69 66 69 65 64 20 74 68 65 20 64 61 74 61 62 61  ified the databa
7fa0: 73 65 20 73 63 68 65 6d 61 2e 20 49 66 20 74 68  se schema. If th
7fb0: 65 20 62 2d 74 72 65 65 20 6d 75 74 65 78 65 73  e b-tree mutexes
7fc0: 20 61 72 65 20 6e 6f 74 20 74 61 6b 65 6e 0a 20   are not taken. 
7fd0: 20 2a 2a 20 68 65 72 65 2c 20 74 68 65 6e 20 61   ** here, then a
7fe0: 6e 6f 74 68 65 72 20 73 68 61 72 65 64 2d 63 61  nother shared-ca
7ff0: 63 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 6d  che connection m
8000: 69 67 68 74 20 73 6e 65 61 6b 20 69 6e 20 62 65  ight sneak in be
8010: 74 77 65 65 6e 0a 20 20 2a 2a 20 74 68 65 20 64  tween.  ** the d
8020: 61 74 61 62 61 73 65 20 72 6f 6c 6c 62 61 63 6b  atabase rollback
8030: 20 61 6e 64 20 73 63 68 65 6d 61 20 72 65 73 65   and schema rese
8040: 74 2c 20 77 68 69 63 68 20 63 61 6e 20 63 61 75  t, which can cau
8050: 73 65 20 66 61 6c 73 65 0a 20 20 2a 2a 20 63 6f  se false.  ** co
8060: 72 72 75 70 74 69 6f 6e 20 72 65 70 6f 72 74 73  rruption reports
8070: 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 2e 20   in some cases. 
8080: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 42 74 72   */.  sqlite3Btr
8090: 65 65 45 6e 74 65 72 41 6c 6c 28 64 62 29 3b 0a  eeEnterAll(db);.
80a0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62  .  for(i=0; i<db
80b0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
80c0: 20 42 74 72 65 65 20 2a 70 20 3d 20 64 62 2d 3e   Btree *p = db->
80d0: 61 44 62 5b 69 5d 2e 70 42 74 3b 0a 20 20 20 20  aDb[i].pBt;.    
80e0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 69  if( p ){.      i
80f0: 66 28 20 73 71 6c 69 74 65 33 42 74 72 65 65 49  f( sqlite3BtreeI
8100: 73 49 6e 54 72 61 6e 73 28 70 29 20 29 7b 0a 20  sInTrans(p) ){. 
8110: 20 20 20 20 20 20 20 69 6e 54 72 61 6e 73 20 3d         inTrans =
8120: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
8130: 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 52 6f    sqlite3BtreeRo
8140: 6c 6c 62 61 63 6b 28 70 2c 20 74 72 69 70 43 6f  llback(p, tripCo
8150: 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  de);.    }.  }. 
8160: 20 73 71 6c 69 74 65 33 56 74 61 62 52 6f 6c 6c   sqlite3VtabRoll
8170: 62 61 63 6b 28 64 62 29 3b 0a 20 20 73 71 6c 69  back(db);.  sqli
8180: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
8190: 6f 63 28 29 3b 0a 0a 20 20 69 66 28 20 28 64 62  oc();..  if( (db
81a0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 49  ->flags&SQLITE_I
81b0: 6e 74 65 72 6e 43 68 61 6e 67 65 73 29 21 3d 30  nternChanges)!=0
81c0: 20 26 26 20 64 62 2d 3e 69 6e 69 74 2e 62 75 73   && db->init.bus
81d0: 79 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  y==0 ){.    sqli
81e0: 74 65 33 45 78 70 69 72 65 50 72 65 70 61 72 65  te3ExpirePrepare
81f0: 64 53 74 61 74 65 6d 65 6e 74 73 28 64 62 29 3b  dStatements(db);
8200: 0a 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 65  .    sqlite3Rese
8210: 74 41 6c 6c 53 63 68 65 6d 61 73 4f 66 43 6f 6e  tAllSchemasOfCon
8220: 6e 65 63 74 69 6f 6e 28 64 62 29 3b 0a 20 20 7d  nection(db);.  }
8230: 0a 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c  .  sqlite3BtreeL
8240: 65 61 76 65 41 6c 6c 28 64 62 29 3b 0a 0a 20 20  eaveAll(db);..  
8250: 2f 2a 20 41 6e 79 20 64 65 66 65 72 72 65 64 20  /* Any deferred 
8260: 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
8270: 74 69 6f 6e 73 20 68 61 76 65 20 6e 6f 77 20 62  tions have now b
8280: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 2a 2f  een resolved. */
8290: 0a 20 20 64 62 2d 3e 6e 44 65 66 65 72 72 65 64  .  db->nDeferred
82a0: 43 6f 6e 73 20 3d 20 30 3b 0a 20 20 64 62 2d 3e  Cons = 0;.  db->
82b0: 6e 44 65 66 65 72 72 65 64 49 6d 6d 43 6f 6e 73  nDeferredImmCons
82c0: 20 3d 20 30 3b 0a 20 20 64 62 2d 3e 66 6c 61 67   = 0;.  db->flag
82d0: 73 20 26 3d 20 7e 53 51 4c 49 54 45 5f 44 65 66  s &= ~SQLITE_Def
82e0: 65 72 46 4b 73 3b 0a 0a 20 20 2f 2a 20 49 66 20  erFKs;..  /* If 
82f0: 6f 6e 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6e  one has been con
8300: 66 69 67 75 72 65 64 2c 20 69 6e 76 6f 6b 65 20  figured, invoke 
8310: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 2d 68 6f 6f  the rollback-hoo
8320: 6b 20 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20  k callback */.  
8330: 69 66 28 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63  if( db->xRollbac
8340: 6b 43 61 6c 6c 62 61 63 6b 20 26 26 20 28 69 6e  kCallback && (in
8350: 54 72 61 6e 73 20 7c 7c 20 21 64 62 2d 3e 61 75  Trans || !db->au
8360: 74 6f 43 6f 6d 6d 69 74 29 20 29 7b 0a 20 20 20  toCommit) ){.   
8370: 20 64 62 2d 3e 78 52 6f 6c 6c 62 61 63 6b 43 61   db->xRollbackCa
8380: 6c 6c 62 61 63 6b 28 64 62 2d 3e 70 52 6f 6c 6c  llback(db->pRoll
8390: 62 61 63 6b 41 72 67 29 3b 0a 20 20 7d 0a 7d 0a  backArg);.  }.}.
83a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
83b0: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 63 6f  static string co
83c0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6e 61 6d  ntaining the nam
83d0: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  e corresponding 
83e0: 74 6f 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  to the error cod
83f0: 65 0a 2a 2a 20 73 70 65 63 69 66 69 65 64 20 69  e.** specified i
8400: 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a  n the argument..
8410: 2a 2f 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28  */.#if (defined(
8420: 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
8430: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 29 20   SQLITE_OS_WIN) 
8440: 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
8450: 45 5f 54 45 53 54 29 0a 63 6f 6e 73 74 20 63 68  E_TEST).const ch
8460: 61 72 20 2a 73 71 6c 69 74 65 33 45 72 72 4e 61  ar *sqlite3ErrNa
8470: 6d 65 28 69 6e 74 20 72 63 29 7b 0a 20 20 63 6f  me(int rc){.  co
8480: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
8490: 3d 20 30 3b 0a 20 20 69 6e 74 20 69 2c 20 6f 72  = 0;.  int i, or
84a0: 69 67 52 63 20 3d 20 72 63 3b 0a 20 20 66 6f 72  igRc = rc;.  for
84b0: 28 69 3d 30 3b 20 69 3c 32 20 26 26 20 7a 4e 61  (i=0; i<2 && zNa
84c0: 6d 65 3d 3d 30 3b 20 69 2b 2b 2c 20 72 63 20 26  me==0; i++, rc &
84d0: 3d 20 30 78 66 66 29 7b 0a 20 20 20 20 73 77 69  = 0xff){.    swi
84e0: 74 63 68 28 20 72 63 20 29 7b 0a 20 20 20 20 20  tch( rc ){.     
84f0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4f 4b 3a   case SQLITE_OK:
8500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8510: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8520: 5f 4f 4b 22 3b 20 20 20 20 20 20 20 20 20 20 20  _OK";           
8530: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8540: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 52    case SQLITE_ER
8550: 52 4f 52 3a 20 20 20 20 20 20 20 20 20 20 20 20  ROR:            
8560: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8570: 45 5f 45 52 52 4f 52 22 3b 20 20 20 20 20 20 20  E_ERROR";       
8580: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8590: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
85a0: 4e 54 45 52 4e 41 4c 3a 20 20 20 20 20 20 20 20  NTERNAL:        
85b0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
85c0: 54 45 5f 49 4e 54 45 52 4e 41 4c 22 3b 20 20 20  TE_INTERNAL";   
85d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
85e0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
85f0: 50 45 52 4d 3a 20 20 20 20 20 20 20 20 20 20 20  PERM:           
8600: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8610: 49 54 45 5f 50 45 52 4d 22 3b 20 20 20 20 20 20  ITE_PERM";      
8620: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8630: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8640: 5f 41 42 4f 52 54 3a 20 20 20 20 20 20 20 20 20  _ABORT:         
8650: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8660: 4c 49 54 45 5f 41 42 4f 52 54 22 3b 20 20 20 20  LITE_ABORT";    
8670: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
8680: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8690: 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42 41 43 4b  E_ABORT_ROLLBACK
86a0: 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53  :     zName = "S
86b0: 51 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c  QLITE_ABORT_ROLL
86c0: 42 41 43 4b 22 3b 20 20 20 20 62 72 65 61 6b 3b  BACK";    break;
86d0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
86e0: 54 45 5f 42 55 53 59 3a 20 20 20 20 20 20 20 20  TE_BUSY:        
86f0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8700: 53 51 4c 49 54 45 5f 42 55 53 59 22 3b 20 20 20  SQLITE_BUSY";   
8710: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
8720: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8730: 49 54 45 5f 42 55 53 59 5f 52 45 43 4f 56 45 52  ITE_BUSY_RECOVER
8740: 59 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  Y:      zName = 
8750: 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 43  "SQLITE_BUSY_REC
8760: 4f 56 45 52 59 22 3b 20 20 20 20 20 62 72 65 61  OVERY";     brea
8770: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8780: 4c 49 54 45 5f 42 55 53 59 5f 53 4e 41 50 53 48  LITE_BUSY_SNAPSH
8790: 4f 54 3a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  OT:      zName =
87a0: 20 22 53 51 4c 49 54 45 5f 42 55 53 59 5f 53 4e   "SQLITE_BUSY_SN
87b0: 41 50 53 48 4f 54 22 3b 20 20 20 20 20 62 72 65  APSHOT";     bre
87c0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
87d0: 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 3a 20 20 20  QLITE_LOCKED:   
87e0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
87f0: 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44  = "SQLITE_LOCKED
8800: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
8810: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8820: 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 5f 53 48  SQLITE_LOCKED_SH
8830: 41 52 45 44 43 41 43 48 45 3a 20 7a 4e 61 6d 65  AREDCACHE: zName
8840: 20 3d 20 22 53 51 4c 49 54 45 5f 4c 4f 43 4b 45   = "SQLITE_LOCKE
8850: 44 5f 53 48 41 52 45 44 43 41 43 48 45 22 3b 62  D_SHAREDCACHE";b
8860: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8870: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 20 20   SQLITE_NOMEM:  
8880: 20 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d              zNam
8890: 65 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 4d 45  e = "SQLITE_NOME
88a0: 4d 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  M";             
88b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
88c0: 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e 4c  e SQLITE_READONL
88d0: 59 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61  Y:           zNa
88e0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45 41  me = "SQLITE_REA
88f0: 44 4f 4e 4c 59 22 3b 20 20 20 20 20 20 20 20 20  DONLY";         
8900: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8910: 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f 4e  se SQLITE_READON
8920: 4c 59 5f 52 45 43 4f 56 45 52 59 3a 20 20 7a 4e  LY_RECOVERY:  zN
8930: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52 45  ame = "SQLITE_RE
8940: 41 44 4f 4e 4c 59 5f 52 45 43 4f 56 45 52 59 22  ADONLY_RECOVERY"
8950: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63  ; break;.      c
8960: 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44 4f  ase SQLITE_READO
8970: 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b 3a 20 20 7a  NLY_CANTLOCK:  z
8980: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 52  Name = "SQLITE_R
8990: 45 41 44 4f 4e 4c 59 5f 43 41 4e 54 4c 4f 43 4b  EADONLY_CANTLOCK
89a0: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
89b0: 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41 44  case SQLITE_READ
89c0: 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43 4b 3a 20 20  ONLY_ROLLBACK:  
89d0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
89e0: 52 45 41 44 4f 4e 4c 59 5f 52 4f 4c 4c 42 41 43  READONLY_ROLLBAC
89f0: 4b 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  K"; break;.     
8a00: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 52 45 41   case SQLITE_REA
8a10: 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45 44 3a 20 20  DONLY_DBMOVED:  
8a20: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
8a30: 5f 52 45 41 44 4f 4e 4c 59 5f 44 42 4d 4f 56 45  _READONLY_DBMOVE
8a40: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
8a50: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4e    case SQLITE_IN
8a60: 54 45 52 52 55 50 54 3a 20 20 20 20 20 20 20 20  TERRUPT:        
8a70: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
8a80: 45 5f 49 4e 54 45 52 52 55 50 54 22 3b 20 20 20  E_INTERRUPT";   
8a90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8aa0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
8ab0: 4f 45 52 52 3a 20 20 20 20 20 20 20 20 20 20 20  OERR:           
8ac0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
8ad0: 54 45 5f 49 4f 45 52 52 22 3b 20 20 20 20 20 20  TE_IOERR";      
8ae0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8af0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
8b00: 49 4f 45 52 52 5f 52 45 41 44 3a 20 20 20 20 20  IOERR_READ:     
8b10: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
8b20: 49 54 45 5f 49 4f 45 52 52 5f 52 45 41 44 22 3b  ITE_IOERR_READ";
8b30: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
8b40: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
8b50: 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41  _IOERR_SHORT_REA
8b60: 44 3a 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51  D:   zName = "SQ
8b70: 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
8b80: 5f 52 45 41 44 22 3b 20 20 62 72 65 61 6b 3b 0a  _READ";  break;.
8b90: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
8ba0: 45 5f 49 4f 45 52 52 5f 57 52 49 54 45 3a 20 20  E_IOERR_WRITE:  
8bb0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
8bc0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 57 52 49 54  QLITE_IOERR_WRIT
8bd0: 45 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  E";       break;
8be0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
8bf0: 54 45 5f 49 4f 45 52 52 5f 46 53 59 4e 43 3a 20  TE_IOERR_FSYNC: 
8c00: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
8c10: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 59  SQLITE_IOERR_FSY
8c20: 4e 43 22 3b 20 20 20 20 20 20 20 62 72 65 61 6b  NC";       break
8c30: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
8c40: 49 54 45 5f 49 4f 45 52 52 5f 44 49 52 5f 46 53  ITE_IOERR_DIR_FS
8c50: 59 4e 43 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  YNC:    zName = 
8c60: 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44 49  "SQLITE_IOERR_DI
8c70: 52 5f 46 53 59 4e 43 22 3b 20 20 20 62 72 65 61  R_FSYNC";   brea
8c80: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
8c90: 4c 49 54 45 5f 49 4f 45 52 52 5f 54 52 55 4e 43  LITE_IOERR_TRUNC
8ca0: 41 54 45 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d  ATE:     zName =
8cb0: 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 54   "SQLITE_IOERR_T
8cc0: 52 55 4e 43 41 54 45 22 3b 20 20 20 20 62 72 65  RUNCATE";    bre
8cd0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
8ce0: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 46 53 54 41  QLITE_IOERR_FSTA
8cf0: 54 3a 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20  T:        zName 
8d00: 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  = "SQLITE_IOERR_
8d10: 46 53 54 41 54 22 3b 20 20 20 20 20 20 20 62 72  FSTAT";       br
8d20: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
8d30: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 55 4e 4c  SQLITE_IOERR_UNL
8d40: 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65  OCK:       zName
8d50: 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52 52   = "SQLITE_IOERR
8d60: 5f 55 4e 4c 4f 43 4b 22 3b 20 20 20 20 20 20 62  _UNLOCK";      b
8d70: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8d80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 52 44   SQLITE_IOERR_RD
8d90: 4c 4f 43 4b 3a 20 20 20 20 20 20 20 7a 4e 61 6d  LOCK:       zNam
8da0: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8db0: 52 5f 52 44 4c 4f 43 4b 22 3b 20 20 20 20 20 20  R_RDLOCK";      
8dc0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8dd0: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 44  e SQLITE_IOERR_D
8de0: 45 4c 45 54 45 3a 20 20 20 20 20 20 20 7a 4e 61  ELETE:       zNa
8df0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8e00: 52 52 5f 44 45 4c 45 54 45 22 3b 20 20 20 20 20  RR_DELETE";     
8e10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8e20: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8e30: 4e 4f 4d 45 4d 3a 20 20 20 20 20 20 20 20 7a 4e  NOMEM:        zN
8e40: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
8e50: 45 52 52 5f 4e 4f 4d 45 4d 22 3b 20 20 20 20 20  ERR_NOMEM";     
8e60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
8e70: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
8e80: 5f 41 43 43 45 53 53 3a 20 20 20 20 20 20 20 7a  _ACCESS:       z
8e90: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
8ea0: 4f 45 52 52 5f 41 43 43 45 53 53 22 3b 20 20 20  OERR_ACCESS";   
8eb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8ec0: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
8ed0: 52 5f 43 48 45 43 4b 52 45 53 45 52 56 45 44 4c  R_CHECKRESERVEDL
8ee0: 4f 43 4b 3a 0a 20 20 20 20 20 20 20 20 20 20 20  OCK:.           
8ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8f00: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
8f10: 4c 49 54 45 5f 49 4f 45 52 52 5f 43 48 45 43 4b  LITE_IOERR_CHECK
8f20: 52 45 53 45 52 56 45 44 4c 4f 43 4b 22 3b 20 62  RESERVEDLOCK"; b
8f30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
8f40: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4c 4f   SQLITE_IOERR_LO
8f50: 43 4b 3a 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  CK:         zNam
8f60: 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45 52  e = "SQLITE_IOER
8f70: 52 5f 4c 4f 43 4b 22 3b 20 20 20 20 20 20 20 20  R_LOCK";        
8f80: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
8f90: 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43  e SQLITE_IOERR_C
8fa0: 4c 4f 53 45 3a 20 20 20 20 20 20 20 20 7a 4e 61  LOSE:        zNa
8fb0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f 45  me = "SQLITE_IOE
8fc0: 52 52 5f 43 4c 4f 53 45 22 3b 20 20 20 20 20 20  RR_CLOSE";      
8fd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61   break;.      ca
8fe0: 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  se SQLITE_IOERR_
8ff0: 44 49 52 5f 43 4c 4f 53 45 3a 20 20 20 20 7a 4e  DIR_CLOSE:    zN
9000: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49 4f  ame = "SQLITE_IO
9010: 45 52 52 5f 44 49 52 5f 43 4c 4f 53 45 22 3b 20  ERR_DIR_CLOSE"; 
9020: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9030: 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  ase SQLITE_IOERR
9040: 5f 53 48 4d 4f 50 45 4e 3a 20 20 20 20 20 20 7a  _SHMOPEN:      z
9050: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 49  Name = "SQLITE_I
9060: 4f 45 52 52 5f 53 48 4d 4f 50 45 4e 22 3b 20 20  OERR_SHMOPEN";  
9070: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9080: 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45 52  case SQLITE_IOER
9090: 52 5f 53 48 4d 53 49 5a 45 3a 20 20 20 20 20 20  R_SHMSIZE:      
90a0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
90b0: 49 4f 45 52 52 5f 53 48 4d 53 49 5a 45 22 3b 20  IOERR_SHMSIZE"; 
90c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
90d0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f 45   case SQLITE_IOE
90e0: 52 52 5f 53 48 4d 4c 4f 43 4b 3a 20 20 20 20 20  RR_SHMLOCK:     
90f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9100: 5f 49 4f 45 52 52 5f 53 48 4d 4c 4f 43 4b 22 3b  _IOERR_SHMLOCK";
9110: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9120: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49 4f    case SQLITE_IO
9130: 45 52 52 5f 53 48 4d 4d 41 50 3a 20 20 20 20 20  ERR_SHMMAP:     
9140: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9150: 45 5f 49 4f 45 52 52 5f 53 48 4d 4d 41 50 22 3b  E_IOERR_SHMMAP";
9160: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9170: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
9180: 4f 45 52 52 5f 53 45 45 4b 3a 20 20 20 20 20 20  OERR_SEEK:      
9190: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
91a0: 54 45 5f 49 4f 45 52 52 5f 53 45 45 4b 22 3b 20  TE_IOERR_SEEK"; 
91b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
91c0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
91d0: 49 4f 45 52 52 5f 44 45 4c 45 54 45 5f 4e 4f 45  IOERR_DELETE_NOE
91e0: 4e 54 3a 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c  NT: zName = "SQL
91f0: 49 54 45 5f 49 4f 45 52 52 5f 44 45 4c 45 54 45  ITE_IOERR_DELETE
9200: 5f 4e 4f 45 4e 54 22 3b 62 72 65 61 6b 3b 0a 20  _NOENT";break;. 
9210: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9220: 5f 49 4f 45 52 52 5f 4d 4d 41 50 3a 20 20 20 20  _IOERR_MMAP:    
9230: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9240: 4c 49 54 45 5f 49 4f 45 52 52 5f 4d 4d 41 50 22  LITE_IOERR_MMAP"
9250: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
9260: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9270: 45 5f 49 4f 45 52 52 5f 47 45 54 54 45 4d 50 50  E_IOERR_GETTEMPP
9280: 41 54 48 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  ATH:  zName = "S
9290: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 47 45 54 54  QLITE_IOERR_GETT
92a0: 45 4d 50 50 41 54 48 22 3b 20 62 72 65 61 6b 3b  EMPPATH"; break;
92b0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
92c0: 54 45 5f 49 4f 45 52 52 5f 43 4f 4e 56 50 41 54  TE_IOERR_CONVPAT
92d0: 48 3a 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22  H:     zName = "
92e0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 43 4f 4e  SQLITE_IOERR_CON
92f0: 56 50 41 54 48 22 3b 20 20 20 20 62 72 65 61 6b  VPATH";    break
9300: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9310: 49 54 45 5f 43 4f 52 52 55 50 54 3a 20 20 20 20  ITE_CORRUPT:    
9320: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9330: 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 22  "SQLITE_CORRUPT"
9340: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
9350: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9360: 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 56 54 41  LITE_CORRUPT_VTA
9370: 42 3a 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d  B:       zName =
9380: 20 22 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54   "SQLITE_CORRUPT
9390: 5f 56 54 41 42 22 3b 20 20 20 20 20 20 62 72 65  _VTAB";      bre
93a0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
93b0: 51 4c 49 54 45 5f 4e 4f 54 46 4f 55 4e 44 3a 20  QLITE_NOTFOUND: 
93c0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
93d0: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 46 4f 55  = "SQLITE_NOTFOU
93e0: 4e 44 22 3b 20 20 20 20 20 20 20 20 20 20 62 72  ND";          br
93f0: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9400: 53 51 4c 49 54 45 5f 46 55 4c 4c 3a 20 20 20 20  SQLITE_FULL:    
9410: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9420: 20 3d 20 22 53 51 4c 49 54 45 5f 46 55 4c 4c 22   = "SQLITE_FULL"
9430: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  ;              b
9440: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9450: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
9460: 3a 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d  :           zNam
9470: 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e 54  e = "SQLITE_CANT
9480: 4f 50 45 4e 22 3b 20 20 20 20 20 20 20 20 20 20  OPEN";          
9490: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
94a0: 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45  e SQLITE_CANTOPE
94b0: 4e 5f 4e 4f 54 45 4d 50 44 49 52 3a 20 7a 4e 61  N_NOTEMPDIR: zNa
94c0: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41 4e  me = "SQLITE_CAN
94d0: 54 4f 50 45 4e 5f 4e 4f 54 45 4d 50 44 49 52 22  TOPEN_NOTEMPDIR"
94e0: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
94f0: 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  se SQLITE_CANTOP
9500: 45 4e 5f 49 53 44 49 52 3a 20 20 20 20 20 7a 4e  EN_ISDIR:     zN
9510: 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 41  ame = "SQLITE_CA
9520: 4e 54 4f 50 45 4e 5f 49 53 44 49 52 22 3b 20 20  NTOPEN_ISDIR";  
9530: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63    break;.      c
9540: 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f  ase SQLITE_CANTO
9550: 50 45 4e 5f 46 55 4c 4c 50 41 54 48 3a 20 20 7a  PEN_FULLPATH:  z
9560: 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43  Name = "SQLITE_C
9570: 41 4e 54 4f 50 45 4e 5f 46 55 4c 4c 50 41 54 48  ANTOPEN_FULLPATH
9580: 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20  "; break;.      
9590: 63 61 73 65 20 53 51 4c 49 54 45 5f 43 41 4e 54  case SQLITE_CANT
95a0: 4f 50 45 4e 5f 43 4f 4e 56 50 41 54 48 3a 20 20  OPEN_CONVPATH:  
95b0: 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f  zName = "SQLITE_
95c0: 43 41 4e 54 4f 50 45 4e 5f 43 4f 4e 56 50 41 54  CANTOPEN_CONVPAT
95d0: 48 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  H"; break;.     
95e0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 50 52 4f   case SQLITE_PRO
95f0: 54 4f 43 4f 4c 3a 20 20 20 20 20 20 20 20 20 20  TOCOL:          
9600: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9610: 5f 50 52 4f 54 4f 43 4f 4c 22 3b 20 20 20 20 20  _PROTOCOL";     
9620: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9630: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 45 4d    case SQLITE_EM
9640: 50 54 59 3a 20 20 20 20 20 20 20 20 20 20 20 20  PTY:            
9650: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9660: 45 5f 45 4d 50 54 59 22 3b 20 20 20 20 20 20 20  E_EMPTY";       
9670: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9680: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 53     case SQLITE_S
9690: 43 48 45 4d 41 3a 20 20 20 20 20 20 20 20 20 20  CHEMA:          
96a0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
96b0: 54 45 5f 53 43 48 45 4d 41 22 3b 20 20 20 20 20  TE_SCHEMA";     
96c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
96d0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
96e0: 54 4f 4f 42 49 47 3a 20 20 20 20 20 20 20 20 20  TOOBIG:         
96f0: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9700: 49 54 45 5f 54 4f 4f 42 49 47 22 3b 20 20 20 20  ITE_TOOBIG";    
9710: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9720: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9730: 5f 43 4f 4e 53 54 52 41 49 4e 54 3a 20 20 20 20  _CONSTRAINT:    
9740: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9750: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 22  LITE_CONSTRAINT"
9760: 3b 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ;        break;.
9770: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9780: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 55 4e 49  E_CONSTRAINT_UNI
9790: 51 55 45 3a 20 20 7a 4e 61 6d 65 20 3d 20 22 53  QUE:  zName = "S
97a0: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
97b0: 5f 55 4e 49 51 55 45 22 3b 20 62 72 65 61 6b 3b  _UNIQUE"; break;
97c0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
97d0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52  TE_CONSTRAINT_TR
97e0: 49 47 47 45 52 3a 20 7a 4e 61 6d 65 20 3d 20 22  IGGER: zName = "
97f0: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
9800: 54 5f 54 52 49 47 47 45 52 22 3b 62 72 65 61 6b  T_TRIGGER";break
9810: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9820: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 46  ITE_CONSTRAINT_F
9830: 4f 52 45 49 47 4e 4b 45 59 3a 0a 20 20 20 20 20  OREIGNKEY:.     
9840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9850: 20 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65             zName
9860: 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54   = "SQLITE_CONST
9870: 52 41 49 4e 54 5f 46 4f 52 45 49 47 4e 4b 45 59  RAINT_FOREIGNKEY
9880: 22 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ";   break;.    
9890: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f    case SQLITE_CO
98a0: 4e 53 54 52 41 49 4e 54 5f 43 48 45 43 4b 3a 20  NSTRAINT_CHECK: 
98b0: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
98c0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 48 45  E_CONSTRAINT_CHE
98d0: 43 4b 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  CK";  break;.   
98e0: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43     case SQLITE_C
98f0: 4f 4e 53 54 52 41 49 4e 54 5f 50 52 49 4d 41 52  ONSTRAINT_PRIMAR
9900: 59 4b 45 59 3a 0a 20 20 20 20 20 20 20 20 20 20  YKEY:.          
9910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9920: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9930: 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54  QLITE_CONSTRAINT
9940: 5f 50 52 49 4d 41 52 59 4b 45 59 22 3b 20 20 20  _PRIMARYKEY";   
9950: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73  break;.      cas
9960: 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  e SQLITE_CONSTRA
9970: 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 4e 61  INT_NOTNULL: zNa
9980: 6d 65 20 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e  me = "SQLITE_CON
9990: 53 54 52 41 49 4e 54 5f 4e 4f 54 4e 55 4c 4c 22  STRAINT_NOTNULL"
99a0: 3b 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61  ;break;.      ca
99b0: 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  se SQLITE_CONSTR
99c0: 41 49 4e 54 5f 43 4f 4d 4d 49 54 48 4f 4f 4b 3a  AINT_COMMITHOOK:
99d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
99e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99f0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9a00: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 43 4f 4d 4d  _CONSTRAINT_COMM
9a10: 49 54 48 4f 4f 4b 22 3b 20 20 20 62 72 65 61 6b  ITHOOK";   break
9a20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9a30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 56  ITE_CONSTRAINT_V
9a40: 54 41 42 3a 20 20 20 20 7a 4e 61 6d 65 20 3d 20  TAB:    zName = 
9a50: 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49  "SQLITE_CONSTRAI
9a60: 4e 54 5f 56 54 41 42 22 3b 20 20 20 62 72 65 61  NT_VTAB";   brea
9a70: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9a80: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f  LITE_CONSTRAINT_
9a90: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
9aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ab0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9ac0: 3d 20 22 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52  = "SQLITE_CONSTR
9ad0: 41 49 4e 54 5f 46 55 4e 43 54 49 4f 4e 22 3b 20  AINT_FUNCTION"; 
9ae0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9af0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 43 4f 4e   case SQLITE_CON
9b00: 53 54 52 41 49 4e 54 5f 52 4f 57 49 44 3a 20 20  STRAINT_ROWID:  
9b10: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9b20: 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 52 4f 57 49  _CONSTRAINT_ROWI
9b30: 44 22 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  D";  break;.    
9b40: 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d 49    case SQLITE_MI
9b50: 53 4d 41 54 43 48 3a 20 20 20 20 20 20 20 20 20  SMATCH:         
9b60: 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54    zName = "SQLIT
9b70: 45 5f 4d 49 53 4d 41 54 43 48 22 3b 20 20 20 20  E_MISMATCH";    
9b80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9b90: 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 4d     case SQLITE_M
9ba0: 49 53 55 53 45 3a 20 20 20 20 20 20 20 20 20 20  ISUSE:          
9bb0: 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49     zName = "SQLI
9bc0: 54 45 5f 4d 49 53 55 53 45 22 3b 20 20 20 20 20  TE_MISUSE";     
9bd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
9be0: 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
9bf0: 4e 4f 4c 46 53 3a 20 20 20 20 20 20 20 20 20 20  NOLFS:          
9c00: 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c      zName = "SQL
9c10: 49 54 45 5f 4e 4f 4c 46 53 22 3b 20 20 20 20 20  ITE_NOLFS";     
9c20: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
9c30: 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
9c40: 5f 41 55 54 48 3a 20 20 20 20 20 20 20 20 20 20  _AUTH:          
9c50: 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53 51       zName = "SQ
9c60: 4c 49 54 45 5f 41 55 54 48 22 3b 20 20 20 20 20  LITE_AUTH";     
9c70: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
9c80: 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
9c90: 45 5f 46 4f 52 4d 41 54 3a 20 20 20 20 20 20 20  E_FORMAT:       
9ca0: 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22 53        zName = "S
9cb0: 51 4c 49 54 45 5f 46 4f 52 4d 41 54 22 3b 20 20  QLITE_FORMAT";  
9cc0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
9cd0: 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49  .      case SQLI
9ce0: 54 45 5f 52 41 4e 47 45 3a 20 20 20 20 20 20 20  TE_RANGE:       
9cf0: 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 22         zName = "
9d00: 53 51 4c 49 54 45 5f 52 41 4e 47 45 22 3b 20 20  SQLITE_RANGE";  
9d10: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
9d20: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9d30: 49 54 45 5f 4e 4f 54 41 44 42 3a 20 20 20 20 20  ITE_NOTADB:     
9d40: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9d50: 22 53 51 4c 49 54 45 5f 4e 4f 54 41 44 42 22 3b  "SQLITE_NOTADB";
9d60: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
9d70: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9d80: 4c 49 54 45 5f 52 4f 57 3a 20 20 20 20 20 20 20  LITE_ROW:       
9d90: 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d           zName =
9da0: 20 22 53 51 4c 49 54 45 5f 52 4f 57 22 3b 20 20   "SQLITE_ROW";  
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
9dc0: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9dd0: 51 4c 49 54 45 5f 4e 4f 54 49 43 45 3a 20 20 20  QLITE_NOTICE:   
9de0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9df0: 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45  = "SQLITE_NOTICE
9e00: 22 3b 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ";            br
9e10: 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20  eak;.      case 
9e20: 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52 45  SQLITE_NOTICE_RE
9e30: 43 4f 56 45 52 5f 57 41 4c 3a 20 7a 4e 61 6d 65  COVER_WAL: zName
9e40: 20 3d 20 22 53 51 4c 49 54 45 5f 4e 4f 54 49 43   = "SQLITE_NOTIC
9e50: 45 5f 52 45 43 4f 56 45 52 5f 57 41 4c 22 3b 62  E_RECOVER_WAL";b
9e60: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65  reak;.      case
9e70: 20 53 51 4c 49 54 45 5f 4e 4f 54 49 43 45 5f 52   SQLITE_NOTICE_R
9e80: 45 43 4f 56 45 52 5f 52 4f 4c 4c 42 41 43 4b 3a  ECOVER_ROLLBACK:
9e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9eb0: 20 7a 4e 61 6d 65 20 3d 20 22 53 51 4c 49 54 45   zName = "SQLITE
9ec0: 5f 4e 4f 54 49 43 45 5f 52 45 43 4f 56 45 52 5f  _NOTICE_RECOVER_
9ed0: 52 4f 4c 4c 42 41 43 4b 22 3b 20 62 72 65 61 6b  ROLLBACK"; break
9ee0: 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51 4c  ;.      case SQL
9ef0: 49 54 45 5f 57 41 52 4e 49 4e 47 3a 20 20 20 20  ITE_WARNING:    
9f00: 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20          zName = 
9f10: 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 22  "SQLITE_WARNING"
9f20: 3b 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;           brea
9f30: 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53 51  k;.      case SQ
9f40: 4c 49 54 45 5f 57 41 52 4e 49 4e 47 5f 41 55 54  LITE_WARNING_AUT
9f50: 4f 49 4e 44 45 58 3a 20 20 7a 4e 61 6d 65 20 3d  OINDEX:  zName =
9f60: 20 22 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47   "SQLITE_WARNING
9f70: 5f 41 55 54 4f 49 4e 44 45 58 22 3b 20 62 72 65  _AUTOINDEX"; bre
9f80: 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 20 53  ak;.      case S
9f90: 51 4c 49 54 45 5f 44 4f 4e 45 3a 20 20 20 20 20  QLITE_DONE:     
9fa0: 20 20 20 20 20 20 20 20 20 20 7a 4e 61 6d 65 20            zName 
9fb0: 3d 20 22 53 51 4c 49 54 45 5f 44 4f 4e 45 22 3b  = "SQLITE_DONE";
9fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
9fd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
9fe0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 7b   if( zName==0 ){
9ff0: 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72  .    static char
a000: 20 7a 42 75 66 5b 35 30 5d 3b 0a 20 20 20 20 73   zBuf[50];.    s
a010: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
a020: 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 20 7a 42  sizeof(zBuf), zB
a030: 75 66 2c 20 22 53 51 4c 49 54 45 5f 55 4e 4b 4e  uf, "SQLITE_UNKN
a040: 4f 57 4e 28 25 64 29 22 2c 20 6f 72 69 67 52 63  OWN(%d)", origRc
a050: 29 3b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 7a  );.    zName = z
a060: 42 75 66 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Buf;.  }.  retur
a070: 6e 20 7a 4e 61 6d 65 3b 0a 7d 0a 23 65 6e 64 69  n zName;.}.#endi
a080: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
a090: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
a0a0: 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
a0b0: 68 65 20 6b 69 6e 64 20 6f 66 20 65 72 72 6f 72  he kind of error
a0c0: 20 73 70 65 63 69 66 69 65 64 20 69 6e 20 74 68   specified in th
a0d0: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  e.** argument..*
a0e0: 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
a0f0: 6c 69 74 65 33 45 72 72 53 74 72 28 69 6e 74 20  lite3ErrStr(int 
a100: 72 63 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rc){.  static co
a110: 6e 73 74 20 63 68 61 72 2a 20 63 6f 6e 73 74 20  nst char* const 
a120: 61 4d 73 67 5b 5d 20 3d 20 7b 0a 20 20 20 20 2f  aMsg[] = {.    /
a130: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 20 20 20 20  * SQLITE_OK     
a140: 20 20 20 20 20 2a 2f 20 22 6e 6f 74 20 61 6e 20       */ "not an 
a150: 65 72 72 6f 72 22 2c 0a 20 20 20 20 2f 2a 20 53  error",.    /* S
a160: 51 4c 49 54 45 5f 45 52 52 4f 52 20 20 20 20 20  QLITE_ERROR     
a170: 20 20 2a 2f 20 22 53 51 4c 20 6c 6f 67 69 63 20    */ "SQL logic 
a180: 65 72 72 6f 72 20 6f 72 20 6d 69 73 73 69 6e 67  error or missing
a190: 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 20 20   database",.    
a1a0: 2f 2a 20 53 51 4c 49 54 45 5f 49 4e 54 45 52 4e  /* SQLITE_INTERN
a1b0: 41 4c 20 20 20 20 2a 2f 20 30 2c 0a 20 20 20 20  AL    */ 0,.    
a1c0: 2f 2a 20 53 51 4c 49 54 45 5f 50 45 52 4d 20 20  /* SQLITE_PERM  
a1d0: 20 20 20 20 20 20 2a 2f 20 22 61 63 63 65 73 73        */ "access
a1e0: 20 70 65 72 6d 69 73 73 69 6f 6e 20 64 65 6e 69   permission deni
a1f0: 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49  ed",.    /* SQLI
a200: 54 45 5f 41 42 4f 52 54 20 20 20 20 20 20 20 2a  TE_ABORT       *
a210: 2f 20 22 63 61 6c 6c 62 61 63 6b 20 72 65 71 75  / "callback requ
a220: 65 73 74 65 64 20 71 75 65 72 79 20 61 62 6f 72  ested query abor
a230: 74 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  t",.    /* SQLIT
a240: 45 5f 42 55 53 59 20 20 20 20 20 20 20 20 2a 2f  E_BUSY        */
a250: 20 22 64 61 74 61 62 61 73 65 20 69 73 20 6c 6f   "database is lo
a260: 63 6b 65 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51  cked",.    /* SQ
a270: 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 20 20 20 20  LITE_LOCKED     
a280: 20 2a 2f 20 22 64 61 74 61 62 61 73 65 20 74 61   */ "database ta
a290: 62 6c 65 20 69 73 20 6c 6f 63 6b 65 64 22 2c 0a  ble is locked",.
a2a0: 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f      /* SQLITE_NO
a2b0: 4d 45 4d 20 20 20 20 20 20 20 2a 2f 20 22 6f 75  MEM       */ "ou
a2c0: 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 0a 20 20  t of memory",.  
a2d0: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52 45 41 44    /* SQLITE_READ
a2e0: 4f 4e 4c 59 20 20 20 20 2a 2f 20 22 61 74 74 65  ONLY    */ "atte
a2f0: 6d 70 74 20 74 6f 20 77 72 69 74 65 20 61 20 72  mpt to write a r
a300: 65 61 64 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  eadonly database
a310: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a320: 5f 49 4e 54 45 52 52 55 50 54 20 20 20 2a 2f 20  _INTERRUPT   */ 
a330: 22 69 6e 74 65 72 72 75 70 74 65 64 22 2c 0a 20  "interrupted",. 
a340: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 49 4f 45     /* SQLITE_IOE
a350: 52 52 20 20 20 20 20 20 20 2a 2f 20 22 64 69 73  RR       */ "dis
a360: 6b 20 49 2f 4f 20 65 72 72 6f 72 22 2c 0a 20 20  k I/O error",.  
a370: 20 20 2f 2a 20 53 51 4c 49 54 45 5f 43 4f 52 52    /* SQLITE_CORR
a380: 55 50 54 20 20 20 20 20 2a 2f 20 22 64 61 74 61  UPT     */ "data
a390: 62 61 73 65 20 64 69 73 6b 20 69 6d 61 67 65 20  base disk image 
a3a0: 69 73 20 6d 61 6c 66 6f 72 6d 65 64 22 2c 0a 20  is malformed",. 
a3b0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 54     /* SQLITE_NOT
a3c0: 46 4f 55 4e 44 20 20 20 20 2a 2f 20 22 75 6e 6b  FOUND    */ "unk
a3d0: 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 22 2c  nown operation",
a3e0: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
a3f0: 55 4c 4c 20 20 20 20 20 20 20 20 2a 2f 20 22 64  ULL        */ "d
a400: 61 74 61 62 61 73 65 20 6f 72 20 64 69 73 6b 20  atabase or disk 
a410: 69 73 20 66 75 6c 6c 22 2c 0a 20 20 20 20 2f 2a  is full",.    /*
a420: 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
a430: 20 20 20 20 2a 2f 20 22 75 6e 61 62 6c 65 20 74      */ "unable t
a440: 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  o open database 
a450: 66 69 6c 65 22 2c 0a 20 20 20 20 2f 2a 20 53 51  file",.    /* SQ
a460: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 20 20 20  LITE_PROTOCOL   
a470: 20 2a 2f 20 22 6c 6f 63 6b 69 6e 67 20 70 72 6f   */ "locking pro
a480: 74 6f 63 6f 6c 22 2c 0a 20 20 20 20 2f 2a 20 53  tocol",.    /* S
a490: 51 4c 49 54 45 5f 45 4d 50 54 59 20 20 20 20 20  QLITE_EMPTY     
a4a0: 20 20 2a 2f 20 22 74 61 62 6c 65 20 63 6f 6e 74    */ "table cont
a4b0: 61 69 6e 73 20 6e 6f 20 64 61 74 61 22 2c 0a 20  ains no data",. 
a4c0: 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 53 43 48     /* SQLITE_SCH
a4d0: 45 4d 41 20 20 20 20 20 20 2a 2f 20 22 64 61 74  EMA      */ "dat
a4e0: 61 62 61 73 65 20 73 63 68 65 6d 61 20 68 61 73  abase schema has
a4f0: 20 63 68 61 6e 67 65 64 22 2c 0a 20 20 20 20 2f   changed",.    /
a500: 2a 20 53 51 4c 49 54 45 5f 54 4f 4f 42 49 47 20  * SQLITE_TOOBIG 
a510: 20 20 20 20 20 2a 2f 20 22 73 74 72 69 6e 67 20       */ "string 
a520: 6f 72 20 62 6c 6f 62 20 74 6f 6f 20 62 69 67 22  or blob too big"
a530: 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f  ,.    /* SQLITE_
a540: 43 4f 4e 53 54 52 41 49 4e 54 20 20 2a 2f 20 22  CONSTRAINT  */ "
a550: 63 6f 6e 73 74 72 61 69 6e 74 20 66 61 69 6c 65  constraint faile
a560: 64 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54  d",.    /* SQLIT
a570: 45 5f 4d 49 53 4d 41 54 43 48 20 20 20 20 2a 2f  E_MISMATCH    */
a580: 20 22 64 61 74 61 74 79 70 65 20 6d 69 73 6d 61   "datatype misma
a590: 74 63 68 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c  tch",.    /* SQL
a5a0: 49 54 45 5f 4d 49 53 55 53 45 20 20 20 20 20 20  ITE_MISUSE      
a5b0: 2a 2f 20 22 6c 69 62 72 61 72 79 20 72 6f 75 74  */ "library rout
a5c0: 69 6e 65 20 63 61 6c 6c 65 64 20 6f 75 74 20 6f  ine called out o
a5d0: 66 20 73 65 71 75 65 6e 63 65 22 2c 0a 20 20 20  f sequence",.   
a5e0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4e 4f 4c 46 53   /* SQLITE_NOLFS
a5f0: 20 20 20 20 20 20 20 2a 2f 20 22 6c 61 72 67 65         */ "large
a600: 20 66 69 6c 65 20 73 75 70 70 6f 72 74 20 69 73   file support is
a610: 20 64 69 73 61 62 6c 65 64 22 2c 0a 20 20 20 20   disabled",.    
a620: 2f 2a 20 53 51 4c 49 54 45 5f 41 55 54 48 20 20  /* SQLITE_AUTH  
a630: 20 20 20 20 20 20 2a 2f 20 22 61 75 74 68 6f 72        */ "author
a640: 69 7a 61 74 69 6f 6e 20 64 65 6e 69 65 64 22 2c  ization denied",
a650: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 46  .    /* SQLITE_F
a660: 4f 52 4d 41 54 20 20 20 20 20 20 2a 2f 20 22 61  ORMAT      */ "a
a670: 75 78 69 6c 69 61 72 79 20 64 61 74 61 62 61 73  uxiliary databas
a680: 65 20 66 6f 72 6d 61 74 20 65 72 72 6f 72 22 2c  e format error",
a690: 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45 5f 52  .    /* SQLITE_R
a6a0: 41 4e 47 45 20 20 20 20 20 20 20 2a 2f 20 22 62  ANGE       */ "b
a6b0: 69 6e 64 20 6f 72 20 63 6f 6c 75 6d 6e 20 69 6e  ind or column in
a6c0: 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  dex out of range
a6d0: 22 2c 0a 20 20 20 20 2f 2a 20 53 51 4c 49 54 45  ",.    /* SQLITE
a6e0: 5f 4e 4f 54 41 44 42 20 20 20 20 20 20 2a 2f 20  _NOTADB      */ 
a6f0: 22 66 69 6c 65 20 69 73 20 65 6e 63 72 79 70 74  "file is encrypt
a700: 65 64 20 6f 72 20 69 73 20 6e 6f 74 20 61 20 64  ed or is not a d
a710: 61 74 61 62 61 73 65 22 2c 0a 20 20 7d 3b 0a 20  atabase",.  };. 
a720: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
a730: 72 20 3d 20 22 75 6e 6b 6e 6f 77 6e 20 65 72 72  r = "unknown err
a740: 6f 72 22 3b 0a 20 20 73 77 69 74 63 68 28 20 72  or";.  switch( r
a750: 63 20 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51  c ){.    case SQ
a760: 4c 49 54 45 5f 41 42 4f 52 54 5f 52 4f 4c 4c 42  LITE_ABORT_ROLLB
a770: 41 43 4b 3a 20 7b 0a 20 20 20 20 20 20 7a 45 72  ACK: {.      zEr
a780: 72 20 3d 20 22 61 62 6f 72 74 20 64 75 65 20 74  r = "abort due t
a790: 6f 20 52 4f 4c 4c 42 41 43 4b 22 3b 0a 20 20 20  o ROLLBACK";.   
a7a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a7b0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
a7c0: 20 20 20 20 20 72 63 20 26 3d 20 30 78 66 66 3b       rc &= 0xff;
a7d0: 0a 20 20 20 20 20 20 69 66 28 20 41 4c 57 41 59  .      if( ALWAY
a7e0: 53 28 72 63 3e 3d 30 29 20 26 26 20 72 63 3c 41  S(rc>=0) && rc<A
a7f0: 72 72 61 79 53 69 7a 65 28 61 4d 73 67 29 20 26  rraySize(aMsg) &
a800: 26 20 61 4d 73 67 5b 72 63 5d 21 3d 30 20 29 7b  & aMsg[rc]!=0 ){
a810: 0a 20 20 20 20 20 20 20 20 7a 45 72 72 20 3d 20  .        zErr = 
a820: 61 4d 73 67 5b 72 63 5d 3b 0a 20 20 20 20 20 20  aMsg[rc];.      
a830: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
a840: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
a850: 6e 20 7a 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n zErr;.}../*.**
a860: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6d   This routine im
a870: 70 6c 65 6d 65 6e 74 73 20 61 20 62 75 73 79 20  plements a busy 
a880: 63 61 6c 6c 62 61 63 6b 20 74 68 61 74 20 73 6c  callback that sl
a890: 65 65 70 73 20 61 6e 64 20 74 72 69 65 73 0a 2a  eeps and tries.*
a8a0: 2a 20 61 67 61 69 6e 20 75 6e 74 69 6c 20 61 20  * again until a 
a8b0: 74 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73  timeout value is
a8c0: 20 72 65 61 63 68 65 64 2e 20 20 54 68 65 20 74   reached.  The t
a8d0: 69 6d 65 6f 75 74 20 76 61 6c 75 65 20 69 73 0a  imeout value is.
a8e0: 2a 2a 20 61 6e 20 69 6e 74 65 67 65 72 20 6e 75  ** an integer nu
a8f0: 6d 62 65 72 20 6f 66 20 6d 69 6c 6c 69 73 65 63  mber of millisec
a900: 6f 6e 64 73 20 70 61 73 73 65 64 20 69 6e 20 61  onds passed in a
a910: 73 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 61  s the first.** a
a920: 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  rgument..*/.stat
a930: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 44 65 66  ic int sqliteDef
a940: 61 75 6c 74 42 75 73 79 43 61 6c 6c 62 61 63 6b  aultBusyCallback
a950: 28 0a 20 76 6f 69 64 20 2a 70 74 72 2c 20 20 20  (. void *ptr,   
a960: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
a970: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
a980: 6f 6e 20 2a 2f 0a 20 69 6e 74 20 63 6f 75 6e 74  on */. int count
a990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d  /* Number of tim
a9b0: 65 73 20 74 61 62 6c 65 20 68 61 73 20 62 65 65  es table has bee
a9c0: 6e 20 62 75 73 79 20 2a 2f 0a 29 7b 0a 23 69 66  n busy */.){.#if
a9d0: 20 53 51 4c 49 54 45 5f 4f 53 5f 57 49 4e 20 7c   SQLITE_OS_WIN |
a9e0: 7c 20 28 64 65 66 69 6e 65 64 28 48 41 56 45 5f  | (defined(HAVE_
a9f0: 55 53 4c 45 45 50 29 20 26 26 20 48 41 56 45 5f  USLEEP) && HAVE_
aa00: 55 53 4c 45 45 50 29 0a 20 20 73 74 61 74 69 63  USLEEP).  static
aa10: 20 63 6f 6e 73 74 20 75 38 20 64 65 6c 61 79 73   const u8 delays
aa20: 5b 5d 20 3d 0a 20 20 20 20 20 7b 20 31 2c 20 32  [] =.     { 1, 2
aa30: 2c 20 35 2c 20 31 30 2c 20 31 35 2c 20 32 30 2c  , 5, 10, 15, 20,
aa40: 20 32 35 2c 20 32 35 2c 20 20 32 35 2c 20 20 35   25, 25,  25,  5
aa50: 30 2c 20 20 35 30 2c 20 31 30 30 20 7d 3b 0a 20  0,  50, 100 };. 
aa60: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38   static const u8
aa70: 20 74 6f 74 61 6c 73 5b 5d 20 3d 0a 20 20 20 20   totals[] =.    
aa80: 20 7b 20 30 2c 20 31 2c 20 33 2c 20 20 38 2c 20   { 0, 1, 3,  8, 
aa90: 31 38 2c 20 33 33 2c 20 35 33 2c 20 37 38 2c 20  18, 33, 53, 78, 
aaa0: 31 30 33 2c 20 31 32 38 2c 20 31 37 38 2c 20 32  103, 128, 178, 2
aab0: 32 38 20 7d 3b 0a 23 20 64 65 66 69 6e 65 20 4e  28 };.# define N
aac0: 44 45 4c 41 59 20 41 72 72 61 79 53 69 7a 65 28  DELAY ArraySize(
aad0: 64 65 6c 61 79 73 29 0a 20 20 73 71 6c 69 74 65  delays).  sqlite
aae0: 33 20 2a 64 62 20 3d 20 28 73 71 6c 69 74 65 33  3 *db = (sqlite3
aaf0: 20 2a 29 70 74 72 3b 0a 20 20 69 6e 74 20 74 69   *)ptr;.  int ti
ab00: 6d 65 6f 75 74 20 3d 20 64 62 2d 3e 62 75 73 79  meout = db->busy
ab10: 54 69 6d 65 6f 75 74 3b 0a 20 20 69 6e 74 20 64  Timeout;.  int d
ab20: 65 6c 61 79 2c 20 70 72 69 6f 72 3b 0a 0a 20 20  elay, prior;..  
ab30: 61 73 73 65 72 74 28 20 63 6f 75 6e 74 3e 3d 30  assert( count>=0
ab40: 20 29 3b 0a 20 20 69 66 28 20 63 6f 75 6e 74 20   );.  if( count 
ab50: 3c 20 4e 44 45 4c 41 59 20 29 7b 0a 20 20 20 20  < NDELAY ){.    
ab60: 64 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 63  delay = delays[c
ab70: 6f 75 6e 74 5d 3b 0a 20 20 20 20 70 72 69 6f 72  ount];.    prior
ab80: 20 3d 20 74 6f 74 61 6c 73 5b 63 6f 75 6e 74 5d   = totals[count]
ab90: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
aba0: 65 6c 61 79 20 3d 20 64 65 6c 61 79 73 5b 4e 44  elay = delays[ND
abb0: 45 4c 41 59 2d 31 5d 3b 0a 20 20 20 20 70 72 69  ELAY-1];.    pri
abc0: 6f 72 20 3d 20 74 6f 74 61 6c 73 5b 4e 44 45 4c  or = totals[NDEL
abd0: 41 59 2d 31 5d 20 2b 20 64 65 6c 61 79 2a 28 63  AY-1] + delay*(c
abe0: 6f 75 6e 74 2d 28 4e 44 45 4c 41 59 2d 31 29 29  ount-(NDELAY-1))
abf0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 69 6f  ;.  }.  if( prio
ac00: 72 20 2b 20 64 65 6c 61 79 20 3e 20 74 69 6d 65  r + delay > time
ac10: 6f 75 74 20 29 7b 0a 20 20 20 20 64 65 6c 61 79  out ){.    delay
ac20: 20 3d 20 74 69 6d 65 6f 75 74 20 2d 20 70 72 69   = timeout - pri
ac30: 6f 72 3b 0a 20 20 20 20 69 66 28 20 64 65 6c 61  or;.    if( dela
ac40: 79 3c 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y<=0 ) return 0;
ac50: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
ac60: 53 6c 65 65 70 28 64 62 2d 3e 70 56 66 73 2c 20  Sleep(db->pVfs, 
ac70: 64 65 6c 61 79 2a 31 30 30 30 29 3b 0a 20 20 72  delay*1000);.  r
ac80: 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a 20  eturn 1;.#else. 
ac90: 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 28   sqlite3 *db = (
aca0: 73 71 6c 69 74 65 33 20 2a 29 70 74 72 3b 0a 20  sqlite3 *)ptr;. 
acb0: 20 69 6e 74 20 74 69 6d 65 6f 75 74 20 3d 20 28   int timeout = (
acc0: 28 73 71 6c 69 74 65 33 20 2a 29 70 74 72 29 2d  (sqlite3 *)ptr)-
acd0: 3e 62 75 73 79 54 69 6d 65 6f 75 74 3b 0a 20 20  >busyTimeout;.  
ace0: 69 66 28 20 28 63 6f 75 6e 74 2b 31 29 2a 31 30  if( (count+1)*10
acf0: 30 30 20 3e 20 74 69 6d 65 6f 75 74 20 29 7b 0a  00 > timeout ){.
ad00: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
ad10: 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  }.  sqlite3OsSle
ad20: 65 70 28 64 62 2d 3e 70 56 66 73 2c 20 31 30 30  ep(db->pVfs, 100
ad30: 30 30 30 30 29 3b 0a 20 20 72 65 74 75 72 6e 20  0000);.  return 
ad40: 31 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a  1;.#endif.}../*.
ad50: 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 67 69  ** Invoke the gi
ad60: 76 65 6e 20 62 75 73 79 20 68 61 6e 64 6c 65 72  ven busy handler
ad70: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
ad80: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 77  tine is called w
ad90: 68 65 6e 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  hen an operation
ada0: 20 66 61 69 6c 65 64 20 77 69 74 68 20 61 20 6c   failed with a l
adb0: 6f 63 6b 2e 0a 2a 2a 20 49 66 20 74 68 69 73 20  ock..** If this 
adc0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
add0: 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f  non-zero, the lo
ade0: 63 6b 20 69 73 20 72 65 74 72 69 65 64 2e 20 20  ck is retried.  
adf0: 49 66 20 69 74 0a 2a 2a 20 72 65 74 75 72 6e 73  If it.** returns
ae00: 20 30 2c 20 74 68 65 20 6f 70 65 72 61 74 69 6f   0, the operatio
ae10: 6e 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 6e  n aborts with an
ae20: 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
ae30: 6f 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  or..*/.int sqlit
ae40: 65 33 49 6e 76 6f 6b 65 42 75 73 79 48 61 6e 64  e3InvokeBusyHand
ae50: 6c 65 72 28 42 75 73 79 48 61 6e 64 6c 65 72 20  ler(BusyHandler 
ae60: 2a 70 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  *p){.  int rc;. 
ae70: 20 69 66 28 20 4e 45 56 45 52 28 70 3d 3d 30 29   if( NEVER(p==0)
ae80: 20 7c 7c 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20   || p->xFunc==0 
ae90: 7c 7c 20 70 2d 3e 6e 42 75 73 79 3c 30 20 29 20  || p->nBusy<0 ) 
aea0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
aeb0: 20 70 2d 3e 78 46 75 6e 63 28 70 2d 3e 70 41 72   p->xFunc(p->pAr
aec0: 67 2c 20 70 2d 3e 6e 42 75 73 79 29 3b 0a 20 20  g, p->nBusy);.  
aed0: 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20  if( rc==0 ){.   
aee0: 20 70 2d 3e 6e 42 75 73 79 20 3d 20 2d 31 3b 0a   p->nBusy = -1;.
aef0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e    }else{.    p->
af00: 6e 42 75 73 79 2b 2b 3b 0a 20 20 7d 0a 20 20 72  nBusy++;.  }.  r
af10: 65 74 75 72 6e 20 72 63 3b 20 0a 7d 0a 0a 2f 2a  eturn rc; .}../*
af20: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
af30: 20 73 65 74 73 20 74 68 65 20 62 75 73 79 20 63   sets the busy c
af40: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 61 6e 20 53  allback for an S
af50: 71 6c 69 74 65 20 64 61 74 61 62 61 73 65 20 74  qlite database t
af60: 6f 20 74 68 65 0a 2a 2a 20 67 69 76 65 6e 20 63  o the.** given c
af70: 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e  allback function
af80: 20 77 69 74 68 20 74 68 65 20 67 69 76 65 6e 20   with the given 
af90: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74  argument..*/.int
afa0: 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61   sqlite3_busy_ha
afb0: 6e 64 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33  ndler(.  sqlite3
afc0: 20 2a 64 62 2c 0a 20 20 69 6e 74 20 28 2a 78 42   *db,.  int (*xB
afd0: 75 73 79 29 28 76 6f 69 64 2a 2c 69 6e 74 29 2c  usy)(void*,int),
afe0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 0a 29 7b  .  void *pArg.){
aff0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
b000: 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
b010: 29 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  );.  db->busyHan
b020: 64 6c 65 72 2e 78 46 75 6e 63 20 3d 20 78 42 75  dler.xFunc = xBu
b030: 73 79 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61  sy;.  db->busyHa
b040: 6e 64 6c 65 72 2e 70 41 72 67 20 3d 20 70 41 72  ndler.pArg = pAr
b050: 67 3b 0a 20 20 64 62 2d 3e 62 75 73 79 48 61 6e  g;.  db->busyHan
b060: 64 6c 65 72 2e 6e 42 75 73 79 20 3d 20 30 3b 0a  dler.nBusy = 0;.
b070: 20 20 64 62 2d 3e 62 75 73 79 54 69 6d 65 6f 75    db->busyTimeou
b080: 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
b090: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
b0a0: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
b0b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
b0c0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b0d0: 4d 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c  MIT_PROGRESS_CAL
b0e0: 4c 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 54 68 69 73  LBACK./*.** This
b0f0: 20 72 6f 75 74 69 6e 65 20 73 65 74 73 20 74 68   routine sets th
b100: 65 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  e progress callb
b110: 61 63 6b 20 66 6f 72 20 61 6e 20 53 71 6c 69 74  ack for an Sqlit
b120: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68  e database to th
b130: 65 0a 2a 2a 20 67 69 76 65 6e 20 63 61 6c 6c 62  e.** given callb
b140: 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  ack function wit
b150: 68 20 74 68 65 20 67 69 76 65 6e 20 61 72 67 75  h the given argu
b160: 6d 65 6e 74 2e 20 54 68 65 20 70 72 6f 67 72 65  ment. The progre
b170: 73 73 20 63 61 6c 6c 62 61 63 6b 20 77 69 6c 6c  ss callback will
b180: 0a 2a 2a 20 62 65 20 69 6e 76 6f 6b 65 64 20 65  .** be invoked e
b190: 76 65 72 79 20 6e 4f 70 73 20 6f 70 63 6f 64 65  very nOps opcode
b1a0: 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
b1b0: 65 33 5f 70 72 6f 67 72 65 73 73 5f 68 61 6e 64  e3_progress_hand
b1c0: 6c 65 72 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ler(.  sqlite3 *
b1d0: 64 62 2c 20 0a 20 20 69 6e 74 20 6e 4f 70 73 2c  db, .  int nOps,
b1e0: 0a 20 20 69 6e 74 20 28 2a 78 50 72 6f 67 72 65  .  int (*xProgre
b1f0: 73 73 29 28 76 6f 69 64 2a 29 2c 20 0a 20 20 76  ss)(void*), .  v
b200: 6f 69 64 20 2a 70 41 72 67 0a 29 7b 0a 20 20 73  oid *pArg.){.  s
b210: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
b220: 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  er(db->mutex);. 
b230: 20 69 66 28 20 6e 4f 70 73 3e 30 20 29 7b 0a 20   if( nOps>0 ){. 
b240: 20 20 20 64 62 2d 3e 78 50 72 6f 67 72 65 73 73     db->xProgress
b250: 20 3d 20 78 50 72 6f 67 72 65 73 73 3b 0a 20 20   = xProgress;.  
b260: 20 20 64 62 2d 3e 6e 50 72 6f 67 72 65 73 73 4f    db->nProgressO
b270: 70 73 20 3d 20 28 75 6e 73 69 67 6e 65 64 29 6e  ps = (unsigned)n
b280: 4f 70 73 3b 0a 20 20 20 20 64 62 2d 3e 70 50 72  Ops;.    db->pPr
b290: 6f 67 72 65 73 73 41 72 67 20 3d 20 70 41 72 67  ogressArg = pArg
b2a0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64  ;.  }else{.    d
b2b0: 62 2d 3e 78 50 72 6f 67 72 65 73 73 20 3d 20 30  b->xProgress = 0
b2c0: 3b 0a 20 20 20 20 64 62 2d 3e 6e 50 72 6f 67 72  ;.    db->nProgr
b2d0: 65 73 73 4f 70 73 20 3d 20 30 3b 0a 20 20 20 20  essOps = 0;.    
b2e0: 64 62 2d 3e 70 50 72 6f 67 72 65 73 73 41 72 67  db->pProgressArg
b2f0: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69   = 0;.  }.  sqli
b300: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
b310: 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 7d 0a 23 65  db->mutex);.}.#e
b320: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ndif.../*.** Thi
b330: 73 20 72 6f 75 74 69 6e 65 20 69 6e 73 74 61 6c  s routine instal
b340: 6c 73 20 61 20 64 65 66 61 75 6c 74 20 62 75 73  ls a default bus
b350: 79 20 68 61 6e 64 6c 65 72 20 74 68 61 74 20 77  y handler that w
b360: 61 69 74 73 20 66 6f 72 20 74 68 65 0a 2a 2a 20  aits for the.** 
b370: 73 70 65 63 69 66 69 65 64 20 6e 75 6d 62 65 72  specified number
b380: 20 6f 66 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73   of milliseconds
b390: 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
b3a0: 67 20 30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  g 0..*/.int sqli
b3b0: 74 65 33 5f 62 75 73 79 5f 74 69 6d 65 6f 75 74  te3_busy_timeout
b3c0: 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
b3d0: 74 20 6d 73 29 7b 0a 20 20 69 66 28 20 6d 73 3e  t ms){.  if( ms>
b3e0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
b3f0: 5f 62 75 73 79 5f 68 61 6e 64 6c 65 72 28 64 62  _busy_handler(db
b400: 2c 20 73 71 6c 69 74 65 44 65 66 61 75 6c 74 42  , sqliteDefaultB
b410: 75 73 79 43 61 6c 6c 62 61 63 6b 2c 20 28 76 6f  usyCallback, (vo
b420: 69 64 2a 29 64 62 29 3b 0a 20 20 20 20 64 62 2d  id*)db);.    db-
b430: 3e 62 75 73 79 54 69 6d 65 6f 75 74 20 3d 20 6d  >busyTimeout = m
b440: 73 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  s;.  }else{.    
b450: 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 68 61 6e  sqlite3_busy_han
b460: 64 6c 65 72 28 64 62 2c 20 30 2c 20 30 29 3b 0a  dler(db, 0, 0);.
b470: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c    }.  return SQL
b480: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
b490: 20 43 61 75 73 65 20 61 6e 79 20 70 65 6e 64 69   Cause any pendi
b4a0: 6e 67 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20  ng operation to 
b4b0: 73 74 6f 70 20 61 74 20 69 74 73 20 65 61 72 6c  stop at its earl
b4c0: 69 65 73 74 20 6f 70 70 6f 72 74 75 6e 69 74 79  iest opportunity
b4d0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
b4e0: 33 5f 69 6e 74 65 72 72 75 70 74 28 73 71 6c 69  3_interrupt(sqli
b4f0: 74 65 33 20 2a 64 62 29 7b 0a 20 20 64 62 2d 3e  te3 *db){.  db->
b500: 75 31 2e 69 73 49 6e 74 65 72 72 75 70 74 65 64  u1.isInterrupted
b510: 20 3d 20 31 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20   = 1;.}.../*.** 
b520: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
b530: 20 65 78 61 63 74 6c 79 20 74 68 65 20 73 61 6d   exactly the sam
b540: 65 20 61 73 20 73 71 6c 69 74 65 33 5f 63 72 65  e as sqlite3_cre
b550: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 29 2c 20  ate_function(), 
b560: 65 78 63 65 70 74 0a 2a 2a 20 74 68 61 74 20 69  except.** that i
b570: 74 20 69 73 20 64 65 73 69 67 6e 65 64 20 74 6f  t is designed to
b580: 20 62 65 20 63 61 6c 6c 65 64 20 62 79 20 69 6e   be called by in
b590: 74 65 72 6e 61 6c 20 63 6f 64 65 2e 20 54 68 65  ternal code. The
b5a0: 20 64 69 66 66 65 72 65 6e 63 65 20 69 73 0a 2a   difference is.*
b5b0: 2a 20 74 68 61 74 20 69 66 20 61 20 6d 61 6c 6c  * that if a mall
b5c0: 6f 63 28 29 20 66 61 69 6c 73 20 69 6e 20 73 71  oc() fails in sq
b5d0: 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
b5e0: 63 74 69 6f 6e 28 29 2c 20 61 6e 20 65 72 72 6f  ction(), an erro
b5f0: 72 20 63 6f 64 65 0a 2a 2a 20 69 73 20 72 65 74  r code.** is ret
b600: 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 6d 61  urned and the ma
b610: 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61 67 20  llocFailed flag 
b620: 63 6c 65 61 72 65 64 2e 20 0a 2a 2f 0a 69 6e 74  cleared. .*/.int
b630: 20 73 71 6c 69 74 65 33 43 72 65 61 74 65 46 75   sqlite3CreateFu
b640: 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  nc(.  sqlite3 *d
b650: 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  b,.  const char 
b660: 2a 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c 0a  *zFunctionName,.
b670: 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20 69 6e    int nArg,.  in
b680: 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20 2a 70  t enc,.  void *p
b690: 55 73 65 72 44 61 74 61 2c 0a 20 20 76 6f 69 64  UserData,.  void
b6a0: 20 28 2a 78 46 75 6e 63 29 28 73 71 6c 69 74 65   (*xFunc)(sqlite
b6b0: 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74 2c 73  3_context*,int,s
b6c0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 29  qlite3_value **)
b6d0: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53 74 65 70  ,.  void (*xStep
b6e0: 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  )(sqlite3_contex
b6f0: 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33 5f 76  t*,int,sqlite3_v
b700: 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f 69 64  alue **),.  void
b710: 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c 69 74   (*xFinal)(sqlit
b720: 65 33 5f 63 6f 6e 74 65 78 74 2a 29 2c 0a 20 20  e3_context*),.  
b730: 46 75 6e 63 44 65 73 74 72 75 63 74 6f 72 20 2a  FuncDestructor *
b740: 70 44 65 73 74 72 75 63 74 6f 72 0a 29 7b 0a 20  pDestructor.){. 
b750: 20 46 75 6e 63 44 65 66 20 2a 70 3b 0a 20 20 69   FuncDef *p;.  i
b760: 6e 74 20 6e 4e 61 6d 65 3b 0a 20 20 69 6e 74 20  nt nName;.  int 
b770: 65 78 74 72 61 46 6c 61 67 73 3b 0a 0a 20 20 61  extraFlags;..  a
b780: 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 5f 6d  ssert( sqlite3_m
b790: 75 74 65 78 5f 68 65 6c 64 28 64 62 2d 3e 6d 75  utex_held(db->mu
b7a0: 74 65 78 29 20 29 3b 0a 20 20 69 66 28 20 7a 46  tex) );.  if( zF
b7b0: 75 6e 63 74 69 6f 6e 4e 61 6d 65 3d 3d 30 20 7c  unctionName==0 |
b7c0: 7c 0a 20 20 20 20 20 20 28 78 46 75 6e 63 20 26  |.      (xFunc &
b7d0: 26 20 28 78 46 69 6e 61 6c 20 7c 7c 20 78 53 74  & (xFinal || xSt
b7e0: 65 70 29 29 20 7c 7c 20 0a 20 20 20 20 20 20 28  ep)) || .      (
b7f0: 21 78 46 75 6e 63 20 26 26 20 28 78 46 69 6e 61  !xFunc && (xFina
b800: 6c 20 26 26 20 21 78 53 74 65 70 29 29 20 7c 7c  l && !xStep)) ||
b810: 0a 20 20 20 20 20 20 28 21 78 46 75 6e 63 20 26  .      (!xFunc &
b820: 26 20 28 21 78 46 69 6e 61 6c 20 26 26 20 78 53  & (!xFinal && xS
b830: 74 65 70 29 29 20 7c 7c 0a 20 20 20 20 20 20 28  tep)) ||.      (
b840: 6e 41 72 67 3c 2d 31 20 7c 7c 20 6e 41 72 67 3e  nArg<-1 || nArg>
b850: 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54  SQLITE_MAX_FUNCT
b860: 49 4f 4e 5f 41 52 47 29 20 7c 7c 0a 20 20 20 20  ION_ARG) ||.    
b870: 20 20 28 32 35 35 3c 28 6e 4e 61 6d 65 20 3d 20    (255<(nName = 
b880: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
b890: 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 29 29   zFunctionName))
b8a0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
b8b0: 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b  SQLITE_MISUSE_BK
b8c0: 50 54 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72  PT;.  }..  asser
b8d0: 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  t( SQLITE_FUNC_C
b8e0: 4f 4e 53 54 41 4e 54 3d 3d 53 51 4c 49 54 45 5f  ONSTANT==SQLITE_
b8f0: 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29 3b  DETERMINISTIC );
b900: 0a 20 20 65 78 74 72 61 46 6c 61 67 73 20 3d 20  .  extraFlags = 
b910: 65 6e 63 20 26 20 20 53 51 4c 49 54 45 5f 44 45  enc &  SQLITE_DE
b920: 54 45 52 4d 49 4e 49 53 54 49 43 3b 0a 20 20 65  TERMINISTIC;.  e
b930: 6e 63 20 26 3d 20 28 53 51 4c 49 54 45 5f 46 55  nc &= (SQLITE_FU
b940: 4e 43 5f 45 4e 43 4d 41 53 4b 7c 53 51 4c 49 54  NC_ENCMASK|SQLIT
b950: 45 5f 41 4e 59 29 3b 0a 20 20 0a 23 69 66 6e 64  E_ANY);.  .#ifnd
b960: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
b970: 54 46 31 36 0a 20 20 2f 2a 20 49 66 20 53 51 4c  TF16.  /* If SQL
b980: 49 54 45 5f 55 54 46 31 36 20 69 73 20 73 70 65  ITE_UTF16 is spe
b990: 63 69 66 69 65 64 20 61 73 20 74 68 65 20 65 6e  cified as the en
b9a0: 63 6f 64 69 6e 67 20 74 79 70 65 2c 20 74 72 61  coding type, tra
b9b0: 6e 73 66 6f 72 6d 20 74 68 69 73 0a 20 20 2a 2a  nsform this.  **
b9c0: 20 74 6f 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54   to one of SQLIT
b9d0: 45 5f 55 54 46 31 36 4c 45 20 6f 72 20 53 51 4c  E_UTF16LE or SQL
b9e0: 49 54 45 5f 55 54 46 31 36 42 45 20 75 73 69 6e  ITE_UTF16BE usin
b9f0: 67 20 74 68 65 0a 20 20 2a 2a 20 53 51 4c 49 54  g the.  ** SQLIT
ba00: 45 5f 55 54 46 31 36 4e 41 54 49 56 45 20 6d 61  E_UTF16NATIVE ma
ba10: 63 72 6f 2e 20 53 51 4c 49 54 45 5f 55 54 46 31  cro. SQLITE_UTF1
ba20: 36 20 69 73 20 6e 6f 74 20 75 73 65 64 20 69 6e  6 is not used in
ba30: 74 65 72 6e 61 6c 6c 79 2e 0a 20 20 2a 2a 0a 20  ternally..  **. 
ba40: 20 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 41 4e   ** If SQLITE_AN
ba50: 59 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  Y is specified, 
ba60: 61 64 64 20 74 68 72 65 65 20 76 65 72 73 69 6f  add three versio
ba70: 6e 73 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  ns of the functi
ba80: 6f 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 68  on.  ** to the h
ba90: 61 73 68 20 74 61 62 6c 65 2e 0a 20 20 2a 2f 0a  ash table..  */.
baa0: 20 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54    if( enc==SQLIT
bab0: 45 5f 55 54 46 31 36 20 29 7b 0a 20 20 20 20 65  E_UTF16 ){.    e
bac0: 6e 63 20 3d 20 53 51 4c 49 54 45 5f 55 54 46 31  nc = SQLITE_UTF1
bad0: 36 4e 41 54 49 56 45 3b 0a 20 20 7d 65 6c 73 65  6NATIVE;.  }else
bae0: 20 69 66 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45   if( enc==SQLITE
baf0: 5f 41 4e 59 20 29 7b 0a 20 20 20 20 69 6e 74 20  _ANY ){.    int 
bb00: 72 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  rc;.    rc = sql
bb10: 69 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64  ite3CreateFunc(d
bb20: 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65  b, zFunctionName
bb30: 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55  , nArg, SQLITE_U
bb40: 54 46 38 7c 65 78 74 72 61 46 6c 61 67 73 2c 0a  TF8|extraFlags,.
bb50: 20 20 20 20 20 20 20 20 20 70 55 73 65 72 44 61           pUserDa
bb60: 74 61 2c 20 78 46 75 6e 63 2c 20 78 53 74 65 70  ta, xFunc, xStep
bb70: 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65 73 74 72  , xFinal, pDestr
bb80: 75 63 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  uctor);.    if( 
bb90: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
bba0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
bbb0: 74 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62  te3CreateFunc(db
bbc0: 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 2c  , zFunctionName,
bbd0: 20 6e 41 72 67 2c 20 53 51 4c 49 54 45 5f 55 54   nArg, SQLITE_UT
bbe0: 46 31 36 4c 45 7c 65 78 74 72 61 46 6c 61 67 73  F16LE|extraFlags
bbf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 70 55 73 65  ,.          pUse
bc00: 72 44 61 74 61 2c 20 78 46 75 6e 63 2c 20 78 53  rData, xFunc, xS
bc10: 74 65 70 2c 20 78 46 69 6e 61 6c 2c 20 70 44 65  tep, xFinal, pDe
bc20: 73 74 72 75 63 74 6f 72 29 3b 0a 20 20 20 20 7d  structor);.    }
bc30: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
bc40: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
bc50: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
bc60: 0a 20 20 20 20 65 6e 63 20 3d 20 53 51 4c 49 54  .    enc = SQLIT
bc70: 45 5f 55 54 46 31 36 42 45 3b 0a 20 20 7d 0a 23  E_UTF16BE;.  }.#
bc80: 65 6c 73 65 0a 20 20 65 6e 63 20 3d 20 53 51 4c  else.  enc = SQL
bc90: 49 54 45 5f 55 54 46 38 3b 0a 23 65 6e 64 69 66  ITE_UTF8;.#endif
bca0: 0a 20 20 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69  .  .  /* Check i
bcb0: 66 20 61 6e 20 65 78 69 73 74 69 6e 67 20 66 75  f an existing fu
bcc0: 6e 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  nction is being 
bcd0: 6f 76 65 72 72 69 64 64 65 6e 20 6f 72 20 64 65  overridden or de
bce0: 6c 65 74 65 64 2e 20 49 66 20 73 6f 2c 0a 20 20  leted. If so,.  
bcf0: 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72 65  ** and there are
bd00: 20 61 63 74 69 76 65 20 56 4d 73 2c 20 74 68 65   active VMs, the
bd10: 6e 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  n return SQLITE_
bd20: 42 55 53 59 2e 20 49 66 20 61 20 66 75 6e 63 74  BUSY. If a funct
bd30: 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ion.  ** is bein
bd40: 67 20 6f 76 65 72 72 69 64 64 65 6e 2f 64 65 6c  g overridden/del
bd50: 65 74 65 64 20 62 75 74 20 74 68 65 72 65 20 61  eted but there a
bd60: 72 65 20 6e 6f 20 61 63 74 69 76 65 20 56 4d 73  re no active VMs
bd70: 2c 20 61 6c 6c 6f 77 20 74 68 65 0a 20 20 2a 2a  , allow the.  **
bd80: 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f 20 63 6f   operation to co
bd90: 6e 74 69 6e 75 65 20 62 75 74 20 69 6e 76 61 6c  ntinue but inval
bda0: 69 64 61 74 65 20 61 6c 6c 20 70 72 65 63 6f 6d  idate all precom
bdb0: 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 73  piled statements
bdc0: 2e 0a 20 20 2a 2f 0a 20 20 70 20 3d 20 73 71 6c  ..  */.  p = sql
bdd0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
bde0: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
bdf0: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
be00: 20 28 75 38 29 65 6e 63 2c 20 30 29 3b 0a 20 20   (u8)enc, 0);.  
be10: 69 66 28 20 70 20 26 26 20 28 70 2d 3e 66 75 6e  if( p && (p->fun
be20: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
be30: 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29 3d 3d 65  FUNC_ENCMASK)==e
be40: 6e 63 20 26 26 20 70 2d 3e 6e 41 72 67 3d 3d 6e  nc && p->nArg==n
be50: 41 72 67 20 29 7b 0a 20 20 20 20 69 66 28 20 64  Arg ){.    if( d
be60: 62 2d 3e 6e 56 64 62 65 41 63 74 69 76 65 20 29  b->nVdbeActive )
be70: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
be80: 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
be90: 53 51 4c 49 54 45 5f 42 55 53 59 2c 20 0a 20 20  SQLITE_BUSY, .  
bea0: 20 20 20 20 20 20 22 75 6e 61 62 6c 65 20 74 6f        "unable to
beb0: 20 64 65 6c 65 74 65 2f 6d 6f 64 69 66 79 20 75   delete/modify u
bec0: 73 65 72 2d 66 75 6e 63 74 69 6f 6e 20 64 75 65  ser-function due
bed0: 20 74 6f 20 61 63 74 69 76 65 20 73 74 61 74 65   to active state
bee0: 6d 65 6e 74 73 22 29 3b 0a 20 20 20 20 20 20 61  ments");.      a
bef0: 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c  ssert( !db->mall
bf00: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
bf10: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
bf20: 42 55 53 59 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  BUSY;.    }else{
bf30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
bf40: 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61 74  pirePreparedStat
bf50: 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20 20  ements(db);.    
bf60: 7d 0a 20 20 7d 0a 0a 20 20 70 20 3d 20 73 71 6c  }.  }..  p = sql
bf70: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
bf80: 28 64 62 2c 20 7a 46 75 6e 63 74 69 6f 6e 4e 61  (db, zFunctionNa
bf90: 6d 65 2c 20 6e 4e 61 6d 65 2c 20 6e 41 72 67 2c  me, nName, nArg,
bfa0: 20 28 75 38 29 65 6e 63 2c 20 31 29 3b 0a 20 20   (u8)enc, 1);.  
bfb0: 61 73 73 65 72 74 28 70 20 7c 7c 20 64 62 2d 3e  assert(p || db->
bfc0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 3b 0a 20  mallocFailed);. 
bfd0: 20 69 66 28 20 21 70 20 29 7b 0a 20 20 20 20 72   if( !p ){.    r
bfe0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
bff0: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  EM;.  }..  /* If
c000: 20 61 6e 20 6f 6c 64 65 72 20 76 65 72 73 69 6f   an older versio
c010: 6e 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  n of the functio
c020: 6e 20 77 69 74 68 20 61 20 63 6f 6e 66 69 67 75  n with a configu
c030: 72 65 64 20 64 65 73 74 72 75 63 74 6f 72 20 69  red destructor i
c040: 73 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 70  s.  ** being rep
c050: 6c 61 63 65 64 20 69 6e 76 6f 6b 65 20 74 68 65  laced invoke the
c060: 20 64 65 73 74 72 75 63 74 6f 72 20 66 75 6e 63   destructor func
c070: 74 69 6f 6e 20 68 65 72 65 2e 20 2a 2f 0a 20 20  tion here. */.  
c080: 66 75 6e 63 74 69 6f 6e 44 65 73 74 72 6f 79 28  functionDestroy(
c090: 64 62 2c 20 70 29 3b 0a 0a 20 20 69 66 28 20 70  db, p);..  if( p
c0a0: 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
c0b0: 20 20 70 44 65 73 74 72 75 63 74 6f 72 2d 3e 6e    pDestructor->n
c0c0: 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e  Ref++;.  }.  p->
c0d0: 70 44 65 73 74 72 75 63 74 6f 72 20 3d 20 70 44  pDestructor = pD
c0e0: 65 73 74 72 75 63 74 6f 72 3b 0a 20 20 70 2d 3e  estructor;.  p->
c0f0: 66 75 6e 63 46 6c 61 67 73 20 3d 20 28 70 2d 3e  funcFlags = (p->
c100: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
c110: 54 45 5f 46 55 4e 43 5f 45 4e 43 4d 41 53 4b 29  TE_FUNC_ENCMASK)
c120: 20 7c 20 65 78 74 72 61 46 6c 61 67 73 3b 0a 20   | extraFlags;. 
c130: 20 74 65 73 74 63 61 73 65 28 20 70 2d 3e 66 75   testcase( p->fu
c140: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
c150: 5f 44 45 54 45 52 4d 49 4e 49 53 54 49 43 20 29  _DETERMINISTIC )
c160: 3b 0a 20 20 70 2d 3e 78 46 75 6e 63 20 3d 20 78  ;.  p->xFunc = x
c170: 46 75 6e 63 3b 0a 20 20 70 2d 3e 78 53 74 65 70  Func;.  p->xStep
c180: 20 3d 20 78 53 74 65 70 3b 0a 20 20 70 2d 3e 78   = xStep;.  p->x
c190: 46 69 6e 61 6c 69 7a 65 20 3d 20 78 46 69 6e 61  Finalize = xFina
c1a0: 6c 3b 0a 20 20 70 2d 3e 70 55 73 65 72 44 61 74  l;.  p->pUserDat
c1b0: 61 20 3d 20 70 55 73 65 72 44 61 74 61 3b 0a 20  a = pUserData;. 
c1c0: 20 70 2d 3e 6e 41 72 67 20 3d 20 28 75 31 36 29   p->nArg = (u16)
c1d0: 6e 41 72 67 3b 0a 20 20 72 65 74 75 72 6e 20 53  nArg;.  return S
c1e0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
c1f0: 2a 2a 20 43 72 65 61 74 65 20 6e 65 77 20 75 73  ** Create new us
c200: 65 72 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 2a 2f  er functions..*/
c210: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65  .int sqlite3_cre
c220: 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 0a 20 20  ate_function(.  
c230: 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 63  sqlite3 *db,.  c
c240: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 75 6e 63  onst char *zFunc
c250: 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 0a 20 20  ,.  int nArg,.  
c260: 69 6e 74 20 65 6e 63 2c 0a 20 20 76 6f 69 64 20  int enc,.  void 
c270: 2a 70 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 75  *p,.  void (*xFu
c280: 6e 63 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74  nc)(sqlite3_cont
c290: 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65 33  ext*,int,sqlite3
c2a0: 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20 76 6f  _value **),.  vo
c2b0: 69 64 20 28 2a 78 53 74 65 70 29 28 73 71 6c 69  id (*xStep)(sqli
c2c0: 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69 6e 74  te3_context*,int
c2d0: 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a  ,sqlite3_value *
c2e0: 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 69  *),.  void (*xFi
c2f0: 6e 61 6c 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  nal)(sqlite3_con
c300: 74 65 78 74 2a 29 0a 29 7b 0a 20 20 72 65 74 75  text*).){.  retu
c310: 72 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  rn sqlite3_creat
c320: 65 5f 66 75 6e 63 74 69 6f 6e 5f 76 32 28 64 62  e_function_v2(db
c330: 2c 20 7a 46 75 6e 63 2c 20 6e 41 72 67 2c 20 65  , zFunc, nArg, e
c340: 6e 63 2c 20 70 2c 20 78 46 75 6e 63 2c 20 78 53  nc, p, xFunc, xS
c350: 74 65 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tep,.           
c360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c370: 20 20 20 20 20 20 20 20 20 78 46 69 6e 61 6c 2c           xFinal,
c380: 20 30 29 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69   0);.}..int sqli
c390: 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
c3a0: 69 6f 6e 5f 76 32 28 0a 20 20 73 71 6c 69 74 65  ion_v2(.  sqlite
c3b0: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
c3c0: 68 61 72 20 2a 7a 46 75 6e 63 2c 0a 20 20 69 6e  har *zFunc,.  in
c3d0: 74 20 6e 41 72 67 2c 0a 20 20 69 6e 74 20 65 6e  t nArg,.  int en
c3e0: 63 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  c,.  void *p,.  
c3f0: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
c400: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
c410: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
c420: 20 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78   **),.  void (*x
c430: 53 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f  Step)(sqlite3_co
c440: 6e 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74  ntext*,int,sqlit
c450: 65 33 5f 76 61 6c 75 65 20 2a 2a 29 2c 0a 20 20  e3_value **),.  
c460: 76 6f 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73  void (*xFinal)(s
c470: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29  qlite3_context*)
c480: 2c 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74  ,.  void (*xDest
c490: 72 6f 79 29 28 76 6f 69 64 20 2a 29 0a 29 7b 0a  roy)(void *).){.
c4a0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
c4b0: 45 5f 45 52 52 4f 52 3b 0a 20 20 46 75 6e 63 44  E_ERROR;.  FuncD
c4c0: 65 73 74 72 75 63 74 6f 72 20 2a 70 41 72 67 20  estructor *pArg 
c4d0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  = 0;.  sqlite3_m
c4e0: 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d  utex_enter(db->m
c4f0: 75 74 65 78 29 3b 0a 20 20 69 66 28 20 78 44 65  utex);.  if( xDe
c500: 73 74 72 6f 79 20 29 7b 0a 20 20 20 20 70 41 72  stroy ){.    pAr
c510: 67 20 3d 20 28 46 75 6e 63 44 65 73 74 72 75 63  g = (FuncDestruc
c520: 74 6f 72 20 2a 29 73 71 6c 69 74 65 33 44 62 4d  tor *)sqlite3DbM
c530: 61 6c 6c 6f 63 5a 65 72 6f 28 64 62 2c 20 73 69  allocZero(db, si
c540: 7a 65 6f 66 28 46 75 6e 63 44 65 73 74 72 75 63  zeof(FuncDestruc
c550: 74 6f 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  tor));.    if( !
c560: 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 78 44  pArg ){.      xD
c570: 65 73 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 20  estroy(p);.     
c580: 20 67 6f 74 6f 20 6f 75 74 3b 0a 20 20 20 20 7d   goto out;.    }
c590: 0a 20 20 20 20 70 41 72 67 2d 3e 78 44 65 73 74  .    pArg->xDest
c5a0: 72 6f 79 20 3d 20 78 44 65 73 74 72 6f 79 3b 0a  roy = xDestroy;.
c5b0: 20 20 20 20 70 41 72 67 2d 3e 70 55 73 65 72 44      pArg->pUserD
c5c0: 61 74 61 20 3d 20 70 3b 0a 20 20 7d 0a 20 20 72  ata = p;.  }.  r
c5d0: 63 20 3d 20 73 71 6c 69 74 65 33 43 72 65 61 74  c = sqlite3Creat
c5e0: 65 46 75 6e 63 28 64 62 2c 20 7a 46 75 6e 63 2c  eFunc(db, zFunc,
c5f0: 20 6e 41 72 67 2c 20 65 6e 63 2c 20 70 2c 20 78   nArg, enc, p, x
c600: 46 75 6e 63 2c 20 78 53 74 65 70 2c 20 78 46 69  Func, xStep, xFi
c610: 6e 61 6c 2c 20 70 41 72 67 29 3b 0a 20 20 69 66  nal, pArg);.  if
c620: 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e  ( pArg && pArg->
c630: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 61  nRef==0 ){.    a
c640: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
c650: 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 78 44 65 73  E_OK );.    xDes
c660: 74 72 6f 79 28 70 29 3b 0a 20 20 20 20 73 71 6c  troy(p);.    sql
c670: 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70  ite3DbFree(db, p
c680: 41 72 67 29 3b 0a 20 20 7d 0a 0a 20 6f 75 74 3a  Arg);.  }.. out:
c690: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 41  .  rc = sqlite3A
c6a0: 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b 0a  piExit(db, rc);.
c6b0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
c6c0: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
c6d0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
c6e0: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
c6f0: 5f 4f 4d 49 54 5f 55 54 46 31 36 0a 69 6e 74 20  _OMIT_UTF16.int 
c700: 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
c710: 75 6e 63 74 69 6f 6e 31 36 28 0a 20 20 73 71 6c  unction16(.  sql
c720: 69 74 65 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73  ite3 *db,.  cons
c730: 74 20 76 6f 69 64 20 2a 7a 46 75 6e 63 74 69 6f  t void *zFunctio
c740: 6e 4e 61 6d 65 2c 0a 20 20 69 6e 74 20 6e 41 72  nName,.  int nAr
c750: 67 2c 0a 20 20 69 6e 74 20 65 54 65 78 74 52 65  g,.  int eTextRe
c760: 70 2c 0a 20 20 76 6f 69 64 20 2a 70 2c 0a 20 20  p,.  void *p,.  
c770: 76 6f 69 64 20 28 2a 78 46 75 6e 63 29 28 73 71  void (*xFunc)(sq
c780: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 2c 69  lite3_context*,i
c790: 6e 74 2c 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  nt,sqlite3_value
c7a0: 2a 2a 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 53  **),.  void (*xS
c7b0: 74 65 70 29 28 73 71 6c 69 74 65 33 5f 63 6f 6e  tep)(sqlite3_con
c7c0: 74 65 78 74 2a 2c 69 6e 74 2c 73 71 6c 69 74 65  text*,int,sqlite
c7d0: 33 5f 76 61 6c 75 65 2a 2a 29 2c 0a 20 20 76 6f  3_value**),.  vo
c7e0: 69 64 20 28 2a 78 46 69 6e 61 6c 29 28 73 71 6c  id (*xFinal)(sql
c7f0: 69 74 65 33 5f 63 6f 6e 74 65 78 74 2a 29 0a 29  ite3_context*).)
c800: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
c810: 61 72 20 2a 7a 46 75 6e 63 38 3b 0a 20 20 73 71  ar *zFunc8;.  sq
c820: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
c830: 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
c840: 61 73 73 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c  assert( !db->mal
c850: 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 7a  locFailed );.  z
c860: 46 75 6e 63 38 20 3d 20 73 71 6c 69 74 65 33 55  Func8 = sqlite3U
c870: 74 66 31 36 74 6f 38 28 64 62 2c 20 7a 46 75 6e  tf16to8(db, zFun
c880: 63 74 69 6f 6e 4e 61 6d 65 2c 20 2d 31 2c 20 53  ctionName, -1, S
c890: 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56  QLITE_UTF16NATIV
c8a0: 45 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  E);.  rc = sqlit
c8b0: 65 33 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c  e3CreateFunc(db,
c8c0: 20 7a 46 75 6e 63 38 2c 20 6e 41 72 67 2c 20 65   zFunc8, nArg, e
c8d0: 54 65 78 74 52 65 70 2c 20 70 2c 20 78 46 75 6e  TextRep, p, xFun
c8e0: 63 2c 20 78 53 74 65 70 2c 20 78 46 69 6e 61 6c  c, xStep, xFinal
c8f0: 2c 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  ,0);.  sqlite3Db
c900: 46 72 65 65 28 64 62 2c 20 7a 46 75 6e 63 38 29  Free(db, zFunc8)
c910: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
c920: 41 70 69 45 78 69 74 28 64 62 2c 20 72 63 29 3b  ApiExit(db, rc);
c930: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
c940: 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
c950: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
c960: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
c970: 20 44 65 63 6c 61 72 65 20 74 68 61 74 20 61 20   Declare that a 
c980: 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 62 65 65  function has bee
c990: 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20 62 79 20  n overloaded by 
c9a0: 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2e  a virtual table.
c9b0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  .**.** If the fu
c9c0: 6e 63 74 69 6f 6e 20 61 6c 72 65 61 64 79 20 65  nction already e
c9d0: 78 69 73 74 73 20 61 73 20 61 20 72 65 67 75 6c  xists as a regul
c9e0: 61 72 20 67 6c 6f 62 61 6c 20 66 75 6e 63 74 69  ar global functi
c9f0: 6f 6e 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 69 73  on, then.** this
ca00: 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 6e 6f   routine is a no
ca10: 2d 6f 70 2e 20 20 49 66 20 74 68 65 20 66 75 6e  -op.  If the fun
ca20: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
ca30: 78 69 73 74 2c 20 74 68 65 6e 20 63 72 65 61 74  xist, then creat
ca40: 65 0a 2a 2a 20 61 20 6e 65 77 20 6f 6e 65 20 74  e.** a new one t
ca50: 68 61 74 20 61 6c 77 61 79 73 20 74 68 72 6f 77  hat always throw
ca60: 73 20 61 20 72 75 6e 2d 74 69 6d 65 20 65 72 72  s a run-time err
ca70: 6f 72 2e 20 20 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  or.  .**.** When
ca80: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 73 20   virtual tables 
ca90: 69 6e 74 65 6e 64 20 74 6f 20 70 72 6f 76 69 64  intend to provid
caa0: 65 20 61 6e 20 6f 76 65 72 6c 6f 61 64 65 64 20  e an overloaded 
cab0: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 79 0a 2a  function, they.*
cac0: 2a 20 73 68 6f 75 6c 64 20 63 61 6c 6c 20 74 68  * should call th
cad0: 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 6d 61  is routine to ma
cae0: 6b 65 20 73 75 72 65 20 74 68 65 20 67 6c 6f 62  ke sure the glob
caf0: 61 6c 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  al function exis
cb00: 74 73 2e 0a 2a 2a 20 41 20 67 6c 6f 62 61 6c 20  ts..** A global 
cb10: 66 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 65 78  function must ex
cb20: 69 73 74 20 69 6e 20 6f 72 64 65 72 20 66 6f 72  ist in order for
cb30: 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e   name resolution
cb40: 20 74 6f 20 77 6f 72 6b 0a 2a 2a 20 70 72 6f 70   to work.** prop
cb50: 65 72 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  erly..*/.int sql
cb60: 69 74 65 33 5f 6f 76 65 72 6c 6f 61 64 5f 66 75  ite3_overload_fu
cb70: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
cb80: 33 20 2a 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63  3 *db,.  const c
cb90: 68 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 69 6e  har *zName,.  in
cba0: 74 20 6e 41 72 67 0a 29 7b 0a 20 20 69 6e 74 20  t nArg.){.  int 
cbb0: 6e 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  nName = sqlite3S
cbc0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
cbd0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
cbe0: 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 5f  E_OK;.  sqlite3_
cbf0: 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e  mutex_enter(db->
cc00: 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 73 71  mutex);.  if( sq
cc10: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
cc20: 6e 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  n(db, zName, nNa
cc30: 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49 54 45  me, nArg, SQLITE
cc40: 5f 55 54 46 38 2c 20 30 29 3d 3d 30 20 29 7b 0a  _UTF8, 0)==0 ){.
cc50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cc60: 43 72 65 61 74 65 46 75 6e 63 28 64 62 2c 20 7a  CreateFunc(db, z
cc70: 4e 61 6d 65 2c 20 6e 41 72 67 2c 20 53 51 4c 49  Name, nArg, SQLI
cc80: 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 20  TE_UTF8,.       
cc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cca0: 20 20 20 20 30 2c 20 73 71 6c 69 74 65 33 49 6e      0, sqlite3In
ccb0: 76 61 6c 69 64 46 75 6e 63 74 69 6f 6e 2c 20 30  validFunction, 0
ccc0: 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72  , 0, 0);.  }.  r
ccd0: 63 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78  c = sqlite3ApiEx
cce0: 69 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71  it(db, rc);.  sq
ccf0: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
cd00: 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
cd10: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
cd20: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
cd30: 54 5f 54 52 41 43 45 0a 2f 2a 0a 2a 2a 20 52 65  T_TRACE./*.** Re
cd40: 67 69 73 74 65 72 20 61 20 74 72 61 63 65 20 66  gister a trace f
cd50: 75 6e 63 74 69 6f 6e 2e 20 20 54 68 65 20 70 41  unction.  The pA
cd60: 72 67 20 66 72 6f 6d 20 74 68 65 20 70 72 65 76  rg from the prev
cd70: 69 6f 75 73 6c 79 20 72 65 67 69 73 74 65 72 65  iously registere
cd80: 64 20 74 72 61 63 65 0a 2a 2a 20 69 73 20 72 65  d trace.** is re
cd90: 74 75 72 6e 65 64 2e 20 20 0a 2a 2a 0a 2a 2a 20  turned.  .**.** 
cda0: 41 20 4e 55 4c 4c 20 74 72 61 63 65 20 66 75 6e  A NULL trace fun
cdb0: 63 74 69 6f 6e 20 6d 65 61 6e 73 20 74 68 61 74  ction means that
cdc0: 20 6e 6f 20 74 72 61 63 69 6e 67 20 69 73 20 65   no tracing is e
cdd0: 78 65 63 75 74 65 73 2e 20 20 41 20 6e 6f 6e 2d  xecutes.  A non-
cde0: 4e 55 4c 4c 0a 2a 2a 20 74 72 61 63 65 20 69 73  NULL.** trace is
cdf0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
ce00: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 69 73  function that is
ce10: 20 69 6e 76 6f 6b 65 64 20 61 74 20 74 68 65 20   invoked at the 
ce20: 73 74 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a  start of each.**
ce30: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 0a   SQL statement..
ce40: 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
ce50: 5f 74 72 61 63 65 28 73 71 6c 69 74 65 33 20 2a  _trace(sqlite3 *
ce60: 64 62 2c 20 76 6f 69 64 20 28 2a 78 54 72 61 63  db, void (*xTrac
ce70: 65 29 28 76 6f 69 64 2a 2c 63 6f 6e 73 74 20 63  e)(void*,const c
ce80: 68 61 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72  har*), void *pAr
ce90: 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f 6c 64  g){.  void *pOld
cea0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ;.  sqlite3_mute
ceb0: 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
cec0: 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64 62 2d  x);.  pOld = db-
ced0: 3e 70 54 72 61 63 65 41 72 67 3b 0a 20 20 64 62  >pTraceArg;.  db
cee0: 2d 3e 78 54 72 61 63 65 20 3d 20 78 54 72 61 63  ->xTrace = xTrac
cef0: 65 3b 0a 20 20 64 62 2d 3e 70 54 72 61 63 65 41  e;.  db->pTraceA
cf00: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
cf10: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
cf20: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
cf30: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 2f 2a  eturn pOld;.}./*
cf40: 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20 70  .** Register a p
cf50: 72 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 2e  rofile function.
cf60: 20 20 54 68 65 20 70 41 72 67 20 66 72 6f 6d 20    The pArg from 
cf70: 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 72  the previously r
cf80: 65 67 69 73 74 65 72 65 64 20 0a 2a 2a 20 70 72  egistered .** pr
cf90: 6f 66 69 6c 65 20 66 75 6e 63 74 69 6f 6e 20 69  ofile function i
cfa0: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 0a 2a 2a  s returned.  .**
cfb0: 0a 2a 2a 20 41 20 4e 55 4c 4c 20 70 72 6f 66 69  .** A NULL profi
cfc0: 6c 65 20 66 75 6e 63 74 69 6f 6e 20 6d 65 61 6e  le function mean
cfd0: 73 20 74 68 61 74 20 6e 6f 20 70 72 6f 66 69 6c  s that no profil
cfe0: 69 6e 67 20 69 73 20 65 78 65 63 75 74 65 73 2e  ing is executes.
cff0: 20 20 41 20 6e 6f 6e 2d 4e 55 4c 4c 0a 2a 2a 20    A non-NULL.** 
d000: 70 72 6f 66 69 6c 65 20 69 73 20 61 20 70 6f 69  profile is a poi
d010: 6e 74 65 72 20 74 6f 20 61 20 66 75 6e 63 74 69  nter to a functi
d020: 6f 6e 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6b  on that is invok
d030: 65 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  ed at the conclu
d040: 73 69 6f 6e 20 6f 66 0a 2a 2a 20 65 61 63 68 20  sion of.** each 
d050: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68  SQL statement th
d060: 61 74 20 69 73 20 72 75 6e 2e 0a 2a 2f 0a 76 6f  at is run..*/.vo
d070: 69 64 20 2a 73 71 6c 69 74 65 33 5f 70 72 6f 66  id *sqlite3_prof
d080: 69 6c 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ile(.  sqlite3 *
d090: 64 62 2c 0a 20 20 76 6f 69 64 20 28 2a 78 50 72  db,.  void (*xPr
d0a0: 6f 66 69 6c 65 29 28 76 6f 69 64 2a 2c 63 6f 6e  ofile)(void*,con
d0b0: 73 74 20 63 68 61 72 2a 2c 73 71 6c 69 74 65 5f  st char*,sqlite_
d0c0: 75 69 6e 74 36 34 29 2c 0a 20 20 76 6f 69 64 20  uint64),.  void 
d0d0: 2a 70 41 72 67 0a 29 7b 0a 20 20 76 6f 69 64 20  *pArg.){.  void 
d0e0: 2a 70 4f 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33  *pOld;.  sqlite3
d0f0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
d100: 3e 6d 75 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20  >mutex);.  pOld 
d110: 3d 20 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72  = db->pProfileAr
d120: 67 3b 0a 20 20 64 62 2d 3e 78 50 72 6f 66 69 6c  g;.  db->xProfil
d130: 65 20 3d 20 78 50 72 6f 66 69 6c 65 3b 0a 20 20  e = xProfile;.  
d140: 64 62 2d 3e 70 50 72 6f 66 69 6c 65 41 72 67 20  db->pProfileArg 
d150: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
d160: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d170: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
d180: 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 23 65 6e 64 69  rn pOld;.}.#endi
d190: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
d1a0: 5f 54 52 41 43 45 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  _TRACE */../*.**
d1b0: 20 52 65 67 69 73 74 65 72 20 61 20 66 75 6e 63   Register a func
d1c0: 74 69 6f 6e 20 74 6f 20 62 65 20 69 6e 76 6f 6b  tion to be invok
d1d0: 65 64 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61  ed when a transa
d1e0: 63 74 69 6f 6e 20 63 6f 6d 6d 69 74 73 2e 0a 2a  ction commits..*
d1f0: 2a 20 49 66 20 74 68 65 20 69 6e 76 6f 6b 65 64  * If the invoked
d200: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
d210: 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
d220: 20 74 68 65 20 63 6f 6d 6d 69 74 20 62 65 63 6f   the commit beco
d230: 6d 65 73 20 61 0a 2a 2a 20 72 6f 6c 6c 62 61 63  mes a.** rollbac
d240: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  k..*/.void *sqli
d250: 74 65 33 5f 63 6f 6d 6d 69 74 5f 68 6f 6f 6b 28  te3_commit_hook(
d260: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d280: 41 74 74 61 63 68 20 74 68 65 20 68 6f 6f 6b 20  Attach the hook 
d290: 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
d2a0: 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
d2b0: 6c 62 61 63 6b 29 28 76 6f 69 64 2a 29 2c 20 20  lback)(void*),  
d2c0: 2f 2a 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 69  /* Function to i
d2d0: 6e 76 6f 6b 65 20 6f 6e 20 65 61 63 68 20 63 6f  nvoke on each co
d2e0: 6d 6d 69 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  mmit */.  void *
d2f0: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
d300: 20 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20      /* Argument 
d310: 74 6f 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  to the function 
d320: 2a 2f 0a 29 7b 0a 20 20 76 6f 69 64 20 2a 70 4f  */.){.  void *pO
d330: 6c 64 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  ld;.  sqlite3_mu
d340: 74 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75  tex_enter(db->mu
d350: 74 65 78 29 3b 0a 20 20 70 4f 6c 64 20 3d 20 64  tex);.  pOld = d
d360: 62 2d 3e 70 43 6f 6d 6d 69 74 41 72 67 3b 0a 20  b->pCommitArg;. 
d370: 20 64 62 2d 3e 78 43 6f 6d 6d 69 74 43 61 6c 6c   db->xCommitCall
d380: 62 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b  back = xCallback
d390: 3b 0a 20 20 64 62 2d 3e 70 43 6f 6d 6d 69 74 41  ;.  db->pCommitA
d3a0: 72 67 20 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c  rg = pArg;.  sql
d3b0: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
d3c0: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
d3d0: 65 74 75 72 6e 20 70 4f 6c 64 3b 0a 7d 0a 0a 2f  eturn pOld;.}../
d3e0: 2a 0a 2a 2a 20 52 65 67 69 73 74 65 72 20 61 20  *.** Register a 
d3f0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 62 65 20 69  callback to be i
d400: 6e 76 6f 6b 65 64 20 65 61 63 68 20 74 69 6d 65  nvoked each time
d410: 20 61 20 72 6f 77 20 69 73 20 75 70 64 61 74 65   a row is update
d420: 64 2c 0a 2a 2a 20 69 6e 73 65 72 74 65 64 20 6f  d,.** inserted o
d430: 72 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67 20  r deleted using 
d440: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 63 6f  this database co
d450: 6e 6e 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  nnection..*/.voi
d460: 64 20 2a 73 71 6c 69 74 65 33 5f 75 70 64 61 74  d *sqlite3_updat
d470: 65 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  e_hook(.  sqlite
d480: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
d490: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
d4a0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
d4b0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
d4c0: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
d4d0: 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72 20 63 6f  oid*,int,char co
d4e0: 6e 73 74 20 2a 2c 63 68 61 72 20 63 6f 6e 73 74  nst *,char const
d4f0: 20 2a 2c 73 71 6c 69 74 65 5f 69 6e 74 36 34 29   *,sqlite_int64)
d500: 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20 20  ,.  void *pArg  
d510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d520: 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 65   Argument to the
d530: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
d540: 20 20 76 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20    void *pRet;.  
d550: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
d560: 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a  ter(db->mutex);.
d570: 20 20 70 52 65 74 20 3d 20 64 62 2d 3e 70 55 70    pRet = db->pUp
d580: 64 61 74 65 41 72 67 3b 0a 20 20 64 62 2d 3e 78  dateArg;.  db->x
d590: 55 70 64 61 74 65 43 61 6c 6c 62 61 63 6b 20 3d  UpdateCallback =
d5a0: 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64 62   xCallback;.  db
d5b0: 2d 3e 70 55 70 64 61 74 65 41 72 67 20 3d 20 70  ->pUpdateArg = p
d5c0: 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  Arg;.  sqlite3_m
d5d0: 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
d5e0: 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
d5f0: 70 52 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pRet;.}../*.** R
d600: 65 67 69 73 74 65 72 20 61 20 63 61 6c 6c 62 61  egister a callba
d610: 63 6b 20 74 6f 20 62 65 20 69 6e 76 6f 6b 65 64  ck to be invoked
d620: 20 65 61 63 68 20 74 69 6d 65 20 61 20 74 72 61   each time a tra
d630: 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c  nsaction is roll
d640: 65 64 0a 2a 2a 20 62 61 63 6b 20 62 79 20 74 68  ed.** back by th
d650: 69 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  is database conn
d660: 65 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  ection..*/.void 
d670: 2a 73 71 6c 69 74 65 33 5f 72 6f 6c 6c 62 61 63  *sqlite3_rollbac
d680: 6b 5f 68 6f 6f 6b 28 0a 20 20 73 71 6c 69 74 65  k_hook(.  sqlite
d690: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
d6a0: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
d6b0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
d6c0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 76 6f 69  atabase */.  voi
d6d0: 64 20 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76  d (*xCallback)(v
d6e0: 6f 69 64 2a 29 2c 20 2f 2a 20 43 61 6c 6c 62 61  oid*), /* Callba
d6f0: 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  ck function */. 
d700: 20 76 6f 69 64 20 2a 70 41 72 67 20 20 20 20 20   void *pArg     
d710: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
d720: 67 75 6d 65 6e 74 20 74 6f 20 74 68 65 20 66 75  gument to the fu
d730: 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20 20 76  nction */.){.  v
d740: 6f 69 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c  oid *pRet;.  sql
d750: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
d760: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70  (db->mutex);.  p
d770: 52 65 74 20 3d 20 64 62 2d 3e 70 52 6f 6c 6c 62  Ret = db->pRollb
d780: 61 63 6b 41 72 67 3b 0a 20 20 64 62 2d 3e 78 52  ackArg;.  db->xR
d790: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 62 61 63 6b 20  ollbackCallback 
d7a0: 3d 20 78 43 61 6c 6c 62 61 63 6b 3b 0a 20 20 64  = xCallback;.  d
d7b0: 62 2d 3e 70 52 6f 6c 6c 62 61 63 6b 41 72 67 20  b->pRollbackArg 
d7c0: 3d 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65  = pArg;.  sqlite
d7d0: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62  3_mutex_leave(db
d7e0: 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75  ->mutex);.  retu
d7f0: 72 6e 20 70 52 65 74 3b 0a 7d 0a 0a 23 69 66 6e  rn pRet;.}..#ifn
d800: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d810: 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 71  WAL./*.** The sq
d820: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
d830: 20 63 61 6c 6c 62 61 63 6b 20 72 65 67 69 73 74   callback regist
d840: 65 72 65 64 20 62 79 20 73 71 6c 69 74 65 33 5f  ered by sqlite3_
d850: 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f 69  wal_autocheckpoi
d860: 6e 74 28 29 2e 0a 2a 2a 20 49 6e 76 6f 6b 65 20  nt()..** Invoke 
d870: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63 68 65 63  sqlite3_wal_chec
d880: 6b 70 6f 69 6e 74 20 69 66 20 74 68 65 20 6e 75  kpoint if the nu
d890: 6d 62 65 72 20 6f 66 20 66 72 61 6d 65 73 20 69  mber of frames i
d8a0: 6e 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 0a 2a  n the log file.*
d8b0: 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
d8c0: 6e 20 73 71 6c 69 74 65 33 2e 70 57 61 6c 41 72  n sqlite3.pWalAr
d8d0: 67 20 63 61 73 74 20 74 6f 20 61 6e 20 69 6e 74  g cast to an int
d8e0: 65 67 65 72 20 28 74 68 65 20 76 61 6c 75 65 20  eger (the value 
d8f0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 0a 2a 2a  configured by.**
d900: 20 77 61 6c 5f 61 75 74 6f 63 68 65 63 6b 70 6f   wal_autocheckpo
d910: 69 6e 74 28 29 29 2e 0a 2a 2f 20 0a 69 6e 74 20  int())..*/ .int 
d920: 73 71 6c 69 74 65 33 57 61 6c 44 65 66 61 75 6c  sqlite3WalDefaul
d930: 74 48 6f 6f 6b 28 0a 20 20 76 6f 69 64 20 2a 70  tHook(.  void *p
d940: 43 6c 69 65 6e 74 44 61 74 61 2c 20 20 20 20 20  ClientData,     
d950: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 2a 2f 0a 20  /* Argument */. 
d960: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
d970: 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65          /* Conne
d980: 63 74 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74  ction */.  const
d990: 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
d9a0: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 2a 2f    /* Database */
d9b0: 0a 20 20 69 6e 74 20 6e 46 72 61 6d 65 20 20 20  .  int nFrame   
d9c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
d9d0: 65 20 6f 66 20 57 41 4c 20 2a 2f 0a 29 7b 0a 20  e of WAL */.){. 
d9e0: 20 69 66 28 20 6e 46 72 61 6d 65 3e 3d 53 51 4c   if( nFrame>=SQL
d9f0: 49 54 45 5f 50 54 52 5f 54 4f 5f 49 4e 54 28 70  ITE_PTR_TO_INT(p
da00: 43 6c 69 65 6e 74 44 61 74 61 29 20 29 7b 0a 20  ClientData) ){. 
da10: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
da20: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
da30: 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 63     sqlite3_wal_c
da40: 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20 7a 44  heckpoint(db, zD
da50: 62 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  b);.    sqlite3E
da60: 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29  ndBenignMalloc()
da70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
da80: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
da90: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
daa0: 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  T_WAL */../*.** 
dab0: 43 6f 6e 66 69 67 75 72 65 20 61 6e 20 73 71 6c  Configure an sql
dac0: 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29 20  ite3_wal_hook() 
dad0: 63 61 6c 6c 62 61 63 6b 20 74 6f 20 61 75 74 6f  callback to auto
dae0: 6d 61 74 69 63 61 6c 6c 79 20 63 68 65 63 6b 70  matically checkp
daf0: 6f 69 6e 74 0a 2a 2a 20 61 20 64 61 74 61 62 61  oint.** a databa
db00: 73 65 20 61 66 74 65 72 20 63 6f 6d 6d 69 74 74  se after committ
db10: 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f  ing a transactio
db20: 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  n if there are n
db30: 46 72 61 6d 65 20 6f 72 0a 2a 2a 20 6d 6f 72 65  Frame or.** more
db40: 20 66 72 61 6d 65 73 20 69 6e 20 74 68 65 20 6c   frames in the l
db50: 6f 67 20 66 69 6c 65 2e 20 50 61 73 73 69 6e 67  og file. Passing
db60: 20 7a 65 72 6f 20 6f 72 20 61 20 6e 65 67 61 74   zero or a negat
db70: 69 76 65 20 76 61 6c 75 65 20 61 73 20 74 68 65  ive value as the
db80: 0a 2a 2a 20 6e 46 72 61 6d 65 20 70 61 72 61 6d  .** nFrame param
db90: 65 74 65 72 20 64 69 73 61 62 6c 65 73 20 61 75  eter disables au
dba0: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
dbb0: 6e 74 73 20 65 6e 74 69 72 65 6c 79 2e 0a 2a 2a  nts entirely..**
dbc0: 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  .** The callback
dbd0: 20 72 65 67 69 73 74 65 72 65 64 20 62 79 20 74   registered by t
dbe0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 70  his function rep
dbf0: 6c 61 63 65 73 20 61 6e 79 20 65 78 69 73 74 69  laces any existi
dc00: 6e 67 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20 72  ng callback.** r
dc10: 65 67 69 73 74 65 72 65 64 20 75 73 69 6e 67 20  egistered using 
dc20: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
dc30: 28 29 2e 20 4c 69 6b 65 77 69 73 65 2c 20 72 65  (). Likewise, re
dc40: 67 69 73 74 65 72 69 6e 67 20 61 20 63 61 6c 6c  gistering a call
dc50: 62 61 63 6b 0a 2a 2a 20 75 73 69 6e 67 20 73 71  back.** using sq
dc60: 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b 28 29  lite3_wal_hook()
dc70: 20 64 69 73 61 62 6c 65 73 20 74 68 65 20 61 75   disables the au
dc80: 74 6f 6d 61 74 69 63 20 63 68 65 63 6b 70 6f 69  tomatic checkpoi
dc90: 6e 74 20 6d 65 63 68 61 6e 69 73 6d 0a 2a 2a 20  nt mechanism.** 
dca0: 63 6f 6e 66 69 67 75 72 65 64 20 62 79 20 74 68  configured by th
dcb0: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
dcc0: 69 6e 74 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f  int sqlite3_wal_
dcd0: 61 75 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 73  autocheckpoint(s
dce0: 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e 74 20  qlite3 *db, int 
dcf0: 6e 46 72 61 6d 65 29 7b 0a 23 69 66 64 65 66 20  nFrame){.#ifdef 
dd00: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a  SQLITE_OMIT_WAL.
dd10: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
dd20: 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53 45 44  ER(db);.  UNUSED
dd30: 5f 50 41 52 41 4d 45 54 45 52 28 6e 46 72 61 6d  _PARAMETER(nFram
dd40: 65 29 3b 0a 23 65 6c 73 65 0a 20 20 69 66 28 20  e);.#else.  if( 
dd50: 6e 46 72 61 6d 65 3e 30 20 29 7b 0a 20 20 20 20  nFrame>0 ){.    
dd60: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
dd70: 28 64 62 2c 20 73 71 6c 69 74 65 33 57 61 6c 44  (db, sqlite3WalD
dd80: 65 66 61 75 6c 74 48 6f 6f 6b 2c 20 53 51 4c 49  efaultHook, SQLI
dd90: 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28 6e 46  TE_INT_TO_PTR(nF
dda0: 72 61 6d 65 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  rame));.  }else{
ddb0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 77 61 6c  .    sqlite3_wal
ddc0: 5f 68 6f 6f 6b 28 64 62 2c 20 30 2c 20 30 29 3b  _hook(db, 0, 0);
ddd0: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65  .  }.#endif.  re
dde0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ddf0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74 65  }../*.** Registe
de00: 72 20 61 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20  r a callback to 
de10: 62 65 20 69 6e 76 6f 6b 65 64 20 65 61 63 68 20  be invoked each 
de20: 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63 74 69  time a transacti
de30: 6f 6e 20 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a  on is written.**
de40: 20 69 6e 74 6f 20 74 68 65 20 77 72 69 74 65 2d   into the write-
de50: 61 68 65 61 64 2d 6c 6f 67 20 62 79 20 74 68 69  ahead-log by thi
de60: 73 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  s database conne
de70: 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  ction..*/.void *
de80: 73 71 6c 69 74 65 33 5f 77 61 6c 5f 68 6f 6f 6b  sqlite3_wal_hook
de90: 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
deb0: 20 20 20 20 2f 2a 20 41 74 74 61 63 68 20 74 68      /* Attach th
dec0: 65 20 68 6f 6f 6b 20 74 6f 20 74 68 69 73 20 64  e hook to this d
ded0: 62 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 69 6e  b handle */.  in
dee0: 74 28 2a 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f  t(*xCallback)(vo
def0: 69 64 20 2a 2c 20 73 71 6c 69 74 65 33 2a 2c 20  id *, sqlite3*, 
df00: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 69 6e 74  const char*, int
df10: 29 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 20  ),.  void *pArg 
df20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df30: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
df40: 67 75 6d 65 6e 74 20 70 61 73 73 65 64 20 74 6f  gument passed to
df50: 20 78 43 61 6c 6c 62 61 63 6b 28 29 20 2a 2f 0a   xCallback() */.
df60: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
df70: 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 76 6f 69  E_OMIT_WAL.  voi
df80: 64 20 2a 70 52 65 74 3b 0a 20 20 73 71 6c 69 74  d *pRet;.  sqlit
df90: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
dfa0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 70 52 65  b->mutex);.  pRe
dfb0: 74 20 3d 20 64 62 2d 3e 70 57 61 6c 41 72 67 3b  t = db->pWalArg;
dfc0: 0a 20 20 64 62 2d 3e 78 57 61 6c 43 61 6c 6c 62  .  db->xWalCallb
dfd0: 61 63 6b 20 3d 20 78 43 61 6c 6c 62 61 63 6b 3b  ack = xCallback;
dfe0: 0a 20 20 64 62 2d 3e 70 57 61 6c 41 72 67 20 3d  .  db->pWalArg =
dff0: 20 70 41 72 67 3b 0a 20 20 73 71 6c 69 74 65 33   pArg;.  sqlite3
e000: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d  _mutex_leave(db-
e010: 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72  >mutex);.  retur
e020: 6e 20 70 52 65 74 3b 0a 23 65 6c 73 65 0a 20 20  n pRet;.#else.  
e030: 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69 66  return 0;.#endif
e040: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70  .}../*.** Checkp
e050: 6f 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44  oint database zD
e060: 62 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  b..*/.int sqlite
e070: 33 5f 77 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74  3_wal_checkpoint
e080: 5f 76 32 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  _v2(.  sqlite3 *
e090: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
e0a0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
e0b0: 73 65 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 63  se handle */.  c
e0c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
e0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
e0e0: 2a 20 4e 61 6d 65 20 6f 66 20 61 74 74 61 63 68  * Name of attach
e0f0: 65 64 20 64 61 74 61 62 61 73 65 20 28 6f 72 20  ed database (or 
e100: 4e 55 4c 4c 29 20 2a 2f 0a 20 20 69 6e 74 20 65  NULL) */.  int e
e110: 4d 6f 64 65 2c 20 20 20 20 20 20 20 20 20 20 20  Mode,           
e120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
e130: 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f  LITE_CHECKPOINT_
e140: 2a 20 76 61 6c 75 65 20 2a 2f 0a 20 20 69 6e 74  * value */.  int
e150: 20 2a 70 6e 4c 6f 67 2c 20 20 20 20 20 20 20 20   *pnLog,        
e160: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e170: 4f 55 54 3a 20 53 69 7a 65 20 6f 66 20 57 41 4c  OUT: Size of WAL
e180: 20 6c 6f 67 20 69 6e 20 66 72 61 6d 65 73 20 2a   log in frames *
e190: 2f 0a 20 20 69 6e 74 20 2a 70 6e 43 6b 70 74 20  /.  int *pnCkpt 
e1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e1b0: 20 20 20 20 2f 2a 20 4f 55 54 3a 20 54 6f 74 61      /* OUT: Tota
e1c0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 66 72 61 6d  l number of fram
e1d0: 65 73 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20  es checkpointed 
e1e0: 2a 2f 0a 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  */.){.#ifdef SQL
e1f0: 49 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 72  ITE_OMIT_WAL.  r
e200: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
e210: 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20 72 63 3b  .#else.  int rc;
e220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e230: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
e240: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74  rn code */.  int
e250: 20 69 44 62 20 3d 20 53 51 4c 49 54 45 5f 4d 41   iDb = SQLITE_MA
e260: 58 5f 41 54 54 41 43 48 45 44 3b 20 20 2f 2a 20  X_ATTACHED;  /* 
e270: 73 71 6c 69 74 65 33 2e 61 44 62 5b 5d 20 69 6e  sqlite3.aDb[] in
e280: 64 65 78 20 6f 66 20 64 62 20 74 6f 20 63 68 65  dex of db to che
e290: 63 6b 70 6f 69 6e 74 20 2a 2f 0a 0a 20 20 2f 2a  ckpoint */..  /*
e2a0: 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   Initialize the 
e2b0: 6f 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73  output variables
e2c0: 20 74 6f 20 2d 31 20 69 6e 20 63 61 73 65 20 61   to -1 in case a
e2d0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  n error occurs. 
e2e0: 2a 2f 0a 20 20 69 66 28 20 70 6e 4c 6f 67 20 29  */.  if( pnLog )
e2f0: 20 2a 70 6e 4c 6f 67 20 3d 20 2d 31 3b 0a 20 20   *pnLog = -1;.  
e300: 69 66 28 20 70 6e 43 6b 70 74 20 29 20 2a 70 6e  if( pnCkpt ) *pn
e310: 43 6b 70 74 20 3d 20 2d 31 3b 0a 0a 20 20 61 73  Ckpt = -1;..  as
e320: 73 65 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45  sert( SQLITE_CHE
e330: 43 4b 50 4f 49 4e 54 5f 46 55 4c 4c 3e 53 51 4c  CKPOINT_FULL>SQL
e340: 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 50  ITE_CHECKPOINT_P
e350: 41 53 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65  ASSIVE );.  asse
e360: 72 74 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  rt( SQLITE_CHECK
e370: 50 4f 49 4e 54 5f 46 55 4c 4c 3c 53 51 4c 49 54  POINT_FULL<SQLIT
e380: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
e390: 54 41 52 54 20 29 3b 0a 20 20 61 73 73 65 72 74  TART );.  assert
e3a0: 28 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f  ( SQLITE_CHECKPO
e3b0: 49 4e 54 5f 50 41 53 53 49 56 45 2b 32 3d 3d 53  INT_PASSIVE+2==S
e3c0: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
e3d0: 5f 52 45 53 54 41 52 54 20 29 3b 0a 20 20 69 66  _RESTART );.  if
e3e0: 28 20 65 4d 6f 64 65 3c 53 51 4c 49 54 45 5f 43  ( eMode<SQLITE_C
e3f0: 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49 56  HECKPOINT_PASSIV
e400: 45 20 7c 7c 20 65 4d 6f 64 65 3e 53 51 4c 49 54  E || eMode>SQLIT
e410: 45 5f 43 48 45 43 4b 50 4f 49 4e 54 5f 52 45 53  E_CHECKPOINT_RES
e420: 54 41 52 54 20 29 7b 0a 20 20 20 20 72 65 74 75  TART ){.    retu
e430: 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55 53 45  rn SQLITE_MISUSE
e440: 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
e450: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
e460: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 7a  >mutex);.  if( z
e470: 44 62 20 26 26 20 7a 44 62 5b 30 5d 20 29 7b 0a  Db && zDb[0] ){.
e480: 20 20 20 20 69 44 62 20 3d 20 73 71 6c 69 74 65      iDb = sqlite
e490: 33 46 69 6e 64 44 62 4e 61 6d 65 28 64 62 2c 20  3FindDbName(db, 
e4a0: 7a 44 62 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  zDb);.  }.  if( 
e4b0: 69 44 62 3c 30 20 29 7b 0a 20 20 20 20 72 63 20  iDb<0 ){.    rc 
e4c0: 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
e4d0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
e4e0: 57 69 74 68 4d 73 67 28 64 62 2c 20 53 51 4c 49  WithMsg(db, SQLI
e4f0: 54 45 5f 45 52 52 4f 52 2c 20 22 75 6e 6b 6e 6f  TE_ERROR, "unkno
e500: 77 6e 20 64 61 74 61 62 61 73 65 3a 20 25 73 22  wn database: %s"
e510: 2c 20 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b  , zDb);.  }else{
e520: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
e530: 33 43 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c 20  3Checkpoint(db, 
e540: 69 44 62 2c 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f  iDb, eMode, pnLo
e550: 67 2c 20 70 6e 43 6b 70 74 29 3b 0a 20 20 20 20  g, pnCkpt);.    
e560: 73 71 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c  sqlite3Error(db,
e570: 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d   rc);.  }.  rc =
e580: 20 73 71 6c 69 74 65 33 41 70 69 45 78 69 74 28   sqlite3ApiExit(
e590: 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c 69 74  db, rc);.  sqlit
e5a0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 64  e3_mutex_leave(d
e5b0: 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72 65 74  b->mutex);.  ret
e5c0: 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a 7d  urn rc;.#endif.}
e5d0: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 70 6f  .../*.** Checkpo
e5e0: 69 6e 74 20 64 61 74 61 62 61 73 65 20 7a 44 62  int database zDb
e5f0: 2e 20 49 66 20 7a 44 62 20 69 73 20 4e 55 4c 4c  . If zDb is NULL
e600: 2c 20 6f 72 20 69 66 20 74 68 65 20 62 75 66 66  , or if the buff
e610: 65 72 20 7a 44 62 20 70 6f 69 6e 74 73 0a 2a 2a  er zDb points.**
e620: 20 74 6f 20 63 6f 6e 74 61 69 6e 73 20 61 20 7a   to contains a z
e630: 65 72 6f 2d 6c 65 6e 67 74 68 20 73 74 72 69 6e  ero-length strin
e640: 67 2c 20 61 6c 6c 20 61 74 74 61 63 68 65 64 20  g, all attached 
e650: 64 61 74 61 62 61 73 65 73 20 61 72 65 20 0a 2a  databases are .*
e660: 2a 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 2e 0a  * checkpointed..
e670: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 77  */.int sqlite3_w
e680: 61 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 28 73 71  al_checkpoint(sq
e690: 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
e6a0: 20 63 68 61 72 20 2a 7a 44 62 29 7b 0a 20 20 72   char *zDb){.  r
e6b0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 77 61  eturn sqlite3_wa
e6c0: 6c 5f 63 68 65 63 6b 70 6f 69 6e 74 5f 76 32 28  l_checkpoint_v2(
e6d0: 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49 54 45 5f  db, zDb, SQLITE_
e6e0: 43 48 45 43 4b 50 4f 49 4e 54 5f 50 41 53 53 49  CHECKPOINT_PASSI
e6f0: 56 45 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 23 69  VE, 0, 0);.}..#i
e700: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e710: 54 5f 57 41 4c 0a 2f 2a 0a 2a 2a 20 52 75 6e 20  T_WAL./*.** Run 
e720: 61 20 63 68 65 63 6b 70 6f 69 6e 74 20 6f 6e 20  a checkpoint on 
e730: 64 61 74 61 62 61 73 65 20 69 44 62 2e 20 54 68  database iDb. Th
e740: 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66  is is a no-op if
e750: 20 64 61 74 61 62 61 73 65 20 69 44 62 20 69 73   database iDb is
e760: 0a 2a 2a 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c  .** not currentl
e770: 79 20 6f 70 65 6e 20 69 6e 20 57 41 4c 20 6d 6f  y open in WAL mo
e780: 64 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  de..**.** If a t
e790: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f 70  ransaction is op
e7a0: 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
e7b0: 73 65 20 62 65 69 6e 67 20 63 68 65 63 6b 70 6f  se being checkpo
e7c0: 69 6e 74 65 64 2c 20 74 68 69 73 20 0a 2a 2a 20  inted, this .** 
e7d0: 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
e7e0: 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 61   SQLITE_LOCKED a
e7f0: 6e 64 20 61 20 63 68 65 63 6b 70 6f 69 6e 74 20  nd a checkpoint 
e800: 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65 64  is not attempted
e810: 2e 20 49 66 20 0a 2a 2a 20 61 6e 20 65 72 72 6f  . If .** an erro
e820: 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72  r occurs while r
e830: 75 6e 6e 69 6e 67 20 74 68 65 20 63 68 65 63 6b  unning the check
e840: 70 6f 69 6e 74 2c 20 61 6e 20 53 51 4c 69 74 65  point, an SQLite
e850: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 0a   error code is .
e860: 2a 2a 20 72 65 74 75 72 6e 65 64 20 28 69 2e 65  ** returned (i.e
e870: 2e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 29 2e  . SQLITE_IOERR).
e880: 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
e890: 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  TE_OK..**.** The
e8a0: 20 6d 75 74 65 78 20 6f 6e 20 64 61 74 61 62 61   mutex on databa
e8b0: 73 65 20 68 61 6e 64 6c 65 20 64 62 20 73 68 6f  se handle db sho
e8c0: 75 6c 64 20 62 65 20 68 65 6c 64 20 62 79 20 74  uld be held by t
e8d0: 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 65 20 6d  he caller. The m
e8e0: 75 74 65 78 0a 2a 2a 20 61 73 73 6f 63 69 61 74  utex.** associat
e8f0: 65 64 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ed with the spec
e900: 69 66 69 63 20 62 2d 74 72 65 65 20 62 65 69 6e  ific b-tree bein
e910: 67 20 63 68 65 63 6b 70 6f 69 6e 74 65 64 20 69  g checkpointed i
e920: 73 20 74 61 6b 65 6e 20 62 79 0a 2a 2a 20 74 68  s taken by.** th
e930: 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c  is function whil
e940: 65 20 74 68 65 20 63 68 65 63 6b 70 6f 69 6e 74  e the checkpoint
e950: 20 69 73 20 72 75 6e 6e 69 6e 67 2e 0a 2a 2a 0a   is running..**.
e960: 2a 2a 20 49 66 20 69 44 62 20 69 73 20 70 61 73  ** If iDb is pas
e970: 73 65 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 41  sed SQLITE_MAX_A
e980: 54 54 41 43 48 45 44 2c 20 74 68 65 6e 20 61 6c  TTACHED, then al
e990: 6c 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  l attached datab
e9a0: 61 73 65 73 20 61 72 65 0a 2a 2a 20 63 68 65 63  ases are.** chec
e9b0: 6b 70 6f 69 6e 74 65 64 2e 20 49 66 20 61 6e 20  kpointed. If an 
e9c0: 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
e9d0: 65 72 65 64 20 69 74 20 69 73 20 72 65 74 75 72  ered it is retur
e9e0: 6e 65 64 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ned immediately 
e9f0: 2d 0a 2a 2a 20 6e 6f 20 61 74 74 65 6d 70 74 20  -.** no attempt 
ea00: 69 73 20 6d 61 64 65 20 74 6f 20 63 68 65 63 6b  is made to check
ea10: 70 6f 69 6e 74 20 61 6e 79 20 72 65 6d 61 69 6e  point any remain
ea20: 69 6e 67 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ing databases..*
ea30: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 65  *.** Parameter e
ea40: 4d 6f 64 65 20 69 73 20 6f 6e 65 20 6f 66 20 53  Mode is one of S
ea50: 51 4c 49 54 45 5f 43 48 45 43 4b 50 4f 49 4e 54  QLITE_CHECKPOINT
ea60: 5f 50 41 53 53 49 56 45 2c 20 46 55 4c 4c 20 6f  _PASSIVE, FULL o
ea70: 72 20 52 45 53 54 41 52 54 2e 0a 2a 2f 0a 69 6e  r RESTART..*/.in
ea80: 74 20 73 71 6c 69 74 65 33 43 68 65 63 6b 70 6f  t sqlite3Checkpo
ea90: 69 6e 74 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  int(sqlite3 *db,
eaa0: 20 69 6e 74 20 69 44 62 2c 20 69 6e 74 20 65 4d   int iDb, int eM
eab0: 6f 64 65 2c 20 69 6e 74 20 2a 70 6e 4c 6f 67 2c  ode, int *pnLog,
eac0: 20 69 6e 74 20 2a 70 6e 43 6b 70 74 29 7b 0a 20   int *pnCkpt){. 
ead0: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
eae0: 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
eaf0: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
eb00: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
eb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb20: 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20       /* Used to 
eb30: 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
eb40: 61 74 74 61 63 68 65 64 20 64 62 73 20 2a 2f 0a  attached dbs */.
eb50: 20 20 69 6e 74 20 62 42 75 73 79 20 3d 20 30 3b    int bBusy = 0;
eb60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb70: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53 51 4c    /* True if SQL
eb80: 49 54 45 5f 42 55 53 59 20 68 61 73 20 62 65 65  ITE_BUSY has bee
eb90: 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f  n encountered */
eba0: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
ebb0: 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64 28 64  te3_mutex_held(d
ebc0: 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 20 20 61  b->mutex) );.  a
ebd0: 73 73 65 72 74 28 20 21 70 6e 4c 6f 67 20 7c 7c  ssert( !pnLog ||
ebe0: 20 2a 70 6e 4c 6f 67 3d 3d 2d 31 20 29 3b 0a 20   *pnLog==-1 );. 
ebf0: 20 61 73 73 65 72 74 28 20 21 70 6e 43 6b 70 74   assert( !pnCkpt
ec00: 20 7c 7c 20 2a 70 6e 43 6b 70 74 3d 3d 2d 31 20   || *pnCkpt==-1 
ec10: 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  );..  for(i=0; i
ec20: 3c 64 62 2d 3e 6e 44 62 20 26 26 20 72 63 3d 3d  <db->nDb && rc==
ec30: 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
ec40: 0a 20 20 20 20 69 66 28 20 69 3d 3d 69 44 62 20  .    if( i==iDb 
ec50: 7c 7c 20 69 44 62 3d 3d 53 51 4c 49 54 45 5f 4d  || iDb==SQLITE_M
ec60: 41 58 5f 41 54 54 41 43 48 45 44 20 29 7b 0a 20  AX_ATTACHED ){. 
ec70: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
ec80: 33 42 74 72 65 65 43 68 65 63 6b 70 6f 69 6e 74  3BtreeCheckpoint
ec90: 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 42 74 2c  (db->aDb[i].pBt,
eca0: 20 65 4d 6f 64 65 2c 20 70 6e 4c 6f 67 2c 20 70   eMode, pnLog, p
ecb0: 6e 43 6b 70 74 29 3b 0a 20 20 20 20 20 20 70 6e  nCkpt);.      pn
ecc0: 4c 6f 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  Log = 0;.      p
ecd0: 6e 43 6b 70 74 20 3d 20 30 3b 0a 20 20 20 20 20  nCkpt = 0;.     
ece0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ecf0: 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 20 20  BUSY ){.        
ed00: 62 42 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 20  bBusy = 1;.     
ed10: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
ed20: 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  K;.      }.    }
ed30: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28  .  }..  return (
ed40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
ed50: 20 62 42 75 73 79 29 20 3f 20 53 51 4c 49 54 45   bBusy) ? SQLITE
ed60: 5f 42 55 53 59 20 3a 20 72 63 3b 0a 7d 0a 23 65  _BUSY : rc;.}.#e
ed70: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
ed80: 4d 49 54 5f 57 41 4c 20 2a 2f 0a 0a 2f 2a 0a 2a  MIT_WAL */../*.*
ed90: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
eda0: 72 65 74 75 72 6e 73 20 74 72 75 65 20 69 66 20  returns true if 
edb0: 6d 61 69 6e 2d 6d 65 6d 6f 72 79 20 73 68 6f 75  main-memory shou
edc0: 6c 64 20 62 65 20 75 73 65 64 20 69 6e 73 74 65  ld be used inste
edd0: 61 64 20 6f 66 0a 2a 2a 20 61 20 74 65 6d 70 6f  ad of.** a tempo
ede0: 72 61 72 79 20 66 69 6c 65 20 66 6f 72 20 74 72  rary file for tr
edf0: 61 6e 73 69 65 6e 74 20 70 61 67 65 72 20 66 69  ansient pager fi
ee00: 6c 65 73 20 61 6e 64 20 73 74 61 74 65 6d 65 6e  les and statemen
ee10: 74 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  t journals..** T
ee20: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
ee30: 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  d depends on the
ee40: 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 74 65   value of db->te
ee50: 6d 70 5f 73 74 6f 72 65 20 28 72 75 6e 74 69 6d  mp_store (runtim
ee60: 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 29 20  e.** parameter) 
ee70: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 20  and the compile 
ee80: 74 69 6d 65 20 76 61 6c 75 65 20 6f 66 20 53 51  time value of SQ
ee90: 4c 49 54 45 5f 54 45 4d 50 5f 53 54 4f 52 45 2e  LITE_TEMP_STORE.
eea0: 20 54 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e   The.** followin
eeb0: 67 20 74 61 62 6c 65 20 64 65 73 63 72 69 62 65  g table describe
eec0: 73 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 73 68  s the relationsh
eed0: 69 70 20 62 65 74 77 65 65 6e 20 74 68 65 73 65  ip between these
eee0: 20 74 77 6f 20 76 61 6c 75 65 73 0a 2a 2a 20 61   two values.** a
eef0: 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  nd this function
ef00: 73 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2e 0a  s return value..
ef10: 2a 2a 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 54  **.**   SQLITE_T
ef20: 45 4d 50 5f 53 54 4f 52 45 20 20 20 20 20 64 62  EMP_STORE     db
ef30: 2d 3e 74 65 6d 70 5f 73 74 6f 72 65 20 20 20 20  ->temp_store    
ef40: 20 4c 6f 63 61 74 69 6f 6e 20 6f 66 20 74 65 6d   Location of tem
ef50: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 0a  porary database.
ef60: 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  **   -----------
ef70: 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d 2d 2d 2d  ------     -----
ef80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 2d 2d  ---------     --
ef90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
efa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
efb0: 20 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20    0             
efc0: 20 20 20 20 20 20 20 20 61 6e 79 20 20 20 20 20          any     
efd0: 20 20 20 20 20 20 20 20 20 20 20 66 69 6c 65 20             file 
efe0: 20 20 20 20 20 28 72 65 74 75 72 6e 20 30 29 0a       (return 0).
eff0: 2a 2a 20 20 20 31 20 20 20 20 20 20 20 20 20 20  **   1          
f000: 20 20 20 20 20 20 20 20 20 20 20 31 20 20 20 20             1    
f010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
f020: 6c 65 20 20 20 20 20 20 28 72 65 74 75 72 6e 20  le      (return 
f030: 30 29 0a 2a 2a 20 20 20 31 20 20 20 20 20 20 20  0).**   1       
f040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 32 20                2 
f050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f060: 20 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75   memory    (retu
f070: 72 6e 20 31 29 0a 2a 2a 20 20 20 31 20 20 20 20  rn 1).**   1    
f080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f090: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
f0a0: 20 20 20 20 66 69 6c 65 20 20 20 20 20 20 28 72      file      (r
f0b0: 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20 20 32 20  eturn 0).**   2 
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0d0: 20 20 20 20 31 20 20 20 20 20 20 20 20 20 20 20      1           
f0e0: 20 20 20 20 20 20 20 66 69 6c 65 20 20 20 20 20         file     
f0f0: 20 28 72 65 74 75 72 6e 20 30 29 0a 2a 2a 20 20   (return 0).**  
f100: 20 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20   2              
f110: 20 20 20 20 20 20 20 32 20 20 20 20 20 20 20 20         2        
f120: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 6f 72 79            memory
f130: 20 20 20 20 28 72 65 74 75 72 6e 20 31 29 0a 2a      (return 1).*
f140: 2a 20 20 20 32 20 20 20 20 20 20 20 20 20 20 20  *   2           
f150: 20 20 20 20 20 20 20 20 20 20 30 20 20 20 20 20            0     
f160: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d               mem
f170: 6f 72 79 20 20 20 20 28 72 65 74 75 72 6e 20 31  ory    (return 1
f180: 29 0a 2a 2a 20 20 20 33 20 20 20 20 20 20 20 20  ).**   3        
f190: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e 79               any
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f1b0: 6d 65 6d 6f 72 79 20 20 20 20 28 72 65 74 75 72  memory    (retur
f1c0: 6e 20 31 29 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  n 1).*/.int sqli
f1d0: 74 65 33 54 65 6d 70 49 6e 4d 65 6d 6f 72 79 28  te3TempInMemory(
f1e0: 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 20 2a 64  const sqlite3 *d
f1f0: 62 29 7b 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  b){.#if SQLITE_T
f200: 45 4d 50 5f 53 54 4f 52 45 3d 3d 31 0a 20 20 72  EMP_STORE==1.  r
f210: 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70  eturn ( db->temp
f220: 5f 73 74 6f 72 65 3d 3d 32 20 29 3b 0a 23 65 6e  _store==2 );.#en
f230: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
f240: 45 4d 50 5f 53 54 4f 52 45 3d 3d 32 0a 20 20 72  EMP_STORE==2.  r
f250: 65 74 75 72 6e 20 28 20 64 62 2d 3e 74 65 6d 70  eturn ( db->temp
f260: 5f 73 74 6f 72 65 21 3d 31 20 29 3b 0a 23 65 6e  _store!=1 );.#en
f270: 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 54  dif.#if SQLITE_T
f280: 45 4d 50 5f 53 54 4f 52 45 3d 3d 33 0a 20 20 72  EMP_STORE==3.  r
f290: 65 74 75 72 6e 20 31 3b 0a 23 65 6e 64 69 66 0a  eturn 1;.#endif.
f2a0: 23 69 66 20 53 51 4c 49 54 45 5f 54 45 4d 50 5f  #if SQLITE_TEMP_
f2b0: 53 54 4f 52 45 3c 31 20 7c 7c 20 53 51 4c 49 54  STORE<1 || SQLIT
f2c0: 45 5f 54 45 4d 50 5f 53 54 4f 52 45 3e 33 0a 20  E_TEMP_STORE>3. 
f2d0: 20 72 65 74 75 72 6e 20 30 3b 0a 23 65 6e 64 69   return 0;.#endi
f2e0: 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  f.}../*.** Retur
f2f0: 6e 20 55 54 46 2d 38 20 65 6e 63 6f 64 65 64 20  n UTF-8 encoded 
f300: 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
f310: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
f320: 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 0a  the most recent.
f330: 2a 2a 20 65 72 72 6f 72 2e 0a 2a 2f 0a 63 6f 6e  ** error..*/.con
f340: 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
f350: 5f 65 72 72 6d 73 67 28 73 71 6c 69 74 65 33 20  _errmsg(sqlite3 
f360: 2a 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  *db){.  const ch
f370: 61 72 20 2a 7a 3b 0a 20 20 69 66 28 20 21 64 62  ar *z;.  if( !db
f380: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73   ){.    return s
f390: 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
f3a0: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 0a  ITE_NOMEM);.  }.
f3b0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61    if( !sqlite3Sa
f3c0: 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f  fetyCheckSickOrO
f3d0: 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74  k(db) ){.    ret
f3e0: 75 72 6e 20 73 71 6c 69 74 65 33 45 72 72 53 74  urn sqlite3ErrSt
f3f0: 72 28 53 51 4c 49 54 45 5f 4d 49 53 55 53 45 5f  r(SQLITE_MISUSE_
f400: 42 4b 50 54 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  BKPT);.  }.  sql
f410: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
f420: 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 69  (db->mutex);.  i
f430: 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  f( db->mallocFai
f440: 6c 65 64 20 29 7b 0a 20 20 20 20 7a 20 3d 20 73  led ){.    z = s
f450: 71 6c 69 74 65 33 45 72 72 53 74 72 28 53 51 4c  qlite3ErrStr(SQL
f460: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 7d 65  ITE_NOMEM);.  }e
f470: 6c 73 65 7b 0a 20 20 20 20 74 65 73 74 63 61 73  lse{.    testcas
f480: 65 28 20 64 62 2d 3e 70 45 72 72 3d 3d 30 20 29  e( db->pErr==0 )
f490: 3b 0a 20 20 20 20 7a 20 3d 20 28 63 68 61 72 2a  ;.    z = (char*
f4a0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
f4b0: 65 78 74 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20  ext(db->pErr);. 
f4c0: 20 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e     assert( !db->
f4d0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
f4e0: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a      if( z==0 ){.
f4f0: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
f500: 33 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43  3ErrStr(db->errC
f510: 6f 64 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ode);.    }.  }.
f520: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
f530: 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78 29  leave(db->mutex)
f540: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a  ;.  return z;.}.
f550: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
f560: 4f 4d 49 54 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a  OMIT_UTF16./*.**
f570: 20 52 65 74 75 72 6e 20 55 54 46 2d 31 36 20 65   Return UTF-16 e
f580: 6e 63 6f 64 65 64 20 45 6e 67 6c 69 73 68 20 6c  ncoded English l
f590: 61 6e 67 75 61 67 65 20 65 78 70 6c 61 6e 61 74  anguage explanat
f5a0: 69 6f 6e 20 6f 66 20 74 68 65 20 6d 6f 73 74 20  ion of the most 
f5b0: 72 65 63 65 6e 74 0a 2a 2a 20 65 72 72 6f 72 2e  recent.** error.
f5c0: 0a 2a 2f 0a 63 6f 6e 73 74 20 76 6f 69 64 20 2a  .*/.const void *
f5d0: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 31 36  sqlite3_errmsg16
f5e0: 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
f5f0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31   static const u1
f600: 36 20 6f 75 74 4f 66 4d 65 6d 5b 5d 20 3d 20 7b  6 outOfMem[] = {
f610: 0a 20 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27  .    'o', 'u', '
f620: 74 27 2c 20 27 20 27 2c 20 27 6f 27 2c 20 27 66  t', ' ', 'o', 'f
f630: 27 2c 20 27 20 27 2c 20 27 6d 27 2c 20 27 65 27  ', ' ', 'm', 'e'
f640: 2c 20 27 6d 27 2c 20 27 6f 27 2c 20 27 72 27 2c  , 'm', 'o', 'r',
f650: 20 27 79 27 2c 20 30 0a 20 20 7d 3b 0a 20 20 73   'y', 0.  };.  s
f660: 74 61 74 69 63 20 63 6f 6e 73 74 20 75 31 36 20  tatic const u16 
f670: 6d 69 73 75 73 65 5b 5d 20 3d 20 7b 0a 20 20 20  misuse[] = {.   
f680: 20 27 6c 27 2c 20 27 69 27 2c 20 27 62 27 2c 20   'l', 'i', 'b', 
f690: 27 72 27 2c 20 27 61 27 2c 20 27 72 27 2c 20 27  'r', 'a', 'r', '
f6a0: 79 27 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 72  y', ' ', .    'r
f6b0: 27 2c 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27  ', 'o', 'u', 't'
f6c0: 2c 20 27 69 27 2c 20 27 6e 27 2c 20 27 65 27 2c  , 'i', 'n', 'e',
f6d0: 20 27 20 27 2c 20 0a 20 20 20 20 27 63 27 2c 20   ' ', .    'c', 
f6e0: 27 61 27 2c 20 27 6c 27 2c 20 27 6c 27 2c 20 27  'a', 'l', 'l', '
f6f0: 65 27 2c 20 27 64 27 2c 20 27 20 27 2c 20 0a 20  e', 'd', ' ', . 
f700: 20 20 20 27 6f 27 2c 20 27 75 27 2c 20 27 74 27     'o', 'u', 't'
f710: 2c 20 27 20 27 2c 20 0a 20 20 20 20 27 6f 27 2c  , ' ', .    'o',
f720: 20 27 66 27 2c 20 27 20 27 2c 20 0a 20 20 20 20   'f', ' ', .    
f730: 27 73 27 2c 20 27 65 27 2c 20 27 71 27 2c 20 27  's', 'e', 'q', '
f740: 75 27 2c 20 27 65 27 2c 20 27 6e 27 2c 20 27 63  u', 'e', 'n', 'c
f750: 27 2c 20 27 65 27 2c 20 30 0a 20 20 7d 3b 0a 0a  ', 'e', 0.  };..
f760: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 3b    const void *z;
f770: 0a 20 20 69 66 28 20 21 64 62 20 29 7b 0a 20 20  .  if( !db ){.  
f780: 20 20 72 65 74 75 72 6e 20 28 76 6f 69 64 20 2a    return (void *
f790: 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d 0a 20  )outOfMem;.  }. 
f7a0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 53 61 66   if( !sqlite3Saf
f7b0: 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72 4f 6b  etyCheckSickOrOk
f7c0: 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (db) ){.    retu
f7d0: 72 6e 20 28 76 6f 69 64 20 2a 29 6d 69 73 75 73  rn (void *)misus
f7e0: 65 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  e;.  }.  sqlite3
f7f0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62 2d  _mutex_enter(db-
f800: 3e 6d 75 74 65 78 29 3b 0a 20 20 69 66 28 20 64  >mutex);.  if( d
f810: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
f820: 29 7b 0a 20 20 20 20 7a 20 3d 20 28 76 6f 69 64  ){.    z = (void
f830: 20 2a 29 6f 75 74 4f 66 4d 65 6d 3b 0a 20 20 7d   *)outOfMem;.  }
f840: 65 6c 73 65 7b 0a 20 20 20 20 7a 20 3d 20 73 71  else{.    z = sq
f850: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
f860: 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a 20 20  16(db->pErr);.  
f870: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
f880: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
f890: 57 69 74 68 4d 73 67 28 64 62 2c 20 64 62 2d 3e  WithMsg(db, db->
f8a0: 65 72 72 43 6f 64 65 2c 20 73 71 6c 69 74 65 33  errCode, sqlite3
f8b0: 45 72 72 53 74 72 28 64 62 2d 3e 65 72 72 43 6f  ErrStr(db->errCo
f8c0: 64 65 29 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20  de));.      z = 
f8d0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
f8e0: 78 74 31 36 28 64 62 2d 3e 70 45 72 72 29 3b 0a  xt16(db->pErr);.
f8f0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6d      }.    /* A m
f900: 61 6c 6c 6f 63 28 29 20 6d 61 79 20 68 61 76 65  alloc() may have
f910: 20 66 61 69 6c 65 64 20 77 69 74 68 69 6e 20 74   failed within t
f920: 68 65 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74  he call to sqlit
f930: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 31 36 28  e3_value_text16(
f940: 29 0a 20 20 20 20 2a 2a 20 61 62 6f 76 65 2e 20  ).    ** above. 
f950: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
f960: 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20 64 62  ase, then the db
f970: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66  ->mallocFailed f
f980: 6c 61 67 20 6e 65 65 64 73 20 74 6f 0a 20 20 20  lag needs to.   
f990: 20 2a 2a 20 62 65 20 63 6c 65 61 72 65 64 20 62   ** be cleared b
f9a0: 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
f9b0: 20 44 6f 20 74 68 69 73 20 64 69 72 65 63 74 6c   Do this directl
f9c0: 79 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 76 69  y, instead of vi
f9d0: 61 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33  a.    ** sqlite3
f9e0: 41 70 69 45 78 69 74 28 29 2c 20 74 6f 20 61 76  ApiExit(), to av
f9f0: 6f 69 64 20 73 65 74 74 69 6e 67 20 74 68 65 20  oid setting the 
fa00: 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
fa10: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 0a 20  error message.. 
fa20: 20 20 20 2a 2f 0a 20 20 20 20 64 62 2d 3e 6d 61     */.    db->ma
fa30: 6c 6c 6f 63 46 61 69 6c 65 64 20 3d 20 30 3b 0a  llocFailed = 0;.
fa40: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
fa50: 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
fa60: 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a  tex);.  return z
fa70: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
fa80: 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
fa90: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  */../*.** Return
faa0: 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
fab0: 20 65 72 72 6f 72 20 63 6f 64 65 20 67 65 6e 65   error code gene
fac0: 72 61 74 65 64 20 62 79 20 61 6e 20 53 51 4c 69  rated by an SQLi
fad0: 74 65 20 72 6f 75 74 69 6e 65 2e 20 49 66 20 4e  te routine. If N
fae0: 55 4c 4c 20 69 73 0a 2a 2a 20 70 61 73 73 65 64  ULL is.** passed
faf0: 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
fb00: 6e 2c 20 77 65 20 61 73 73 75 6d 65 20 61 20 6d  n, we assume a m
fb10: 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 64  alloc() failed d
fb20: 75 72 69 6e 67 20 73 71 6c 69 74 65 33 5f 6f 70  uring sqlite3_op
fb30: 65 6e 28 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  en()..*/.int sql
fb40: 69 74 65 33 5f 65 72 72 63 6f 64 65 28 73 71 6c  ite3_errcode(sql
fb50: 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66 28  ite3 *db){.  if(
fb60: 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33 53   db && !sqlite3S
fb70: 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f 72  afetyCheckSickOr
fb80: 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72 65  Ok(db) ){.    re
fb90: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
fba0: 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20 69  SE_BKPT;.  }.  i
fbb0: 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d 61  f( !db || db->ma
fbc0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
fbd0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
fbe0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65 74  NOMEM;.  }.  ret
fbf0: 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65 20  urn db->errCode 
fc00: 26 20 64 62 2d 3e 65 72 72 4d 61 73 6b 3b 0a 7d  & db->errMask;.}
fc10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 65 78 74  .int sqlite3_ext
fc20: 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 73 71  ended_errcode(sq
fc30: 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 69 66  lite3 *db){.  if
fc40: 28 20 64 62 20 26 26 20 21 73 71 6c 69 74 65 33  ( db && !sqlite3
fc50: 53 61 66 65 74 79 43 68 65 63 6b 53 69 63 6b 4f  SafetyCheckSickO
fc60: 72 4f 6b 28 64 62 29 20 29 7b 0a 20 20 20 20 72  rOk(db) ){.    r
fc70: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53  eturn SQLITE_MIS
fc80: 55 53 45 5f 42 4b 50 54 3b 0a 20 20 7d 0a 20 20  USE_BKPT;.  }.  
fc90: 69 66 28 20 21 64 62 20 7c 7c 20 64 62 2d 3e 6d  if( !db || db->m
fca0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
fcb0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
fcc0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 65  _NOMEM;.  }.  re
fcd0: 74 75 72 6e 20 64 62 2d 3e 65 72 72 43 6f 64 65  turn db->errCode
fce0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
fcf0: 6e 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  n a string that 
fd00: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 6b 69  describes the ki
fd10: 6e 64 20 6f 66 20 65 72 72 6f 72 20 73 70 65 63  nd of error spec
fd20: 69 66 69 65 64 20 69 6e 20 74 68 65 0a 2a 2a 20  ified in the.** 
fd30: 61 72 67 75 6d 65 6e 74 2e 20 20 46 6f 72 20 6e  argument.  For n
fd40: 6f 77 2c 20 74 68 69 73 20 73 69 6d 70 6c 79 20  ow, this simply 
fd50: 63 61 6c 6c 73 20 74 68 65 20 69 6e 74 65 72 6e  calls the intern
fd60: 61 6c 20 73 71 6c 69 74 65 33 45 72 72 53 74 72  al sqlite3ErrStr
fd70: 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 0a  ().** function..
fd80: 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
fd90: 71 6c 69 74 65 33 5f 65 72 72 73 74 72 28 69 6e  qlite3_errstr(in
fda0: 74 20 72 63 29 7b 0a 20 20 72 65 74 75 72 6e 20  t rc){.  return 
fdb0: 73 71 6c 69 74 65 33 45 72 72 53 74 72 28 72 63  sqlite3ErrStr(rc
fdc0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 61  );.}../*.** Inva
fdd0: 6c 69 64 61 74 65 20 61 6c 6c 20 63 61 63 68 65  lidate all cache
fde0: 64 20 4b 65 79 49 6e 66 6f 20 6f 62 6a 65 63 74  d KeyInfo object
fdf0: 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 63  s for database c
fe00: 6f 6e 6e 65 63 74 69 6f 6e 20 22 64 62 22 0a 2a  onnection "db".*
fe10: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e  /.static void in
fe20: 76 61 6c 69 64 61 74 65 43 61 63 68 65 64 4b 65  validateCachedKe
fe30: 79 49 6e 66 6f 28 73 71 6c 69 74 65 33 20 2a 64  yInfo(sqlite3 *d
fe40: 62 29 7b 0a 20 20 44 62 20 2a 70 44 62 3b 20 20  b){.  Db *pDb;  
fe50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe60: 20 20 2f 2a 20 41 20 73 69 6e 67 6c 65 20 64 61    /* A single da
fe70: 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74 20  tabase */.  int 
fe80: 69 44 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  iDb;            
fe90: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
fea0: 61 74 61 62 61 73 65 20 69 6e 64 65 78 20 6e 75  atabase index nu
feb0: 6d 62 65 72 20 2a 2f 0a 20 20 48 61 73 68 45 6c  mber */.  HashEl
fec0: 65 6d 20 2a 6b 3b 20 20 20 20 20 20 20 20 20 20  em *k;          
fed0: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f        /* For loo
fee0: 70 69 6e 67 20 6f 76 65 72 20 74 61 62 6c 65 73  ping over tables
fef0: 20 69 6e 20 70 44 62 20 2a 2f 0a 20 20 54 61 62   in pDb */.  Tab
ff00: 6c 65 20 2a 70 54 61 62 3b 20 20 20 20 20 20 20  le *pTab;       
ff10: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 74 61           /* A ta
ff20: 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74 61 62  ble in the datab
ff30: 61 73 65 20 2a 2f 0a 20 20 49 6e 64 65 78 20 2a  ase */.  Index *
ff40: 70 49 64 78 3b 20 20 20 20 20 20 20 20 20 20 20  pIdx;           
ff50: 20 20 20 20 20 2f 2a 20 45 61 63 68 20 69 6e 64       /* Each ind
ff60: 65 78 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 44 62  ex */..  for(iDb
ff70: 3d 30 2c 20 70 44 62 3d 64 62 2d 3e 61 44 62 3b  =0, pDb=db->aDb;
ff80: 20 69 44 62 3c 64 62 2d 3e 6e 44 62 3b 20 69 44   iDb<db->nDb; iD
ff90: 62 2b 2b 2c 20 70 44 62 2b 2b 29 7b 0a 20 20 20  b++, pDb++){.   
ffa0: 20 69 66 28 20 70 44 62 2d 3e 70 42 74 3d 3d 30   if( pDb->pBt==0
ffb0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
ffc0: 20 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74   sqlite3BtreeEnt
ffd0: 65 72 28 70 44 62 2d 3e 70 42 74 29 3b 0a 20 20  er(pDb->pBt);.  
ffe0: 20 20 66 6f 72 28 6b 3d 73 71 6c 69 74 65 48 61    for(k=sqliteHa
fff0: 73 68 46 69 72 73 74 28 26 70 44 62 2d 3e 70 53  shFirst(&pDb->pS
10000 63 68 65 6d 61 2d 3e 74 62 6c 48 61 73 68 29 3b  chema->tblHash);
10010 20 20 6b 3b 20 6b 3d 73 71 6c 69 74 65 48 61 73    k; k=sqliteHas
10020 68 4e 65 78 74 28 6b 29 29 7b 0a 20 20 20 20 20  hNext(k)){.     
10030 20 70 54 61 62 20 3d 20 28 54 61 62 6c 65 2a 29   pTab = (Table*)
10040 73 71 6c 69 74 65 48 61 73 68 44 61 74 61 28 6b  sqliteHashData(k
10050 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64  );.      for(pId
10060 78 3d 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20  x=pTab->pIndex; 
10070 70 49 64 78 3b 20 70 49 64 78 3d 70 49 64 78 2d  pIdx; pIdx=pIdx-
10080 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 20  >pNext){.       
10090 20 69 66 28 20 70 49 64 78 2d 3e 70 4b 65 79 49   if( pIdx->pKeyI
100a0 6e 66 6f 20 26 26 20 70 49 64 78 2d 3e 70 4b 65  nfo && pIdx->pKe
100b0 79 49 6e 66 6f 2d 3e 64 62 3d 3d 64 62 20 29 7b  yInfo->db==db ){
100c0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
100d0 65 33 4b 65 79 49 6e 66 6f 55 6e 72 65 66 28 70  e3KeyInfoUnref(p
100e0 49 64 78 2d 3e 70 4b 65 79 49 6e 66 6f 29 3b 0a  Idx->pKeyInfo);.
100f0 20 20 20 20 20 20 20 20 20 20 70 49 64 78 2d 3e            pIdx->
10100 70 4b 65 79 49 6e 66 6f 20 3d 20 30 3b 0a 20 20  pKeyInfo = 0;.  
10110 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
10120 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
10130 33 42 74 72 65 65 4c 65 61 76 65 28 70 44 62 2d  3BtreeLeave(pDb-
10140 3e 70 42 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  >pBt);.  }.}../*
10150 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
10160 20 63 6f 6c 6c 61 74 69 6e 67 20 66 75 6e 63 74   collating funct
10170 69 6f 6e 20 66 6f 72 20 64 61 74 61 62 61 73 65  ion for database
10180 20 22 64 62 22 2e 20 20 54 68 65 20 6e 61 6d 65   "db".  The name
10190 20 69 73 20 7a 4e 61 6d 65 0a 2a 2a 20 61 6e 64   is zName.** and
101a0 20 74 68 65 20 65 6e 63 6f 64 69 6e 67 20 69 73   the encoding is
101b0 20 65 6e 63 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   enc..*/.static 
101c0 69 6e 74 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  int createCollat
101d0 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 2a 20  ion(.  sqlite3* 
101e0 64 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  db,.  const char
101f0 20 2a 7a 4e 61 6d 65 2c 20 0a 20 20 75 38 20 65   *zName, .  u8 e
10200 6e 63 2c 0a 20 20 76 6f 69 64 2a 20 70 43 74 78  nc,.  void* pCtx
10210 2c 0a 20 20 69 6e 74 28 2a 78 43 6f 6d 70 61 72  ,.  int(*xCompar
10220 65 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  e)(void*,int,con
10230 73 74 20 76 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e  st void*,int,con
10240 73 74 20 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  st void*),.  voi
10250 64 28 2a 78 44 65 6c 29 28 76 6f 69 64 2a 29 0a  d(*xDel)(void*).
10260 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
10270 6f 6c 6c 3b 0a 20 20 69 6e 74 20 65 6e 63 32 3b  oll;.  int enc2;
10280 0a 20 20 0a 20 20 61 73 73 65 72 74 28 20 73 71  .  .  assert( sq
10290 6c 69 74 65 33 5f 6d 75 74 65 78 5f 68 65 6c 64  lite3_mutex_held
102a0 28 64 62 2d 3e 6d 75 74 65 78 29 20 29 3b 0a 0a  (db->mutex) );..
102b0 20 20 2f 2a 20 49 66 20 53 51 4c 49 54 45 5f 55    /* If SQLITE_U
102c0 54 46 31 36 20 69 73 20 73 70 65 63 69 66 69 65  TF16 is specifie
102d0 64 20 61 73 20 74 68 65 20 65 6e 63 6f 64 69 6e  d as the encodin
102e0 67 20 74 79 70 65 2c 20 74 72 61 6e 73 66 6f 72  g type, transfor
102f0 6d 20 74 68 69 73 0a 20 20 2a 2a 20 74 6f 20 6f  m this.  ** to o
10300 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 55 54 46  ne of SQLITE_UTF
10310 31 36 4c 45 20 6f 72 20 53 51 4c 49 54 45 5f 55  16LE or SQLITE_U
10320 54 46 31 36 42 45 20 75 73 69 6e 67 20 74 68 65  TF16BE using the
10330 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 55 54 46  .  ** SQLITE_UTF
10340 31 36 4e 41 54 49 56 45 20 6d 61 63 72 6f 2e 20  16NATIVE macro. 
10350 53 51 4c 49 54 45 5f 55 54 46 31 36 20 69 73 20  SQLITE_UTF16 is 
10360 6e 6f 74 20 75 73 65 64 20 69 6e 74 65 72 6e 61  not used interna
10370 6c 6c 79 2e 0a 20 20 2a 2f 0a 20 20 65 6e 63 32  lly..  */.  enc2
10380 20 3d 20 65 6e 63 3b 0a 20 20 74 65 73 74 63 61   = enc;.  testca
10390 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49 54 45  se( enc2==SQLITE
103a0 5f 55 54 46 31 36 20 29 3b 0a 20 20 74 65 73 74  _UTF16 );.  test
103b0 63 61 73 65 28 20 65 6e 63 32 3d 3d 53 51 4c 49  case( enc2==SQLI
103c0 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44  TE_UTF16_ALIGNED
103d0 20 29 3b 0a 20 20 69 66 28 20 65 6e 63 32 3d 3d   );.  if( enc2==
103e0 53 51 4c 49 54 45 5f 55 54 46 31 36 20 7c 7c 20  SQLITE_UTF16 || 
103f0 65 6e 63 32 3d 3d 53 51 4c 49 54 45 5f 55 54 46  enc2==SQLITE_UTF
10400 31 36 5f 41 4c 49 47 4e 45 44 20 29 7b 0a 20 20  16_ALIGNED ){.  
10410 20 20 65 6e 63 32 20 3d 20 53 51 4c 49 54 45 5f    enc2 = SQLITE_
10420 55 54 46 31 36 4e 41 54 49 56 45 3b 0a 20 20 7d  UTF16NATIVE;.  }
10430 0a 20 20 69 66 28 20 65 6e 63 32 3c 53 51 4c 49  .  if( enc2<SQLI
10440 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 32 3e  TE_UTF8 || enc2>
10450 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
10460 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
10470 49 54 45 5f 4d 49 53 55 53 45 5f 42 4b 50 54 3b  ITE_MISUSE_BKPT;
10480 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
10490 20 69 66 20 74 68 69 73 20 63 61 6c 6c 20 69 73   if this call is
104a0 20 72 65 6d 6f 76 69 6e 67 20 6f 72 20 72 65 70   removing or rep
104b0 6c 61 63 69 6e 67 20 61 6e 20 65 78 69 73 74 69  lacing an existi
104c0 6e 67 20 63 6f 6c 6c 61 74 69 6f 6e 20 0a 20 20  ng collation .  
104d0 2a 2a 20 73 65 71 75 65 6e 63 65 2e 20 49 66 20  ** sequence. If 
104e0 73 6f 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72  so, and there ar
104f0 65 20 61 63 74 69 76 65 20 56 4d 73 2c 20 72 65  e active VMs, re
10500 74 75 72 6e 20 62 75 73 79 2e 20 49 66 20 74 68  turn busy. If th
10510 65 72 65 0a 20 20 2a 2a 20 61 72 65 20 6e 6f 20  ere.  ** are no 
10520 61 63 74 69 76 65 20 56 4d 73 2c 20 69 6e 76 61  active VMs, inva
10530 6c 69 64 61 74 65 20 61 6e 79 20 70 72 65 2d 63  lidate any pre-c
10540 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e  ompiled statemen
10550 74 73 2e 0a 20 20 2a 2f 0a 20 20 70 43 6f 6c 6c  ts..  */.  pColl
10560 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
10570 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
10580 63 32 2c 20 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20  c2, zName, 0);. 
10590 20 69 66 28 20 70 43 6f 6c 6c 20 26 26 20 70 43   if( pColl && pC
105a0 6f 6c 6c 2d 3e 78 43 6d 70 20 29 7b 0a 20 20 20  oll->xCmp ){.   
105b0 20 69 66 28 20 64 62 2d 3e 6e 56 64 62 65 41 63   if( db->nVdbeAc
105c0 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 73 71  tive ){.      sq
105d0 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68 4d 73  lite3ErrorWithMs
105e0 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 42 55 53  g(db, SQLITE_BUS
105f0 59 2c 20 0a 20 20 20 20 20 20 20 20 22 75 6e 61  Y, .        "una
10600 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 2f 6d 6f  ble to delete/mo
10610 64 69 66 79 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  dify collation s
10620 65 71 75 65 6e 63 65 20 64 75 65 20 74 6f 20 61  equence due to a
10630 63 74 69 76 65 20 73 74 61 74 65 6d 65 6e 74 73  ctive statements
10640 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
10650 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
10660 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
10670 78 70 69 72 65 50 72 65 70 61 72 65 64 53 74 61  xpirePreparedSta
10680 74 65 6d 65 6e 74 73 28 64 62 29 3b 0a 20 20 20  tements(db);.   
10690 20 69 6e 76 61 6c 69 64 61 74 65 43 61 63 68 65   invalidateCache
106a0 64 4b 65 79 49 6e 66 6f 28 64 62 29 3b 0a 0a 20  dKeyInfo(db);.. 
106b0 20 20 20 2f 2a 20 49 66 20 63 6f 6c 6c 61 74 69     /* If collati
106c0 6f 6e 20 73 65 71 75 65 6e 63 65 20 70 43 6f 6c  on sequence pCol
106d0 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 64 69  l was created di
106e0 72 65 63 74 6c 79 20 62 79 20 61 20 63 61 6c 6c  rectly by a call
106f0 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
10700 65 33 5f 63 72 65 61 74 65 5f 63 6f 6c 6c 61 74  e3_create_collat
10710 69 6f 6e 2c 20 61 6e 64 20 6e 6f 74 20 67 65 6e  ion, and not gen
10720 65 72 61 74 65 64 20 62 79 20 73 79 6e 74 68 43  erated by synthC
10730 6f 6c 6c 53 65 71 28 29 2c 0a 20 20 20 20 2a 2a  ollSeq(),.    **
10740 20 74 68 65 6e 20 61 6e 79 20 63 6f 70 69 65 73   then any copies
10750 20 6d 61 64 65 20 62 79 20 73 79 6e 74 68 43 6f   made by synthCo
10760 6c 6c 53 65 71 28 29 20 6e 65 65 64 20 74 6f 20  llSeq() need to 
10770 62 65 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a  be invalidated..
10780 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 63 6f 6c      ** Also, col
10790 6c 61 74 69 6f 6e 20 64 65 73 74 72 75 63 74 6f  lation destructo
107a0 72 20 2d 20 43 6f 6c 6c 53 65 71 2e 78 44 65 6c  r - CollSeq.xDel
107b0 28 29 20 2d 20 66 75 6e 63 74 69 6f 6e 20 6d 61  () - function ma
107c0 79 20 6e 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f  y need.    ** to
107d0 20 62 65 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20   be called..    
107e0 2a 2f 20 0a 20 20 20 20 69 66 28 20 28 70 43 6f  */ .    if( (pCo
107f0 6c 6c 2d 3e 65 6e 63 20 26 20 7e 53 51 4c 49 54  ll->enc & ~SQLIT
10800 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e 45 44 29  E_UTF16_ALIGNED)
10810 3d 3d 65 6e 63 32 20 29 7b 0a 20 20 20 20 20 20  ==enc2 ){.      
10820 43 6f 6c 6c 53 65 71 20 2a 61 43 6f 6c 6c 20 3d  CollSeq *aColl =
10830 20 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64   sqlite3HashFind
10840 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71 2c 20  (&db->aCollSeq, 
10850 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 6e  zName);.      in
10860 74 20 6a 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  t j;.      for(j
10870 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b 0a 20  =0; j<3; j++){. 
10880 20 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a         CollSeq *
10890 70 20 3d 20 26 61 43 6f 6c 6c 5b 6a 5d 3b 0a 20  p = &aColl[j];. 
108a0 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e 65 6e         if( p->en
108b0 63 3d 3d 70 43 6f 6c 6c 2d 3e 65 6e 63 20 29 7b  c==pColl->enc ){
108c0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
108d0 2d 3e 78 44 65 6c 20 29 7b 0a 20 20 20 20 20 20  ->xDel ){.      
108e0 20 20 20 20 20 20 70 2d 3e 78 44 65 6c 28 70 2d        p->xDel(p-
108f0 3e 70 55 73 65 72 29 3b 0a 20 20 20 20 20 20 20  >pUser);.       
10900 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
10910 2d 3e 78 43 6d 70 20 3d 20 30 3b 0a 20 20 20 20  ->xCmp = 0;.    
10920 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10930 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 43 6f 6c 6c    }.  }..  pColl
10940 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
10950 6c 6c 53 65 71 28 64 62 2c 20 28 75 38 29 65 6e  llSeq(db, (u8)en
10960 63 32 2c 20 7a 4e 61 6d 65 2c 20 31 29 3b 0a 20  c2, zName, 1);. 
10970 20 69 66 28 20 70 43 6f 6c 6c 3d 3d 30 20 29 20   if( pColl==0 ) 
10980 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
10990 4d 45 4d 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78 43  MEM;.  pColl->xC
109a0 6d 70 20 3d 20 78 43 6f 6d 70 61 72 65 3b 0a 20  mp = xCompare;. 
109b0 20 70 43 6f 6c 6c 2d 3e 70 55 73 65 72 20 3d 20   pColl->pUser = 
109c0 70 43 74 78 3b 0a 20 20 70 43 6f 6c 6c 2d 3e 78  pCtx;.  pColl->x
109d0 44 65 6c 20 3d 20 78 44 65 6c 3b 0a 20 20 70 43  Del = xDel;.  pC
109e0 6f 6c 6c 2d 3e 65 6e 63 20 3d 20 28 75 38 29 28  oll->enc = (u8)(
109f0 65 6e 63 32 20 7c 20 28 65 6e 63 20 26 20 53 51  enc2 | (enc & SQ
10a00 4c 49 54 45 5f 55 54 46 31 36 5f 41 4c 49 47 4e  LITE_UTF16_ALIGN
10a10 45 44 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ED));.  sqlite3E
10a20 72 72 6f 72 28 64 62 2c 20 53 51 4c 49 54 45 5f  rror(db, SQLITE_
10a30 4f 4b 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  OK);.  return SQ
10a40 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a  LITE_OK;.}.../*.
10a50 2a 2a 20 54 68 69 73 20 61 72 72 61 79 20 64 65  ** This array de
10a60 66 69 6e 65 73 20 68 61 72 64 20 75 70 70 65 72  fines hard upper
10a70 20 62 6f 75 6e 64 73 20 6f 6e 20 6c 69 6d 69 74   bounds on limit
10a80 20 76 61 6c 75 65 73 2e 20 20 54 68 65 0a 2a 2a   values.  The.**
10a90 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 6d 75 73   initializer mus
10aa0 74 20 62 65 20 6b 65 70 74 20 69 6e 20 73 79 6e  t be kept in syn
10ab0 63 20 77 69 74 68 20 74 68 65 20 53 51 4c 49 54  c with the SQLIT
10ac0 45 5f 4c 49 4d 49 54 5f 2a 0a 2a 2a 20 23 64 65  E_LIMIT_*.** #de
10ad0 66 69 6e 65 73 20 69 6e 20 73 71 6c 69 74 65 33  fines in sqlite3
10ae0 2e 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  .h..*/.static co
10af0 6e 73 74 20 69 6e 74 20 61 48 61 72 64 4c 69 6d  nst int aHardLim
10b00 69 74 5b 5d 20 3d 20 7b 0a 20 20 53 51 4c 49 54  it[] = {.  SQLIT
10b10 45 5f 4d 41 58 5f 4c 45 4e 47 54 48 2c 0a 20 20  E_MAX_LENGTH,.  
10b20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c  SQLITE_MAX_SQL_L
10b30 45 4e 47 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f  ENGTH,.  SQLITE_
10b40 4d 41 58 5f 43 4f 4c 55 4d 4e 2c 0a 20 20 53 51  MAX_COLUMN,.  SQ
10b50 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45  LITE_MAX_EXPR_DE
10b60 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  PTH,.  SQLITE_MA
10b70 58 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  X_COMPOUND_SELEC
10b80 54 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f  T,.  SQLITE_MAX_
10b90 56 44 42 45 5f 4f 50 2c 0a 20 20 53 51 4c 49 54  VDBE_OP,.  SQLIT
10ba0 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41  E_MAX_FUNCTION_A
10bb0 52 47 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41 58  RG,.  SQLITE_MAX
10bc0 5f 41 54 54 41 43 48 45 44 2c 0a 20 20 53 51 4c  _ATTACHED,.  SQL
10bd0 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54  ITE_MAX_LIKE_PAT
10be0 54 45 52 4e 5f 4c 45 4e 47 54 48 2c 0a 20 20 53  TERN_LENGTH,.  S
10bf0 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42  QLITE_MAX_VARIAB
10c00 4c 45 5f 4e 55 4d 42 45 52 2c 20 20 20 20 20 20  LE_NUMBER,      
10c10 2f 2a 20 49 4d 50 3a 20 52 2d 33 38 30 39 31 2d  /* IMP: R-38091-
10c20 33 32 33 35 32 20 2a 2f 0a 20 20 53 51 4c 49 54  32352 */.  SQLIT
10c30 45 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45  E_MAX_TRIGGER_DE
10c40 50 54 48 2c 0a 20 20 53 51 4c 49 54 45 5f 4d 41  PTH,.  SQLITE_MA
10c50 58 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  X_WORKER_THREADS
10c60 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ,.};../*.** Make
10c70 20 73 75 72 65 20 74 68 65 20 68 61 72 64 20 6c   sure the hard l
10c80 69 6d 69 74 73 20 61 72 65 20 73 65 74 20 74 6f  imits are set to
10c90 20 72 65 61 73 6f 6e 61 62 6c 65 20 76 61 6c 75   reasonable valu
10ca0 65 73 0a 2a 2f 0a 23 69 66 20 53 51 4c 49 54 45  es.*/.#if SQLITE
10cb0 5f 4d 41 58 5f 4c 45 4e 47 54 48 3c 31 30 30 0a  _MAX_LENGTH<100.
10cc0 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d  # error SQLITE_M
10cd0 41 58 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 62  AX_LENGTH must b
10ce0 65 20 61 74 20 6c 65 61 73 74 20 31 30 30 0a 23  e at least 100.#
10cf0 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49 54 45  endif.#if SQLITE
10d00 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54 48 3c  _MAX_SQL_LENGTH<
10d10 31 30 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49  100.# error SQLI
10d20 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e 47 54  TE_MAX_SQL_LENGT
10d30 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  H must be at lea
10d40 73 74 20 31 30 30 0a 23 65 6e 64 69 66 0a 23 69  st 100.#endif.#i
10d50 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  f SQLITE_MAX_SQL
10d60 5f 4c 45 4e 47 54 48 3e 53 51 4c 49 54 45 5f 4d  _LENGTH>SQLITE_M
10d70 41 58 5f 4c 45 4e 47 54 48 0a 23 20 65 72 72 6f  AX_LENGTH.# erro
10d80 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 53 51 4c  r SQLITE_MAX_SQL
10d90 5f 4c 45 4e 47 54 48 20 6d 75 73 74 20 6e 6f 74  _LENGTH must not
10da0 20 62 65 20 67 72 65 61 74 65 72 20 74 68 61 6e   be greater than
10db0 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 45 4e 47   SQLITE_MAX_LENG
10dc0 54 48 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  TH.#endif.#if SQ
10dd0 4c 49 54 45 5f 4d 41 58 5f 43 4f 4d 50 4f 55 4e  LITE_MAX_COMPOUN
10de0 44 5f 53 45 4c 45 43 54 3c 32 0a 23 20 65 72 72  D_SELECT<2.# err
10df0 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  or SQLITE_MAX_CO
10e00 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 6d 75  MPOUND_SELECT mu
10e10 73 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 32  st be at least 2
10e20 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
10e30 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 3c 34  TE_MAX_VDBE_OP<4
10e40 30 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  0.# error SQLITE
10e50 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 6d 75 73  _MAX_VDBE_OP mus
10e60 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 34 30  t be at least 40
10e70 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
10e80 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f  TE_MAX_FUNCTION_
10e90 41 52 47 3c 30 20 7c 7c 20 53 51 4c 49 54 45 5f  ARG<0 || SQLITE_
10ea0 4d 41 58 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MAX_FUNCTION_ARG
10eb0 3e 31 30 30 30 0a 23 20 65 72 72 6f 72 20 53 51  >1000.# error SQ
10ec0 4c 49 54 45 5f 4d 41 58 5f 46 55 4e 43 54 49 4f  LITE_MAX_FUNCTIO
10ed0 4e 5f 41 52 47 20 6d 75 73 74 20 62 65 20 62 65  N_ARG must be be
10ee0 74 77 65 65 6e 20 30 20 61 6e 64 20 31 30 30 30  tween 0 and 1000
10ef0 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51 4c 49  .#endif.#if SQLI
10f00 54 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 3c  TE_MAX_ATTACHED<
10f10 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4d 41 58 5f  0 || SQLITE_MAX_
10f20 41 54 54 41 43 48 45 44 3e 31 32 35 0a 23 20 65  ATTACHED>125.# e
10f30 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
10f40 41 54 54 41 43 48 45 44 20 6d 75 73 74 20 62 65  ATTACHED must be
10f50 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20 31   between 0 and 1
10f60 32 35 0a 23 65 6e 64 69 66 0a 23 69 66 20 53 51  25.#endif.#if SQ
10f70 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41  LITE_MAX_LIKE_PA
10f80 54 54 45 52 4e 5f 4c 45 4e 47 54 48 3c 31 0a 23  TTERN_LENGTH<1.#
10f90 20 65 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41   error SQLITE_MA
10fa0 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  X_LIKE_PATTERN_L
10fb0 45 4e 47 54 48 20 6d 75 73 74 20 62 65 20 61 74  ENGTH must be at
10fc0 20 6c 65 61 73 74 20 31 0a 23 65 6e 64 69 66 0a   least 1.#endif.
10fd0 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  #if SQLITE_MAX_C
10fe0 4f 4c 55 4d 4e 3e 33 32 37 36 37 0a 23 20 65 72  OLUMN>32767.# er
10ff0 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f 43  ror SQLITE_MAX_C
11000 4f 4c 55 4d 4e 20 6d 75 73 74 20 6e 6f 74 20 65  OLUMN must not e
11010 78 63 65 65 64 20 33 32 37 36 37 0a 23 65 6e 64  xceed 32767.#end
11020 69 66 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  if.#if SQLITE_MA
11030 58 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 3c  X_TRIGGER_DEPTH<
11040 31 0a 23 20 65 72 72 6f 72 20 53 51 4c 49 54 45  1.# error SQLITE
11050 5f 4d 41 58 5f 54 52 49 47 47 45 52 5f 44 45 50  _MAX_TRIGGER_DEP
11060 54 48 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65  TH must be at le
11070 61 73 74 20 31 0a 23 65 6e 64 69 66 0a 23 69 66  ast 1.#endif.#if
11080 20 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b   SQLITE_MAX_WORK
11090 45 52 5f 54 48 52 45 41 44 53 3c 30 20 7c 7c 20  ER_THREADS<0 || 
110a0 53 51 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45  SQLITE_MAX_WORKE
110b0 52 5f 54 48 52 45 41 44 53 3e 35 30 0a 23 20 65  R_THREADS>50.# e
110c0 72 72 6f 72 20 53 51 4c 49 54 45 5f 4d 41 58 5f  rror SQLITE_MAX_
110d0 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 6d  WORKER_THREADS m
110e0 75 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 30  ust be between 0
110f0 20 61 6e 64 20 35 30 0a 23 65 6e 64 69 66 0a 0a   and 50.#endif..
11100 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
11110 65 20 76 61 6c 75 65 20 6f 66 20 61 20 6c 69 6d  e value of a lim
11120 69 74 2e 20 20 52 65 70 6f 72 74 20 74 68 65 20  it.  Report the 
11130 6f 6c 64 20 76 61 6c 75 65 2e 0a 2a 2a 20 49 66  old value..** If
11140 20 61 6e 20 69 6e 76 61 6c 69 64 20 6c 69 6d 69   an invalid limi
11150 74 20 69 6e 64 65 78 20 69 73 20 73 75 70 70 6c  t index is suppl
11160 69 65 64 2c 20 72 65 70 6f 72 74 20 2d 31 2e 0a  ied, report -1..
11170 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67  ** Make no chang
11180 65 73 20 62 75 74 20 73 74 69 6c 6c 20 72 65 70  es but still rep
11190 6f 72 74 20 74 68 65 20 6f 6c 64 20 76 61 6c 75  ort the old valu
111a0 65 20 69 66 20 74 68 65 0a 2a 2a 20 6e 65 77 20  e if the.** new 
111b0 6c 69 6d 69 74 20 69 73 20 6e 65 67 61 74 69 76  limit is negativ
111c0 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 6c  e..**.** A new l
111d0 6f 77 65 72 20 6c 69 6d 69 74 20 64 6f 65 73 20  ower limit does 
111e0 6e 6f 74 20 73 68 72 69 6e 6b 20 65 78 69 73 74  not shrink exist
111f0 69 6e 67 20 63 6f 6e 73 74 72 75 63 74 73 2e 0a  ing constructs..
11200 2a 2a 20 49 74 20 6d 65 72 65 6c 79 20 70 72 65  ** It merely pre
11210 76 65 6e 74 73 20 6e 65 77 20 63 6f 6e 73 74 72  vents new constr
11220 75 63 74 73 20 74 68 61 74 20 65 78 63 65 65 64  ucts that exceed
11230 20 74 68 65 20 6c 69 6d 69 74 0a 2a 2a 20 66 72   the limit.** fr
11240 6f 6d 20 66 6f 72 6d 69 6e 67 2e 0a 2a 2f 0a 69  om forming..*/.i
11250 6e 74 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74  nt sqlite3_limit
11260 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 69 6e  (sqlite3 *db, in
11270 74 20 6c 69 6d 69 74 49 64 2c 20 69 6e 74 20 6e  t limitId, int n
11280 65 77 4c 69 6d 69 74 29 7b 0a 20 20 69 6e 74 20  ewLimit){.  int 
11290 6f 6c 64 4c 69 6d 69 74 3b 0a 0a 0a 20 20 2f 2a  oldLimit;...  /*
112a0 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
112b0 33 30 31 38 39 2d 35 34 30 39 37 20 46 6f 72 20  30189-54097 For 
112c0 65 61 63 68 20 6c 69 6d 69 74 20 63 61 74 65 67  each limit categ
112d0 6f 72 79 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54  ory SQLITE_LIMIT
112e0 5f 4e 41 4d 45 0a 20 20 2a 2a 20 74 68 65 72 65  _NAME.  ** there
112f0 20 69 73 20 61 20 68 61 72 64 20 75 70 70 65 72   is a hard upper
11300 20 62 6f 75 6e 64 20 73 65 74 20 61 74 20 63 6f   bound set at co
11310 6d 70 69 6c 65 2d 74 69 6d 65 20 62 79 20 61 20  mpile-time by a 
11320 43 20 70 72 65 70 72 6f 63 65 73 73 6f 72 0a 20  C preprocessor. 
11330 20 2a 2a 20 6d 61 63 72 6f 20 63 61 6c 6c 65 64   ** macro called
11340 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4e 41 4d 45   SQLITE_MAX_NAME
11350 2e 20 28 54 68 65 20 22 5f 4c 49 4d 49 54 5f 22  . (The "_LIMIT_"
11360 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 69 73 20   in the name is 
11370 63 68 61 6e 67 65 64 20 74 6f 0a 20 20 2a 2a 20  changed to.  ** 
11380 22 5f 4d 41 58 5f 22 2e 29 0a 20 20 2a 2f 0a 20  "_MAX_".).  */. 
11390 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
113a0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
113b0 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51 4c 49 54 45  _LENGTH]==SQLITE
113c0 5f 4d 41 58 5f 4c 45 4e 47 54 48 20 29 3b 0a 20  _MAX_LENGTH );. 
113d0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
113e0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
113f0 5f 53 51 4c 5f 4c 45 4e 47 54 48 5d 3d 3d 53 51  _SQL_LENGTH]==SQ
11400 4c 49 54 45 5f 4d 41 58 5f 53 51 4c 5f 4c 45 4e  LITE_MAX_SQL_LEN
11410 47 54 48 20 29 3b 0a 20 20 61 73 73 65 72 74 28  GTH );.  assert(
11420 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
11430 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d  TE_LIMIT_COLUMN]
11440 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f 4c  ==SQLITE_MAX_COL
11450 55 4d 4e 20 29 3b 0a 20 20 61 73 73 65 72 74 28  UMN );.  assert(
11460 20 61 48 61 72 64 4c 69 6d 69 74 5b 53 51 4c 49   aHardLimit[SQLI
11470 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45  TE_LIMIT_EXPR_DE
11480 50 54 48 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58  PTH]==SQLITE_MAX
11490 5f 45 58 50 52 5f 44 45 50 54 48 20 29 3b 0a 20  _EXPR_DEPTH );. 
114a0 20 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69   assert( aHardLi
114b0 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
114c0 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54  _COMPOUND_SELECT
114d0 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 43 4f  ]==SQLITE_MAX_CO
114e0 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 29 3b 0a  MPOUND_SELECT);.
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 44 42 45 5f 4f 50 5d 3d 3d 53 51 4c 49  T_VDBE_OP]==SQLI
11520 54 45 5f 4d 41 58 5f 56 44 42 45 5f 4f 50 20 29  TE_MAX_VDBE_OP )
11530 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
11540 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
11550 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47  MIT_FUNCTION_ARG
11560 5d 3d 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 46 55  ]==SQLITE_MAX_FU
11570 4e 43 54 49 4f 4e 5f 41 52 47 20 29 3b 0a 20 20  NCTION_ARG );.  
11580 61 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d  assert( aHardLim
11590 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
115a0 41 54 54 41 43 48 45 44 5d 3d 3d 53 51 4c 49 54  ATTACHED]==SQLIT
115b0 45 5f 4d 41 58 5f 41 54 54 41 43 48 45 44 20 29  E_MAX_ATTACHED )
115c0 3b 0a 20 20 61 73 73 65 72 74 28 20 61 48 61 72  ;.  assert( aHar
115d0 64 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  dLimit[SQLITE_LI
115e0 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e  MIT_LIKE_PATTERN
115f0 5f 4c 45 4e 47 54 48 5d 3d 3d 0a 20 20 20 20 20  _LENGTH]==.     
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11620 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
11630 5f 4d 41 58 5f 4c 49 4b 45 5f 50 41 54 54 45 52  _MAX_LIKE_PATTER
11640 4e 5f 4c 45 4e 47 54 48 20 29 3b 0a 20 20 61 73  N_LENGTH );.  as
11650 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74  sert( aHardLimit
11660 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
11670 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 3d 3d  RIABLE_NUMBER]==
11680 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41  SQLITE_MAX_VARIA
11690 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20 61  BLE_NUMBER);.  a
116a0 73 73 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69  ssert( aHardLimi
116b0 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54  t[SQLITE_LIMIT_T
116c0 52 49 47 47 45 52 5f 44 45 50 54 48 5d 3d 3d 53  RIGGER_DEPTH]==S
116d0 51 4c 49 54 45 5f 4d 41 58 5f 54 52 49 47 47 45  QLITE_MAX_TRIGGE
116e0 52 5f 44 45 50 54 48 20 29 3b 0a 20 20 61 73 73  R_DEPTH );.  ass
116f0 65 72 74 28 20 61 48 61 72 64 4c 69 6d 69 74 5b  ert( aHardLimit[
11700 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52  SQLITE_LIMIT_WOR
11710 4b 45 52 5f 54 48 52 45 41 44 53 5d 3d 3d 53 51  KER_THREADS]==SQ
11720 4c 49 54 45 5f 4d 41 58 5f 57 4f 52 4b 45 52 5f  LITE_MAX_WORKER_
11730 54 48 52 45 41 44 53 20 29 3b 0a 20 20 61 73 73  THREADS );.  ass
11740 65 72 74 28 20 53 51 4c 49 54 45 5f 4c 49 4d 49  ert( SQLITE_LIMI
11750 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53  T_WORKER_THREADS
11760 3d 3d 28 53 51 4c 49 54 45 5f 4e 5f 4c 49 4d 49  ==(SQLITE_N_LIMI
11770 54 2d 31 29 20 29 3b 0a 0a 0a 20 20 69 66 28 20  T-1) );...  if( 
11780 6c 69 6d 69 74 49 64 3c 30 20 7c 7c 20 6c 69 6d  limitId<0 || lim
11790 69 74 49 64 3e 3d 53 51 4c 49 54 45 5f 4e 5f 4c  itId>=SQLITE_N_L
117a0 49 4d 49 54 20 29 7b 0a 20 20 20 20 72 65 74 75  IMIT ){.    retu
117b0 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 6f 6c 64  rn -1;.  }.  old
117c0 4c 69 6d 69 74 20 3d 20 64 62 2d 3e 61 4c 69 6d  Limit = db->aLim
117d0 69 74 5b 6c 69 6d 69 74 49 64 5d 3b 0a 20 20 69  it[limitId];.  i
117e0 66 28 20 6e 65 77 4c 69 6d 69 74 3e 3d 30 20 29  f( newLimit>=0 )
117f0 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {               
11800 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 32      /* IMP: R-52
11810 34 37 36 2d 32 38 37 33 32 20 2a 2f 0a 20 20 20  476-28732 */.   
11820 20 69 66 28 20 6e 65 77 4c 69 6d 69 74 3e 61 48   if( newLimit>aH
11830 61 72 64 4c 69 6d 69 74 5b 6c 69 6d 69 74 49 64  ardLimit[limitId
11840 5d 20 29 7b 0a 20 20 20 20 20 20 6e 65 77 4c 69  ] ){.      newLi
11850 6d 69 74 20 3d 20 61 48 61 72 64 4c 69 6d 69 74  mit = aHardLimit
11860 5b 6c 69 6d 69 74 49 64 5d 3b 20 20 2f 2a 20 49  [limitId];  /* I
11870 4d 50 3a 20 52 2d 35 31 34 36 33 2d 32 35 36 33  MP: R-51463-2563
11880 34 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64  4 */.    }.    d
11890 62 2d 3e 61 4c 69 6d 69 74 5b 6c 69 6d 69 74 49  b->aLimit[limitI
118a0 64 5d 20 3d 20 6e 65 77 4c 69 6d 69 74 3b 0a 20  d] = newLimit;. 
118b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f 6c 64 4c   }.  return oldL
118c0 69 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20  imit;           
118d0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50            /* IMP
118e0 3a 20 52 2d 35 33 33 34 31 2d 33 35 34 31 39 20  : R-53341-35419 
118f0 2a 2f 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  */.}../*.** This
11900 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
11910 64 20 74 6f 20 70 61 72 73 65 20 62 6f 74 68 20  d to parse both 
11920 55 52 49 73 20 61 6e 64 20 6e 6f 6e 2d 55 52 49  URIs and non-URI
11930 20 66 69 6c 65 6e 61 6d 65 73 20 70 61 73 73 65   filenames passe
11940 64 20 62 79 20 74 68 65 0a 2a 2a 20 75 73 65 72  d by the.** user
11950 20 74 6f 20 41 50 49 20 66 75 6e 63 74 69 6f 6e   to API function
11960 73 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 29  s sqlite3_open()
11970 20 6f 72 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e   or sqlite3_open
11980 5f 76 32 28 29 2c 20 61 6e 64 20 66 6f 72 20 64  _v2(), and for d
11990 61 74 61 62 61 73 65 0a 2a 2a 20 55 52 49 73 20  atabase.** URIs 
119a0 73 70 65 63 69 66 69 65 64 20 61 73 20 70 61 72  specified as par
119b0 74 20 6f 66 20 41 54 54 41 43 48 20 73 74 61 74  t of ATTACH stat
119c0 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  ements..**.** Th
119d0 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  e first argument
119e0 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f   to this functio
119f0 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  n is the name of
11a00 20 74 68 65 20 56 46 53 20 74 6f 20 75 73 65 20   the VFS to use 
11a10 28 6f 72 0a 2a 2a 20 61 20 4e 55 4c 4c 20 74 6f  (or.** a NULL to
11a20 20 73 69 67 6e 69 66 79 20 74 68 65 20 64 65 66   signify the def
11a30 61 75 6c 74 20 56 46 53 29 20 69 66 20 74 68 65  ault VFS) if the
11a40 20 55 52 49 20 64 6f 65 73 20 6e 6f 74 20 63 6f   URI does not co
11a50 6e 74 61 69 6e 20 61 20 22 76 66 73 3d 78 78 78  ntain a "vfs=xxx
11a60 22 0a 2a 2a 20 71 75 65 72 79 20 70 61 72 61 6d  ".** query param
11a70 65 74 65 72 2e 20 54 68 65 20 73 65 63 6f 6e 64  eter. The second
11a80 20 61 72 67 75 6d 65 6e 74 20 63 6f 6e 74 61 69   argument contai
11a90 6e 73 20 74 68 65 20 55 52 49 20 28 6f 72 20 6e  ns the URI (or n
11aa0 6f 6e 2d 55 52 49 20 66 69 6c 65 6e 61 6d 65 29  on-URI filename)
11ab0 0a 2a 2a 20 69 74 73 65 6c 66 2e 20 57 68 65 6e  .** itself. When
11ac0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
11ad0 73 20 63 61 6c 6c 65 64 20 74 68 65 20 2a 70 46  s called the *pF
11ae0 6c 61 67 73 20 76 61 72 69 61 62 6c 65 20 73 68  lags variable sh
11af0 6f 75 6c 64 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20  ould contain.** 
11b00 74 68 65 20 64 65 66 61 75 6c 74 20 66 6c 61 67  the default flag
11b10 73 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61  s to open the da
11b20 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 77 69  tabase handle wi
11b30 74 68 2e 20 54 68 65 20 76 61 6c 75 65 20 73 74  th. The value st
11b40 6f 72 65 64 20 69 6e 0a 2a 2a 20 2a 70 46 6c 61  ored in.** *pFla
11b50 67 73 20 6d 61 79 20 62 65 20 75 70 64 61 74 65  gs may be update
11b60 64 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  d before returni
11b70 6e 67 20 69 66 20 74 68 65 20 55 52 49 20 66 69  ng if the URI fi
11b80 6c 65 6e 61 6d 65 20 63 6f 6e 74 61 69 6e 73 20  lename contains 
11b90 0a 2a 2a 20 22 63 61 63 68 65 3d 78 78 78 22 20  .** "cache=xxx" 
11ba0 6f 72 20 22 6d 6f 64 65 3d 78 78 78 22 20 71 75  or "mode=xxx" qu
11bb0 65 72 79 20 70 61 72 61 6d 65 74 65 72 73 2e 0a  ery parameters..
11bc0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
11bd0 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
11be0 73 20 72 65 74 75 72 6e 65 64 2e 20 49 6e 20 74  s returned. In t
11bf0 68 69 73 20 63 61 73 65 20 2a 70 70 56 66 73 20  his case *ppVfs 
11c00 69 73 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  is set to point 
11c10 74 6f 0a 2a 2a 20 74 68 65 20 56 46 53 20 74 68  to.** the VFS th
11c20 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65  at should be use
11c30 64 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61  d to open the da
11c40 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 70 7a  tabase file. *pz
11c50 46 69 6c 65 20 69 73 20 73 65 74 20 74 6f 0a 2a  File is set to.*
11c60 2a 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  * point to a buf
11c70 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  fer containing t
11c80 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
11c90 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 20 49 74 20  ile to open. It 
11ca0 69 73 20 74 68 65 20 0a 2a 2a 20 72 65 73 70 6f  is the .** respo
11cb0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
11cc0 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
11cd0 75 61 6c 6c 79 20 63 61 6c 6c 20 73 71 6c 69 74  ually call sqlit
11ce0 65 33 5f 66 72 65 65 28 29 20 74 6f 20 72 65 6c  e3_free() to rel
11cf0 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66  ease.** this buf
11d00 66 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  fer..**.** If an
11d10 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
11d20 68 65 6e 20 61 6e 20 53 51 4c 69 74 65 20 65 72  hen an SQLite er
11d30 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
11d40 72 6e 65 64 20 61 6e 64 20 2a 70 7a 45 72 72 4d  rned and *pzErrM
11d50 73 67 0a 2a 2a 20 6d 61 79 20 62 65 20 73 65 74  sg.** may be set
11d60 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
11d70 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67  uffer containing
11d80 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67   an English lang
11d90 75 61 67 65 20 65 72 72 6f 72 20 0a 2a 2a 20 6d  uage error .** m
11da0 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
11db0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
11dc0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 20 74   of the caller t
11dd0 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20 72 65 6c  o eventually rel
11de0 65 61 73 65 0a 2a 2a 20 74 68 69 73 20 62 75 66  ease.** this buf
11df0 66 65 72 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  fer by calling s
11e00 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
11e10 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 72  /.int sqlite3Par
11e20 73 65 55 72 69 28 0a 20 20 63 6f 6e 73 74 20 63  seUri(.  const c
11e30 68 61 72 20 2a 7a 44 65 66 61 75 6c 74 56 66 73  har *zDefaultVfs
11e40 2c 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20  ,        /* VFS 
11e50 74 6f 20 75 73 65 20 69 66 20 6e 6f 20 22 76 66  to use if no "vf
11e60 73 3d 78 78 78 22 20 71 75 65 72 79 20 6f 70 74  s=xxx" query opt
11e70 69 6f 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ion */.  const c
11e80 68 61 72 20 2a 7a 55 72 69 2c 20 20 20 20 20 20  har *zUri,      
11e90 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6c 2d           /* Nul-
11ea0 74 65 72 6d 69 6e 61 74 65 64 20 55 52 49 20 74  terminated URI t
11eb0 6f 20 70 61 72 73 65 20 2a 2f 0a 20 20 75 6e 73  o parse */.  uns
11ec0 69 67 6e 65 64 20 69 6e 74 20 2a 70 46 6c 61 67  igned int *pFlag
11ed0 73 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  s,           /* 
11ee0 49 4e 2f 4f 55 54 3a 20 53 51 4c 49 54 45 5f 4f  IN/OUT: SQLITE_O
11ef0 50 45 4e 5f 58 58 58 20 66 6c 61 67 73 20 2a 2f  PEN_XXX flags */
11f00 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
11f10 2a 70 70 56 66 73 2c 20 20 20 20 20 20 20 20 20  *ppVfs,         
11f20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 46 53 20 74     /* OUT: VFS t
11f30 6f 20 75 73 65 20 2a 2f 20 0a 20 20 63 68 61 72  o use */ .  char
11f40 20 2a 2a 70 7a 46 69 6c 65 2c 20 20 20 20 20 20   **pzFile,      
11f50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
11f60 55 54 3a 20 46 69 6c 65 6e 61 6d 65 20 63 6f 6d  UT: Filename com
11f70 70 6f 6e 65 6e 74 20 6f 66 20 55 52 49 20 2a 2f  ponent of URI */
11f80 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 4d  .  char **pzErrM
11f90 73 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  sg              
11fa0 20 20 20 2f 2a 20 4f 55 54 3a 20 45 72 72 6f 72     /* OUT: Error
11fb0 20 6d 65 73 73 61 67 65 20 28 69 66 20 72 63 21   message (if rc!
11fc0 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 2a 2f 0a 29  =SQLITE_OK) */.)
11fd0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
11fe0 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e  ITE_OK;.  unsign
11ff0 65 64 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 2a  ed int flags = *
12000 70 46 6c 61 67 73 3b 0a 20 20 63 6f 6e 73 74 20  pFlags;.  const 
12010 63 68 61 72 20 2a 7a 56 66 73 20 3d 20 7a 44 65  char *zVfs = zDe
12020 66 61 75 6c 74 56 66 73 3b 0a 20 20 63 68 61 72  faultVfs;.  char
12030 20 2a 7a 46 69 6c 65 3b 0a 20 20 63 68 61 72 20   *zFile;.  char 
12040 63 3b 0a 20 20 69 6e 74 20 6e 55 72 69 20 3d 20  c;.  int nUri = 
12050 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
12060 7a 55 72 69 29 3b 0a 0a 20 20 61 73 73 65 72 74  zUri);..  assert
12070 28 20 2a 70 7a 45 72 72 4d 73 67 3d 3d 30 20 29  ( *pzErrMsg==0 )
12080 3b 0a 0a 20 20 69 66 28 20 28 28 66 6c 61 67 73  ;..  if( ((flags
12090 20 26 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55   & SQLITE_OPEN_U
120a0 52 49 29 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c  RI) || sqlite3Gl
120b0 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 4f 70 65 6e  obalConfig.bOpen
120c0 55 72 69 29 20 0a 20 20 20 26 26 20 6e 55 72 69  Uri) .   && nUri
120d0 3e 3d 35 20 26 26 20 6d 65 6d 63 6d 70 28 7a 55  >=5 && memcmp(zU
120e0 72 69 2c 20 22 66 69 6c 65 3a 22 2c 20 35 29 3d  ri, "file:", 5)=
120f0 3d 30 20 2f 2a 20 49 4d 50 3a 20 52 2d 35 37 38  =0 /* IMP: R-578
12100 38 34 2d 33 37 34 39 36 20 2a 2f 0a 20 20 29 7b  84-37496 */.  ){
12110 0a 20 20 20 20 63 68 61 72 20 2a 7a 4f 70 74 3b  .    char *zOpt;
12120 0a 20 20 20 20 69 6e 74 20 65 53 74 61 74 65 3b  .    int eState;
12130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12140 20 20 20 2f 2a 20 50 61 72 73 65 72 20 73 74 61     /* Parser sta
12150 74 65 20 77 68 65 6e 20 70 61 72 73 69 6e 67 20  te when parsing 
12160 55 52 49 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  URI */.    int i
12170 49 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  In;             
12180 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75           /* Inpu
12190 74 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65  t character inde
121a0 78 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4f 75  x */.    int iOu
121b0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
121c0 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
121d0 20 63 68 61 72 61 63 74 65 72 20 69 6e 64 65 78   character index
121e0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74   */.    int nByt
121f0 65 20 3d 20 6e 55 72 69 2b 32 3b 20 20 20 20 20  e = nUri+2;     
12200 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20 6f        /* Bytes o
12210 66 20 73 70 61 63 65 20 74 6f 20 61 6c 6c 6f 63  f space to alloc
12220 61 74 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 4d  ate */..    /* M
12230 61 6b 65 20 73 75 72 65 20 74 68 65 20 53 51 4c  ake sure the SQL
12240 49 54 45 5f 4f 50 45 4e 5f 55 52 49 20 66 6c 61  ITE_OPEN_URI fla
12250 67 20 69 73 20 73 65 74 20 74 6f 20 69 6e 64 69  g is set to indi
12260 63 61 74 65 20 74 6f 20 74 68 65 20 56 46 53 20  cate to the VFS 
12270 78 4f 70 65 6e 20 0a 20 20 20 20 2a 2a 20 6d 65  xOpen .    ** me
12280 74 68 6f 64 20 74 68 61 74 20 74 68 65 72 65 20  thod that there 
12290 6d 61 79 20 62 65 20 65 78 74 72 61 20 70 61 72  may be extra par
122a0 61 6d 65 74 65 72 73 20 66 6f 6c 6c 6f 77 69 6e  ameters followin
122b0 67 20 74 68 65 20 66 69 6c 65 2d 6e 61 6d 65 2e  g the file-name.
122c0 20 20 2a 2f 0a 20 20 20 20 66 6c 61 67 73 20 7c    */.    flags |
122d0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 55 52  = SQLITE_OPEN_UR
122e0 49 3b 0a 0a 20 20 20 20 66 6f 72 28 69 49 6e 3d  I;..    for(iIn=
122f0 30 3b 20 69 49 6e 3c 6e 55 72 69 3b 20 69 49 6e  0; iIn<nUri; iIn
12300 2b 2b 29 20 6e 42 79 74 65 20 2b 3d 20 28 7a 55  ++) nByte += (zU
12310 72 69 5b 69 49 6e 5d 3d 3d 27 26 27 29 3b 0a 20  ri[iIn]=='&');. 
12320 20 20 20 7a 46 69 6c 65 20 3d 20 73 71 6c 69 74     zFile = sqlit
12330 65 33 5f 6d 61 6c 6c 6f 63 28 6e 42 79 74 65 29  e3_malloc(nByte)
12340 3b 0a 20 20 20 20 69 66 28 20 21 7a 46 69 6c 65  ;.    if( !zFile
12350 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
12360 5f 4e 4f 4d 45 4d 3b 0a 0a 20 20 20 20 69 49 6e  _NOMEM;..    iIn
12370 20 3d 20 35 3b 0a 23 69 66 6e 64 65 66 20 53 51   = 5;.#ifndef SQ
12380 4c 49 54 45 5f 41 4c 4c 4f 57 5f 55 52 49 5f 41  LITE_ALLOW_URI_A
12390 55 54 48 4f 52 49 54 59 0a 20 20 20 20 2f 2a 20  UTHORITY.    /* 
123a0 44 69 73 63 61 72 64 20 74 68 65 20 73 63 68 65  Discard the sche
123b0 6d 65 20 61 6e 64 20 61 75 74 68 6f 72 69 74 79  me and authority
123c0 20 73 65 67 6d 65 6e 74 73 20 6f 66 20 74 68 65   segments of the
123d0 20 55 52 49 2e 20 2a 2f 0a 20 20 20 20 69 66 28   URI. */.    if(
123e0 20 7a 55 72 69 5b 35 5d 3d 3d 27 2f 27 20 26 26   zUri[5]=='/' &&
123f0 20 7a 55 72 69 5b 36 5d 3d 3d 27 2f 27 20 29 7b   zUri[6]=='/' ){
12400 0a 20 20 20 20 20 20 69 49 6e 20 3d 20 37 3b 0a  .      iIn = 7;.
12410 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 55 72        while( zUr
12420 69 5b 69 49 6e 5d 20 26 26 20 7a 55 72 69 5b 69  i[iIn] && zUri[i
12430 49 6e 5d 21 3d 27 2f 27 20 29 20 69 49 6e 2b 2b  In]!='/' ) iIn++
12440 3b 0a 20 20 20 20 20 20 69 66 28 20 69 49 6e 21  ;.      if( iIn!
12450 3d 37 20 26 26 20 28 69 49 6e 21 3d 31 36 20 7c  =7 && (iIn!=16 |
12460 7c 20 6d 65 6d 63 6d 70 28 22 6c 6f 63 61 6c 68  | memcmp("localh
12470 6f 73 74 22 2c 20 26 7a 55 72 69 5b 37 5d 2c 20  ost", &zUri[7], 
12480 39 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  9)) ){.        *
12490 70 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74  pzErrMsg = sqlit
124a0 65 33 5f 6d 70 72 69 6e 74 66 28 22 69 6e 76 61  e3_mprintf("inva
124b0 6c 69 64 20 75 72 69 20 61 75 74 68 6f 72 69 74  lid uri authorit
124c0 79 3a 20 25 2e 2a 73 22 2c 20 0a 20 20 20 20 20  y: %.*s", .     
124d0 20 20 20 20 20 20 20 69 49 6e 2d 37 2c 20 26 7a         iIn-7, &z
124e0 55 72 69 5b 37 5d 29 3b 0a 20 20 20 20 20 20 20  Uri[7]);.       
124f0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
12500 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  OR;.        goto
12510 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a   parse_uri_out;.
12520 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65        }.    }.#e
12530 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 43 6f 70  ndif..    /* Cop
12540 79 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 61  y the filename a
12550 6e 64 20 61 6e 79 20 71 75 65 72 79 20 70 61 72  nd any query par
12560 61 6d 65 74 65 72 73 20 69 6e 74 6f 20 74 68 65  ameters into the
12570 20 7a 46 69 6c 65 20 62 75 66 66 65 72 2e 20 0a   zFile buffer. .
12580 20 20 20 20 2a 2a 20 44 65 63 6f 64 65 20 25 48      ** Decode %H
12590 48 20 65 73 63 61 70 65 20 63 6f 64 65 73 20 61  H escape codes a
125a0 6c 6f 6e 67 20 74 68 65 20 77 61 79 2e 20 0a 20  long the way. . 
125b0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 57 69 74     **.    ** Wit
125c0 68 69 6e 20 74 68 69 73 20 6c 6f 6f 70 2c 20 76  hin this loop, v
125d0 61 72 69 61 62 6c 65 20 65 53 74 61 74 65 20 6d  ariable eState m
125e0 61 79 20 62 65 20 73 65 74 20 74 6f 20 30 2c 20  ay be set to 0, 
125f0 31 20 6f 72 20 32 2c 20 64 65 70 65 6e 64 69 6e  1 or 2, dependin
12600 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20  g.    ** on the 
12610 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e  parsing context.
12620 20 41 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 20   As follows:.   
12630 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 30 3a 20   **.    **   0: 
12640 50 61 72 73 69 6e 67 20 66 69 6c 65 2d 6e 61 6d  Parsing file-nam
12650 65 2e 0a 20 20 20 20 2a 2a 20 20 20 31 3a 20 50  e..    **   1: P
12660 61 72 73 69 6e 67 20 6e 61 6d 65 20 73 65 63 74  arsing name sect
12670 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65 3d 76 61  ion of a name=va
12680 6c 75 65 20 71 75 65 72 79 20 70 61 72 61 6d 65  lue query parame
12690 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 20 32 3a  ter..    **   2:
126a0 20 50 61 72 73 69 6e 67 20 76 61 6c 75 65 20 73   Parsing value s
126b0 65 63 74 69 6f 6e 20 6f 66 20 61 20 6e 61 6d 65  ection of a name
126c0 3d 76 61 6c 75 65 20 71 75 65 72 79 20 70 61 72  =value query par
126d0 61 6d 65 74 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  ameter..    */. 
126e0 20 20 20 65 53 74 61 74 65 20 3d 20 30 3b 0a 20     eState = 0;. 
126f0 20 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 7a     while( (c = z
12700 55 72 69 5b 69 49 6e 5d 29 21 3d 30 20 26 26 20  Uri[iIn])!=0 && 
12710 63 21 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20  c!='#' ){.      
12720 69 49 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  iIn++;.      if(
12730 20 63 3d 3d 27 25 27 20 0a 20 20 20 20 20 20 20   c=='%' .       
12740 26 26 20 73 71 6c 69 74 65 33 49 73 78 64 69 67  && sqlite3Isxdig
12750 69 74 28 7a 55 72 69 5b 69 49 6e 5d 29 20 0a 20  it(zUri[iIn]) . 
12760 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
12770 49 73 78 64 69 67 69 74 28 7a 55 72 69 5b 69 49  Isxdigit(zUri[iI
12780 6e 2b 31 5d 29 20 0a 20 20 20 20 20 20 29 7b 0a  n+1]) .      ){.
12790 20 20 20 20 20 20 20 20 69 6e 74 20 6f 63 74 65          int octe
127a0 74 20 3d 20 28 73 71 6c 69 74 65 33 48 65 78 54  t = (sqlite3HexT
127b0 6f 49 6e 74 28 7a 55 72 69 5b 69 49 6e 2b 2b 5d  oInt(zUri[iIn++]
127c0 29 20 3c 3c 20 34 29 3b 0a 20 20 20 20 20 20 20  ) << 4);.       
127d0 20 6f 63 74 65 74 20 2b 3d 20 73 71 6c 69 74 65   octet += sqlite
127e0 33 48 65 78 54 6f 49 6e 74 28 7a 55 72 69 5b 69  3HexToInt(zUri[i
127f0 49 6e 2b 2b 5d 29 3b 0a 0a 20 20 20 20 20 20 20  In++]);..       
12800 20 61 73 73 65 72 74 28 20 6f 63 74 65 74 3e 3d   assert( octet>=
12810 30 20 26 26 20 6f 63 74 65 74 3c 32 35 36 20 29  0 && octet<256 )
12820 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6f 63  ;.        if( oc
12830 74 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tet==0 ){.      
12840 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e      /* This bran
12850 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e  ch is taken when
12860 20 22 25 30 30 22 20 61 70 70 65 61 72 73 20 77   "%00" appears w
12870 69 74 68 69 6e 20 74 68 65 20 55 52 49 2e 20 49  ithin the URI. I
12880 6e 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 20  n this.         
12890 20 2a 2a 20 63 61 73 65 20 77 65 20 69 67 6e 6f   ** case we igno
128a0 72 65 20 61 6c 6c 20 74 65 78 74 20 69 6e 20 74  re all text in t
128b0 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20  he remainder of 
128c0 74 68 65 20 70 61 74 68 2c 20 6e 61 6d 65 20 6f  the path, name o
128d0 72 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 76  r.          ** v
128e0 61 6c 75 65 20 63 75 72 72 65 6e 74 6c 79 20 62  alue currently b
128f0 65 69 6e 67 20 70 61 72 73 65 64 2e 20 53 6f 20  eing parsed. So 
12900 69 67 6e 6f 72 65 20 74 68 65 20 63 75 72 72 65  ignore the curre
12910 6e 74 20 63 68 61 72 61 63 74 65 72 0a 20 20 20  nt character.   
12920 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 73 6b         ** and sk
12930 69 70 20 74 6f 20 74 68 65 20 6e 65 78 74 20 22  ip to the next "
12940 3f 22 2c 20 22 3d 22 20 6f 72 20 22 26 22 2c 20  ?", "=" or "&", 
12950 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
12960 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  */.          whi
12970 6c 65 28 20 28 63 20 3d 20 7a 55 72 69 5b 69 49  le( (c = zUri[iI
12980 6e 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 23 27  n])!=0 && c!='#'
12990 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
129a0 26 26 20 28 65 53 74 61 74 65 21 3d 30 20 7c 7c  && (eState!=0 ||
129b0 20 63 21 3d 27 3f 27 29 0a 20 20 20 20 20 20 20   c!='?').       
129c0 20 20 20 20 20 20 20 26 26 20 28 65 53 74 61 74         && (eStat
129d0 65 21 3d 31 20 7c 7c 20 28 63 21 3d 27 3d 27 20  e!=1 || (c!='=' 
129e0 26 26 20 63 21 3d 27 26 27 29 29 0a 20 20 20 20  && c!='&')).    
129f0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 65 53            && (eS
12a00 74 61 74 65 21 3d 32 20 7c 7c 20 63 21 3d 27 26  tate!=2 || c!='&
12a10 27 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  ').          ){.
12a20 20 20 20 20 20 20 20 20 20 20 20 20 69 49 6e 2b              iIn+
12a30 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  +;.          }. 
12a40 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
12a50 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
12a60 20 20 20 20 20 63 20 3d 20 6f 63 74 65 74 3b 0a       c = octet;.
12a70 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
12a80 65 53 74 61 74 65 3d 3d 31 20 26 26 20 28 63 3d  eState==1 && (c=
12a90 3d 27 26 27 20 7c 7c 20 63 3d 3d 27 3d 27 29 20  ='&' || c=='=') 
12aa0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
12ab0 46 69 6c 65 5b 69 4f 75 74 2d 31 5d 3d 3d 30 20  File[iOut-1]==0 
12ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
12ad0 41 6e 20 65 6d 70 74 79 20 6f 70 74 69 6f 6e 20  An empty option 
12ae0 6e 61 6d 65 2e 20 49 67 6e 6f 72 65 20 74 68 69  name. Ignore thi
12af0 73 20 6f 70 74 69 6f 6e 20 61 6c 74 6f 67 65 74  s option altoget
12b00 68 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  her. */.        
12b10 20 20 77 68 69 6c 65 28 20 7a 55 72 69 5b 69 49    while( zUri[iI
12b20 6e 5d 20 26 26 20 7a 55 72 69 5b 69 49 6e 5d 21  n] && zUri[iIn]!
12b30 3d 27 23 27 20 26 26 20 7a 55 72 69 5b 69 49 6e  ='#' && zUri[iIn
12b40 2d 31 5d 21 3d 27 26 27 20 29 20 69 49 6e 2b 2b  -1]!='&' ) iIn++
12b50 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
12b60 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
12b70 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
12b80 26 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  &' ){.          
12b90 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20  zFile[iOut++] = 
12ba0 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 20 7d 65  '\0';.        }e
12bb0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 65  lse{.          e
12bc0 53 74 61 74 65 20 3d 20 32 3b 0a 20 20 20 20 20  State = 2;.     
12bd0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 20 3d     }.        c =
12be0 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   0;.      }else 
12bf0 69 66 28 20 28 65 53 74 61 74 65 3d 3d 30 20 26  if( (eState==0 &
12c00 26 20 63 3d 3d 27 3f 27 29 20 7c 7c 20 28 65 53  & c=='?') || (eS
12c10 74 61 74 65 3d 3d 32 20 26 26 20 63 3d 3d 27 26  tate==2 && c=='&
12c20 27 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  ') ){.        c 
12c30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 65 53 74  = 0;.        eSt
12c40 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ate = 1;.      }
12c50 0a 20 20 20 20 20 20 7a 46 69 6c 65 5b 69 4f 75  .      zFile[iOu
12c60 74 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 7d 0a  t++] = c;.    }.
12c70 20 20 20 20 69 66 28 20 65 53 74 61 74 65 3d 3d      if( eState==
12c80 31 20 29 20 7a 46 69 6c 65 5b 69 4f 75 74 2b 2b  1 ) zFile[iOut++
12c90 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 7a 46  ] = '\0';.    zF
12ca0 69 6c 65 5b 69 4f 75 74 2b 2b 5d 20 3d 20 27 5c  ile[iOut++] = '\
12cb0 30 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 69 4f  0';.    zFile[iO
12cc0 75 74 2b 2b 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  ut++] = '\0';.. 
12cd0 20 20 20 2f 2a 20 43 68 65 63 6b 20 69 66 20 74     /* Check if t
12ce0 68 65 72 65 20 77 65 72 65 20 61 6e 79 20 6f 70  here were any op
12cf0 74 69 6f 6e 73 20 73 70 65 63 69 66 69 65 64 20  tions specified 
12d00 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 69  that should be i
12d10 6e 74 65 72 70 72 65 74 65 64 20 0a 20 20 20 20  nterpreted .    
12d20 2a 2a 20 68 65 72 65 2e 20 4f 70 74 69 6f 6e 73  ** here. Options
12d30 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 72 70   that are interp
12d40 72 65 74 65 64 20 68 65 72 65 20 69 6e 63 6c 75  reted here inclu
12d50 64 65 20 22 76 66 73 22 20 61 6e 64 20 74 68 6f  de "vfs" and tho
12d60 73 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 63  se that.    ** c
12d70 6f 72 72 65 73 70 6f 6e 64 20 74 6f 20 66 6c 61  orrespond to fla
12d80 67 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 70  gs that may be p
12d90 61 73 73 65 64 20 74 6f 20 74 68 65 20 73 71 6c  assed to the sql
12da0 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 29 0a 20  ite3_open_v2(). 
12db0 20 20 20 2a 2a 20 6d 65 74 68 6f 64 2e 20 2a 2f     ** method. */
12dc0 0a 20 20 20 20 7a 4f 70 74 20 3d 20 26 7a 46 69  .    zOpt = &zFi
12dd0 6c 65 5b 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  le[sqlite3Strlen
12de0 33 30 28 7a 46 69 6c 65 29 2b 31 5d 3b 0a 20 20  30(zFile)+1];.  
12df0 20 20 77 68 69 6c 65 28 20 7a 4f 70 74 5b 30 5d    while( zOpt[0]
12e00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4f   ){.      int nO
12e10 70 74 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  pt = sqlite3Strl
12e20 65 6e 33 30 28 7a 4f 70 74 29 3b 0a 20 20 20 20  en30(zOpt);.    
12e30 20 20 63 68 61 72 20 2a 7a 56 61 6c 20 3d 20 26    char *zVal = &
12e40 7a 4f 70 74 5b 6e 4f 70 74 2b 31 5d 3b 0a 20 20  zOpt[nOpt+1];.  
12e50 20 20 20 20 69 6e 74 20 6e 56 61 6c 20 3d 20 73      int nVal = s
12e60 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a  qlite3Strlen30(z
12e70 56 61 6c 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  Val);..      if(
12e80 20 6e 4f 70 74 3d 3d 33 20 26 26 20 6d 65 6d 63   nOpt==3 && memc
12e90 6d 70 28 22 76 66 73 22 2c 20 7a 4f 70 74 2c 20  mp("vfs", zOpt, 
12ea0 33 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  3)==0 ){.       
12eb0 20 7a 56 66 73 20 3d 20 7a 56 61 6c 3b 0a 20 20   zVfs = zVal;.  
12ec0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12ed0 20 20 20 73 74 72 75 63 74 20 4f 70 65 6e 4d 6f     struct OpenMo
12ee0 64 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 63  de {.          c
12ef0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
12f00 20 20 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65          int mode
12f10 3b 0a 20 20 20 20 20 20 20 20 7d 20 2a 61 4d 6f  ;.        } *aMo
12f20 64 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  de = 0;.        
12f30 63 68 61 72 20 2a 7a 4d 6f 64 65 54 79 70 65 20  char *zModeType 
12f40 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
12f50 20 6d 61 73 6b 20 3d 20 30 3b 0a 20 20 20 20 20   mask = 0;.     
12f60 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 30     int limit = 0
12f70 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ;..        if( n
12f80 4f 70 74 3d 3d 35 20 26 26 20 6d 65 6d 63 6d 70  Opt==5 && memcmp
12f90 28 22 63 61 63 68 65 22 2c 20 7a 4f 70 74 2c 20  ("cache", zOpt, 
12fa0 35 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  5)==0 ){.       
12fb0 20 20 20 73 74 61 74 69 63 20 73 74 72 75 63 74     static struct
12fc0 20 4f 70 65 6e 4d 6f 64 65 20 61 43 61 63 68 65   OpenMode aCache
12fd0 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  Mode[] = {.     
12fe0 20 20 20 20 20 20 20 7b 20 22 73 68 61 72 65 64         { "shared
12ff0 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
13000 53 48 41 52 45 44 43 41 43 48 45 20 7d 2c 0a 20  SHAREDCACHE },. 
13010 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 70 72             { "pr
13020 69 76 61 74 65 22 2c 20 53 51 4c 49 54 45 5f 4f  ivate", SQLITE_O
13030 50 45 4e 5f 50 52 49 56 41 54 45 43 41 43 48 45  PEN_PRIVATECACHE
13040 20 7d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   },.            
13050 7b 20 30 2c 20 30 20 7d 0a 20 20 20 20 20 20 20  { 0, 0 }.       
13060 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 20     };..         
13070 20 6d 61 73 6b 20 3d 20 53 51 4c 49 54 45 5f 4f   mask = SQLITE_O
13080 50 45 4e 5f 53 48 41 52 45 44 43 41 43 48 45 7c  PEN_SHAREDCACHE|
13090 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52 49 56  SQLITE_OPEN_PRIV
130a0 41 54 45 43 41 43 48 45 3b 0a 20 20 20 20 20 20  ATECACHE;.      
130b0 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 43 61 63      aMode = aCac
130c0 68 65 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  heMode;.        
130d0 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 3b 0a    limit = mask;.
130e0 20 20 20 20 20 20 20 20 20 20 7a 4d 6f 64 65 54            zModeT
130f0 79 70 65 20 3d 20 22 63 61 63 68 65 22 3b 0a 20  ype = "cache";. 
13100 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13110 20 69 66 28 20 6e 4f 70 74 3d 3d 34 20 26 26 20   if( nOpt==4 && 
13120 6d 65 6d 63 6d 70 28 22 6d 6f 64 65 22 2c 20 7a  memcmp("mode", z
13130 4f 70 74 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20  Opt, 4)==0 ){.  
13140 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 73          static s
13150 74 72 75 63 74 20 4f 70 65 6e 4d 6f 64 65 20 61  truct OpenMode a
13160 4f 70 65 6e 4d 6f 64 65 5b 5d 20 3d 20 7b 0a 20  OpenMode[] = {. 
13170 20 20 20 20 20 20 20 20 20 20 20 7b 20 22 72 6f             { "ro
13180 22 2c 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ",  SQLITE_OPEN_
13190 52 45 41 44 4f 4e 4c 59 20 7d 2c 0a 20 20 20 20  READONLY },.    
131a0 20 20 20 20 20 20 20 20 7b 20 22 72 77 22 2c 20          { "rw", 
131b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
131c0 44 57 52 49 54 45 20 7d 2c 20 0a 20 20 20 20 20  DWRITE }, .     
131d0 20 20 20 20 20 20 20 7b 20 22 72 77 63 22 2c 20         { "rwc", 
131e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
131f0 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
13200 50 45 4e 5f 43 52 45 41 54 45 20 7d 2c 0a 20 20  PEN_CREATE },.  
13210 20 20 20 20 20 20 20 20 20 20 7b 20 22 6d 65 6d            { "mem
13220 6f 72 79 22 2c 20 53 51 4c 49 54 45 5f 4f 50 45  ory", SQLITE_OPE
13230 4e 5f 4d 45 4d 4f 52 59 20 7d 2c 0a 20 20 20 20  N_MEMORY },.    
13240 20 20 20 20 20 20 20 20 7b 20 30 2c 20 30 20 7d          { 0, 0 }
13250 0a 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 0a 20  .          };.. 
13260 20 20 20 20 20 20 20 20 20 6d 61 73 6b 20 3d 20           mask = 
13270 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
13280 4f 4e 4c 59 20 7c 20 53 51 4c 49 54 45 5f 4f 50  ONLY | SQLITE_OP
13290 45 4e 5f 52 45 41 44 57 52 49 54 45 0a 20 20 20  EN_READWRITE.   
132a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
132b0 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52  | SQLITE_OPEN_CR
132c0 45 41 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  EATE | SQLITE_OP
132d0 45 4e 5f 4d 45 4d 4f 52 59 3b 0a 20 20 20 20 20  EN_MEMORY;.     
132e0 20 20 20 20 20 61 4d 6f 64 65 20 3d 20 61 4f 70       aMode = aOp
132f0 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  enMode;.        
13300 20 20 6c 69 6d 69 74 20 3d 20 6d 61 73 6b 20 26    limit = mask &
13310 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20   flags;.        
13320 20 20 7a 4d 6f 64 65 54 79 70 65 20 3d 20 22 61    zModeType = "a
13330 63 63 65 73 73 22 3b 0a 20 20 20 20 20 20 20 20  ccess";.        
13340 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  }..        if( a
13350 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Mode ){.        
13360 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
13370 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 30 3b     int mode = 0;
13380 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
13390 3d 30 3b 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 20  =0; aMode[i].z; 
133a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
133b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
133c0 3d 20 61 4d 6f 64 65 5b 69 5d 2e 7a 3b 0a 20 20  = aMode[i].z;.  
133d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 56            if( nV
133e0 61 6c 3d 3d 73 71 6c 69 74 65 33 53 74 72 6c 65  al==sqlite3Strle
133f0 6e 33 30 28 7a 29 20 26 26 20 30 3d 3d 6d 65 6d  n30(z) && 0==mem
13400 63 6d 70 28 7a 56 61 6c 2c 20 7a 2c 20 6e 56 61  cmp(zVal, z, nVa
13410 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
13420 20 20 20 20 6d 6f 64 65 20 3d 20 61 4d 6f 64 65      mode = aMode
13430 5b 69 5d 2e 6d 6f 64 65 3b 0a 20 20 20 20 20 20  [i].mode;.      
13440 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
13450 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
13460 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13470 20 20 20 69 66 28 20 6d 6f 64 65 3d 3d 30 20 29     if( mode==0 )
13480 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
13490 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
134a0 33 5f 6d 70 72 69 6e 74 66 28 22 6e 6f 20 73 75  3_mprintf("no su
134b0 63 68 20 25 73 20 6d 6f 64 65 3a 20 25 73 22 2c  ch %s mode: %s",
134c0 20 7a 4d 6f 64 65 54 79 70 65 2c 20 7a 56 61 6c   zModeType, zVal
134d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
134e0 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
134f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
13500 74 6f 20 70 61 72 73 65 5f 75 72 69 5f 6f 75 74  to parse_uri_out
13510 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
13520 20 20 20 20 20 20 20 20 69 66 28 20 28 6d 6f 64          if( (mod
13530 65 20 26 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e  e & ~SQLITE_OPEN
13540 5f 4d 45 4d 4f 52 59 29 3e 6c 69 6d 69 74 20 29  _MEMORY)>limit )
13550 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 70  {.            *p
13560 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65  zErrMsg = sqlite
13570 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 6d 6f  3_mprintf("%s mo
13580 64 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 3a 20  de not allowed: 
13590 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  %s",.           
135a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
135b0 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 4d 6f               zMo
135c0 64 65 54 79 70 65 2c 20 7a 56 61 6c 29 3b 0a 20  deType, zVal);. 
135d0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
135e0 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 20  SQLITE_PERM;.   
135f0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61           goto pa
13600 72 73 65 5f 75 72 69 5f 6f 75 74 3b 0a 20 20 20  rse_uri_out;.   
13610 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13620 20 20 20 66 6c 61 67 73 20 3d 20 28 66 6c 61 67     flags = (flag
13630 73 20 26 20 7e 6d 61 73 6b 29 20 7c 20 6d 6f 64  s & ~mask) | mod
13640 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
13650 20 20 20 7d 0a 0a 20 20 20 20 20 20 7a 4f 70 74     }..      zOpt
13660 20 3d 20 26 7a 56 61 6c 5b 6e 56 61 6c 2b 31 5d   = &zVal[nVal+1]
13670 3b 0a 20 20 20 20 7d 0a 0a 20 20 7d 65 6c 73 65  ;.    }..  }else
13680 7b 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 73 71  {.    zFile = sq
13690 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 55 72  lite3_malloc(nUr
136a0 69 2b 32 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  i+2);.    if( !z
136b0 46 69 6c 65 20 29 20 72 65 74 75 72 6e 20 53 51  File ) return SQ
136c0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
136d0 6d 65 6d 63 70 79 28 7a 46 69 6c 65 2c 20 7a 55  memcpy(zFile, zU
136e0 72 69 2c 20 6e 55 72 69 29 3b 0a 20 20 20 20 7a  ri, nUri);.    z
136f0 46 69 6c 65 5b 6e 55 72 69 5d 20 3d 20 27 5c 30  File[nUri] = '\0
13700 27 3b 0a 20 20 20 20 7a 46 69 6c 65 5b 6e 55 72  ';.    zFile[nUr
13710 69 2b 31 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20  i+1] = '\0';.   
13720 20 66 6c 61 67 73 20 26 3d 20 7e 53 51 4c 49 54   flags &= ~SQLIT
13730 45 5f 4f 50 45 4e 5f 55 52 49 3b 0a 20 20 7d 0a  E_OPEN_URI;.  }.
13740 0a 20 20 2a 70 70 56 66 73 20 3d 20 73 71 6c 69  .  *ppVfs = sqli
13750 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a 56 66  te3_vfs_find(zVf
13760 73 29 3b 0a 20 20 69 66 28 20 2a 70 70 56 66 73  s);.  if( *ppVfs
13770 3d 3d 30 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  ==0 ){.    *pzEr
13780 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d  rMsg = sqlite3_m
13790 70 72 69 6e 74 66 28 22 6e 6f 20 73 75 63 68 20  printf("no such 
137a0 76 66 73 3a 20 25 73 22 2c 20 7a 56 66 73 29 3b  vfs: %s", zVfs);
137b0 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
137c0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 70 61 72  _ERROR;.  }. par
137d0 73 65 5f 75 72 69 5f 6f 75 74 3a 0a 20 20 69 66  se_uri_out:.  if
137e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
137f0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
13800 72 65 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ree(zFile);.    
13810 7a 46 69 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  zFile = 0;.  }. 
13820 20 2a 70 46 6c 61 67 73 20 3d 20 66 6c 61 67 73   *pFlags = flags
13830 3b 0a 20 20 2a 70 7a 46 69 6c 65 20 3d 20 7a 46  ;.  *pzFile = zF
13840 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ile;.  return rc
13850 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ;.}.../*.** This
13860 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20 74 68   routine does th
13870 65 20 77 6f 72 6b 20 6f 66 20 6f 70 65 6e 69 6e  e work of openin
13880 67 20 61 20 64 61 74 61 62 61 73 65 20 6f 6e 20  g a database on 
13890 62 65 68 61 6c 66 20 6f 66 0a 2a 2a 20 73 71 6c  behalf of.** sql
138a0 69 74 65 33 5f 6f 70 65 6e 28 29 20 61 6e 64 20  ite3_open() and 
138b0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 29  sqlite3_open16()
138c0 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
138d0 69 6c 65 6e 61 6d 65 20 22 7a 46 69 6c 65 6e 61  ilename "zFilena
138e0 6d 65 22 20 20 0a 2a 2a 20 69 73 20 55 54 46 2d  me"  .** is UTF-
138f0 38 20 65 6e 63 6f 64 65 64 2e 0a 2a 2f 0a 73 74  8 encoded..*/.st
13900 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 44 61 74  atic int openDat
13910 61 62 61 73 65 28 0a 20 20 63 6f 6e 73 74 20 63  abase(.  const c
13920 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
13930 2f 2a 20 44 61 74 61 62 61 73 65 20 66 69 6c 65  /* Database file
13940 6e 61 6d 65 20 55 54 46 2d 38 20 65 6e 63 6f 64  name UTF-8 encod
13950 65 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  ed */.  sqlite3 
13960 2a 2a 70 70 44 62 2c 20 20 20 20 20 20 20 20 2f  **ppDb,        /
13970 2a 20 4f 55 54 3a 20 52 65 74 75 72 6e 65 64 20  * OUT: Returned 
13980 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
13990 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  */.  unsigned in
139a0 74 20 66 6c 61 67 73 2c 20 20 20 20 2f 2a 20 4f  t flags,    /* O
139b0 70 65 72 61 74 69 6f 6e 61 6c 20 66 6c 61 67 73  perational flags
139c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
139d0 20 2a 7a 56 66 73 20 20 20 20 20 20 20 2f 2a 20   *zVfs       /* 
139e0 4e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  Name of the VFS 
139f0 74 6f 20 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 73  to use */.){.  s
13a00 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20 20  qlite3 *db;     
13a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13a20 2a 20 53 74 6f 72 65 20 61 6c 6c 6f 63 61 74 65  * Store allocate
13a30 64 20 68 61 6e 64 6c 65 20 68 65 72 65 20 2a 2f  d handle here */
13a40 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
13a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a60 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
13a70 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 54 68 72  e */.  int isThr
13a80 65 61 64 73 61 66 65 3b 20 20 20 20 20 20 20 20  eadsafe;        
13a90 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
13aa0 6f 72 20 74 68 72 65 61 64 73 61 66 65 20 63 6f  or threadsafe co
13ab0 6e 6e 65 63 74 69 6f 6e 73 20 2a 2f 0a 20 20 63  nnections */.  c
13ac0 68 61 72 20 2a 7a 4f 70 65 6e 20 3d 20 30 3b 20  har *zOpen = 0; 
13ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
13ae0 2a 20 46 69 6c 65 6e 61 6d 65 20 61 72 67 75 6d  * Filename argum
13af0 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f 20 42  ent to pass to B
13b00 74 72 65 65 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  treeOpen() */.  
13b10 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
13b20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
13b30 2f 2a 20 45 72 72 6f 72 20 6d 65 73 73 61 67 65  /* Error message
13b40 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 50 61 72   from sqlite3Par
13b50 73 65 55 72 69 28 29 20 2a 2f 0a 0a 20 20 2a 70  seUri() */..  *p
13b60 70 44 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66  pDb = 0;.#ifndef
13b70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
13b80 4f 49 4e 49 54 0a 20 20 72 63 20 3d 20 73 71 6c  OINIT.  rc = sql
13b90 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
13ba0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
13bb0 74 75 72 6e 20 72 63 3b 0a 23 65 6e 64 69 66 0a  turn rc;.#endif.
13bc0 0a 20 20 2f 2a 20 4f 6e 6c 79 20 61 6c 6c 6f 77  .  /* Only allow
13bd0 20 73 65 6e 73 69 62 6c 65 20 63 6f 6d 62 69 6e   sensible combin
13be0 61 74 69 6f 6e 73 20 6f 66 20 62 69 74 73 20 69  ations of bits i
13bf0 6e 20 74 68 65 20 66 6c 61 67 73 20 61 72 67 75  n the flags argu
13c00 6d 65 6e 74 2e 20 20 0a 20 20 2a 2a 20 54 68 72  ment.  .  ** Thr
13c10 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 61  ow an error if a
13c20 6e 79 20 6e 6f 6e 2d 73 65 6e 73 65 20 63 6f 6d  ny non-sense com
13c30 62 69 6e 61 74 69 6f 6e 20 69 73 20 75 73 65 64  bination is used
13c40 2e 20 20 49 66 20 77 65 0a 20 20 2a 2a 20 64 6f  .  If we.  ** do
13c50 20 6e 6f 74 20 62 6c 6f 63 6b 20 69 6c 6c 65 67   not block illeg
13c60 61 6c 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 73 20  al combinations 
13c70 68 65 72 65 2c 20 69 74 20 63 6f 75 6c 64 20 74  here, it could t
13c80 72 69 67 67 65 72 0a 20 20 2a 2a 20 61 73 73 65  rigger.  ** asse
13c90 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20  rt() statements 
13ca0 69 6e 20 64 65 65 70 65 72 20 6c 61 79 65 72 73  in deeper layers
13cb0 2e 20 20 53 65 6e 73 69 62 6c 65 20 63 6f 6d 62  .  Sensible comb
13cc0 69 6e 61 74 69 6f 6e 73 0a 20 20 2a 2a 20 61 72  inations.  ** ar
13cd0 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 31 3a  e:.  **.  **  1:
13ce0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45    SQLITE_OPEN_RE
13cf0 41 44 4f 4e 4c 59 0a 20 20 2a 2a 20 20 32 3a 20  ADONLY.  **  2: 
13d00 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
13d10 44 57 52 49 54 45 0a 20 20 2a 2a 20 20 36 3a 20  DWRITE.  **  6: 
13d20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
13d30 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
13d40 4f 50 45 4e 5f 43 52 45 41 54 45 0a 20 20 2a 2f  OPEN_CREATE.  */
13d50 0a 20 20 61 73 73 65 72 74 28 20 53 51 4c 49 54  .  assert( SQLIT
13d60 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
13d70 20 3d 3d 20 30 78 30 31 20 29 3b 0a 20 20 61 73   == 0x01 );.  as
13d80 73 65 72 74 28 20 53 51 4c 49 54 45 5f 4f 50 45  sert( SQLITE_OPE
13d90 4e 5f 52 45 41 44 57 52 49 54 45 20 3d 3d 20 30  N_READWRITE == 0
13da0 78 30 32 20 29 3b 0a 20 20 61 73 73 65 72 74 28  x02 );.  assert(
13db0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
13dc0 41 54 45 20 20 20 20 3d 3d 20 30 78 30 34 20 29  ATE    == 0x04 )
13dd0 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 28 31  ;.  testcase( (1
13de0 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d 3d 30 78  <<(flags&7))==0x
13df0 30 32 20 29 3b 20 2f 2a 20 52 45 41 44 4f 4e 4c  02 ); /* READONL
13e00 59 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65 28  Y */.  testcase(
13e10 20 28 31 3c 3c 28 66 6c 61 67 73 26 37 29 29 3d   (1<<(flags&7))=
13e20 3d 30 78 30 34 20 29 3b 20 2f 2a 20 52 45 41 44  =0x04 ); /* READ
13e30 57 52 49 54 45 20 2a 2f 0a 20 20 74 65 73 74 63  WRITE */.  testc
13e40 61 73 65 28 20 28 31 3c 3c 28 66 6c 61 67 73 26  ase( (1<<(flags&
13e50 37 29 29 3d 3d 30 78 34 30 20 29 3b 20 2f 2a 20  7))==0x40 ); /* 
13e60 52 45 41 44 57 52 49 54 45 20 7c 20 43 52 45 41  READWRITE | CREA
13e70 54 45 20 2a 2f 0a 20 20 69 66 28 20 28 28 31 3c  TE */.  if( ((1<
13e80 3c 28 66 6c 61 67 73 26 37 29 29 20 26 20 30 78  <(flags&7)) & 0x
13e90 34 36 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  46)==0 ){.    re
13ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4d 49 53 55  turn SQLITE_MISU
13eb0 53 45 5f 42 4b 50 54 3b 20 20 2f 2a 20 49 4d 50  SE_BKPT;  /* IMP
13ec0 3a 20 52 2d 36 35 34 39 37 2d 34 34 35 39 34 20  : R-65497-44594 
13ed0 2a 2f 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 71  */.  }..  if( sq
13ee0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
13ef0 67 2e 62 43 6f 72 65 4d 75 74 65 78 3d 3d 30 20  g.bCoreMutex==0 
13f00 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64 73  ){.    isThreads
13f10 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  afe = 0;.  }else
13f20 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c   if( flags & SQL
13f30 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54 45 58  ITE_OPEN_NOMUTEX
13f40 20 29 7b 0a 20 20 20 20 69 73 54 68 72 65 61 64   ){.    isThread
13f50 73 61 66 65 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  safe = 0;.  }els
13f60 65 20 69 66 28 20 66 6c 61 67 73 20 26 20 53 51  e if( flags & SQ
13f70 4c 49 54 45 5f 4f 50 45 4e 5f 46 55 4c 4c 4d 55  LITE_OPEN_FULLMU
13f80 54 45 58 20 29 7b 0a 20 20 20 20 69 73 54 68 72  TEX ){.    isThr
13f90 65 61 64 73 61 66 65 20 3d 20 31 3b 0a 20 20 7d  eadsafe = 1;.  }
13fa0 65 6c 73 65 7b 0a 20 20 20 20 69 73 54 68 72 65  else{.    isThre
13fb0 61 64 73 61 66 65 20 3d 20 73 71 6c 69 74 65 33  adsafe = sqlite3
13fc0 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 62 46 75  GlobalConfig.bFu
13fd0 6c 6c 4d 75 74 65 78 3b 0a 20 20 7d 0a 20 20 69  llMutex;.  }.  i
13fe0 66 28 20 66 6c 61 67 73 20 26 20 53 51 4c 49 54  f( flags & SQLIT
13ff0 45 5f 4f 50 45 4e 5f 50 52 49 56 41 54 45 43 41  E_OPEN_PRIVATECA
14000 43 48 45 20 29 7b 0a 20 20 20 20 66 6c 61 67 73  CHE ){.    flags
14010 20 26 3d 20 7e 53 51 4c 49 54 45 5f 4f 50 45 4e   &= ~SQLITE_OPEN
14020 5f 53 48 41 52 45 44 43 41 43 48 45 3b 0a 20 20  _SHAREDCACHE;.  
14030 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
14040 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 73 68  3GlobalConfig.sh
14050 61 72 65 64 43 61 63 68 65 45 6e 61 62 6c 65 64  aredCacheEnabled
14060 20 29 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c 3d   ){.    flags |=
14070 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 48 41   SQLITE_OPEN_SHA
14080 52 45 44 43 41 43 48 45 3b 0a 20 20 7d 0a 0a 20  REDCACHE;.  }.. 
14090 20 2f 2a 20 52 65 6d 6f 76 65 20 68 61 72 6d 66   /* Remove harmf
140a0 75 6c 20 62 69 74 73 20 66 72 6f 6d 20 74 68 65  ul bits from the
140b0 20 66 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72   flags parameter
140c0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 53  .  **.  ** The S
140d0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4e 4f 4d 55 54  QLITE_OPEN_NOMUT
140e0 45 58 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 50  EX and SQLITE_OP
140f0 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 66 6c 61  EN_FULLMUTEX fla
14100 67 73 20 77 65 72 65 0a 20 20 2a 2a 20 64 65 61  gs were.  ** dea
14110 6c 74 20 77 69 74 68 20 69 6e 20 74 68 65 20 70  lt with in the p
14120 72 65 76 69 6f 75 73 20 63 6f 64 65 20 62 6c 6f  revious code blo
14130 63 6b 2e 20 20 42 65 73 69 64 65 73 20 74 68 65  ck.  Besides the
14140 73 65 2c 20 74 68 65 20 6f 6e 6c 79 0a 20 20 2a  se, the only.  *
14150 2a 20 76 61 6c 69 64 20 69 6e 70 75 74 20 66 6c  * valid input fl
14160 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f  ags for sqlite3_
14170 6f 70 65 6e 5f 76 32 28 29 20 61 72 65 20 53 51  open_v2() are SQ
14180 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
14190 4c 59 2c 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f  LY,.  ** SQLITE_
141a0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 2c 20  OPEN_READWRITE, 
141b0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
141c0 54 45 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  TE, SQLITE_OPEN_
141d0 53 48 41 52 45 44 43 41 43 48 45 2c 0a 20 20 2a  SHAREDCACHE,.  *
141e0 2a 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 50 52  * SQLITE_OPEN_PR
141f0 49 56 41 54 45 43 41 43 48 45 2c 20 61 6e 64 20  IVATECACHE, and 
14200 73 6f 6d 65 20 72 65 73 65 72 76 65 64 20 62 69  some reserved bi
14210 74 73 2e 20 20 53 69 6c 65 6e 74 6c 79 20 6d 61  ts.  Silently ma
14220 73 6b 0a 20 20 2a 2a 20 6f 66 66 20 61 6c 6c 20  sk.  ** off all 
14230 6f 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 2a  other flags..  *
14240 2f 0a 20 20 66 6c 61 67 73 20 26 3d 20 20 7e 28  /.  flags &=  ~(
14250 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
14260 45 54 45 4f 4e 43 4c 4f 53 45 20 7c 0a 20 20 20  ETEONCLOSE |.   
14270 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
14280 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
14290 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20  E |.            
142a0 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d     SQLITE_OPEN_M
142b0 41 49 4e 5f 44 42 20 7c 0a 20 20 20 20 20 20 20  AIN_DB |.       
142c0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
142d0 50 45 4e 5f 54 45 4d 50 5f 44 42 20 7c 20 0a 20  PEN_TEMP_DB | . 
142e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
142f0 4c 49 54 45 5f 4f 50 45 4e 5f 54 52 41 4e 53 49  LITE_OPEN_TRANSI
14300 45 4e 54 5f 44 42 20 7c 20 0a 20 20 20 20 20 20  ENT_DB | .      
14310 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
14320 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
14330 4c 20 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20  L | .           
14340 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
14350 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 20 7c 20 0a  TEMP_JOURNAL | .
14360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
14370 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
14380 55 52 4e 41 4c 20 7c 20 0a 20 20 20 20 20 20 20  URNAL | .       
14390 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
143a0 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55 52 4e  PEN_MASTER_JOURN
143b0 41 4c 20 7c 0a 20 20 20 20 20 20 20 20 20 20 20  AL |.           
143c0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
143d0 4e 4f 4d 55 54 45 58 20 7c 0a 20 20 20 20 20 20  NOMUTEX |.      
143e0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
143f0 4f 50 45 4e 5f 46 55 4c 4c 4d 55 54 45 58 20 7c  OPEN_FULLMUTEX |
14400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14410 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 57 41 4c 0a  SQLITE_OPEN_WAL.
14420 20 20 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a               );.
14430 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 74  .  /* Allocate t
14440 68 65 20 73 71 6c 69 74 65 20 64 61 74 61 20 73  he sqlite data s
14450 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 64 62  tructure */.  db
14460 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63   = sqlite3Malloc
14470 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 73 71 6c  Zero( sizeof(sql
14480 69 74 65 33 29 20 29 3b 0a 20 20 69 66 28 20 64  ite3) );.  if( d
14490 62 3d 3d 30 20 29 20 67 6f 74 6f 20 6f 70 65 6e  b==0 ) goto open
144a0 64 62 5f 6f 75 74 3b 0a 20 20 69 66 28 20 69 73  db_out;.  if( is
144b0 54 68 72 65 61 64 73 61 66 65 20 29 7b 0a 20 20  Threadsafe ){.  
144c0 20 20 64 62 2d 3e 6d 75 74 65 78 20 3d 20 73 71    db->mutex = sq
144d0 6c 69 74 65 33 4d 75 74 65 78 41 6c 6c 6f 63 28  lite3MutexAlloc(
144e0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 52 45 43  SQLITE_MUTEX_REC
144f0 55 52 53 49 56 45 29 3b 0a 20 20 20 20 69 66 28  URSIVE);.    if(
14500 20 64 62 2d 3e 6d 75 74 65 78 3d 3d 30 20 29 7b   db->mutex==0 ){
14510 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
14520 72 65 65 28 64 62 29 3b 0a 20 20 20 20 20 20 64  ree(db);.      d
14530 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 67 6f 74  b = 0;.      got
14540 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
14550 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
14560 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
14570 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
14580 65 72 72 4d 61 73 6b 20 3d 20 30 78 66 66 3b 0a  errMask = 0xff;.
14590 20 20 64 62 2d 3e 6e 44 62 20 3d 20 32 3b 0a 20    db->nDb = 2;. 
145a0 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
145b0 49 54 45 5f 4d 41 47 49 43 5f 42 55 53 59 3b 0a  ITE_MAGIC_BUSY;.
145c0 20 20 64 62 2d 3e 61 44 62 20 3d 20 64 62 2d 3e    db->aDb = db->
145d0 61 44 62 53 74 61 74 69 63 3b 0a 0a 20 20 61 73  aDbStatic;..  as
145e0 73 65 72 74 28 20 73 69 7a 65 6f 66 28 64 62 2d  sert( sizeof(db-
145f0 3e 61 4c 69 6d 69 74 29 3d 3d 73 69 7a 65 6f 66  >aLimit)==sizeof
14600 28 61 48 61 72 64 4c 69 6d 69 74 29 20 29 3b 0a  (aHardLimit) );.
14610 20 20 6d 65 6d 63 70 79 28 64 62 2d 3e 61 4c 69    memcpy(db->aLi
14620 6d 69 74 2c 20 61 48 61 72 64 4c 69 6d 69 74 2c  mit, aHardLimit,
14630 20 73 69 7a 65 6f 66 28 64 62 2d 3e 61 4c 69 6d   sizeof(db->aLim
14640 69 74 29 29 3b 0a 20 20 64 62 2d 3e 61 4c 69 6d  it));.  db->aLim
14650 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
14660 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 5d 20  WORKER_THREADS] 
14670 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
14680 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 3b  _WORKER_THREADS;
14690 0a 20 20 64 62 2d 3e 61 75 74 6f 43 6f 6d 6d 69  .  db->autoCommi
146a0 74 20 3d 20 31 3b 0a 20 20 64 62 2d 3e 6e 65 78  t = 1;.  db->nex
146b0 74 41 75 74 6f 76 61 63 20 3d 20 2d 31 3b 0a 20  tAutovac = -1;. 
146c0 20 64 62 2d 3e 73 7a 4d 6d 61 70 20 3d 20 73 71   db->szMmap = sq
146d0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
146e0 67 2e 73 7a 4d 6d 61 70 3b 0a 20 20 64 62 2d 3e  g.szMmap;.  db->
146f0 6e 65 78 74 50 61 67 65 73 69 7a 65 20 3d 20 30  nextPagesize = 0
14700 3b 0a 20 20 64 62 2d 3e 6e 4d 61 78 53 6f 72 74  ;.  db->nMaxSort
14710 65 72 4d 6d 61 70 20 3d 20 30 78 37 46 46 46 46  erMmap = 0x7FFFF
14720 46 46 46 3b 0a 20 20 64 62 2d 3e 66 6c 61 67 73  FFF;.  db->flags
14730 20 7c 3d 20 53 51 4c 49 54 45 5f 53 68 6f 72 74   |= SQLITE_Short
14740 43 6f 6c 4e 61 6d 65 73 20 7c 20 53 51 4c 49 54  ColNames | SQLIT
14750 45 5f 45 6e 61 62 6c 65 54 72 69 67 67 65 72 20  E_EnableTrigger 
14760 7c 20 53 51 4c 49 54 45 5f 43 61 63 68 65 53 70  | SQLITE_CacheSp
14770 69 6c 6c 0a 23 69 66 20 21 64 65 66 69 6e 65 64  ill.#if !defined
14780 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f  (SQLITE_DEFAULT_
14790 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44 45 58 29  AUTOMATIC_INDEX)
147a0 20 7c 7c 20 53 51 4c 49 54 45 5f 44 45 46 41 55   || SQLITE_DEFAU
147b0 4c 54 5f 41 55 54 4f 4d 41 54 49 43 5f 49 4e 44  LT_AUTOMATIC_IND
147c0 45 58 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  EX.             
147d0 20 20 20 20 7c 20 53 51 4c 49 54 45 5f 41 75 74      | SQLITE_Aut
147e0 6f 49 6e 64 65 78 0a 23 65 6e 64 69 66 0a 23 69  oIndex.#endif.#i
147f0 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
14800 5f 46 49 4c 45 5f 46 4f 52 4d 41 54 3c 34 0a 20  _FILE_FORMAT<4. 
14810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14820 7c 20 53 51 4c 49 54 45 5f 4c 65 67 61 63 79 46  | SQLITE_LegacyF
14830 69 6c 65 46 6d 74 0a 23 65 6e 64 69 66 0a 23 69  ileFmt.#endif.#i
14840 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
14850 4c 45 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  LE_LOAD_EXTENSIO
14860 4e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  N.              
14870 20 20 20 7c 20 53 51 4c 49 54 45 5f 4c 6f 61 64     | SQLITE_Load
14880 45 78 74 65 6e 73 69 6f 6e 0a 23 65 6e 64 69 66  Extension.#endif
14890 0a 23 69 66 20 53 51 4c 49 54 45 5f 44 45 46 41  .#if SQLITE_DEFA
148a0 55 4c 54 5f 52 45 43 55 52 53 49 56 45 5f 54 52  ULT_RECURSIVE_TR
148b0 49 47 47 45 52 53 0a 20 20 20 20 20 20 20 20 20  IGGERS.         
148c0 20 20 20 20 20 20 20 20 7c 20 53 51 4c 49 54 45          | SQLITE
148d0 5f 52 65 63 54 72 69 67 67 65 72 73 0a 23 65 6e  _RecTriggers.#en
148e0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
148f0 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
14900 4f 52 45 49 47 4e 5f 4b 45 59 53 29 20 26 26 20  OREIGN_KEYS) && 
14910 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 46  SQLITE_DEFAULT_F
14920 4f 52 45 49 47 4e 5f 4b 45 59 53 0a 20 20 20 20  OREIGN_KEYS.    
14930 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 53               | S
14940 51 4c 49 54 45 5f 46 6f 72 65 69 67 6e 4b 65 79  QLITE_ForeignKey
14950 73 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 3b  s.#endif.      ;
14960 0a 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e  .  sqlite3HashIn
14970 69 74 28 26 64 62 2d 3e 61 43 6f 6c 6c 53 65 71  it(&db->aCollSeq
14980 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
14990 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
149a0 42 4c 45 0a 20 20 73 71 6c 69 74 65 33 48 61 73  BLE.  sqlite3Has
149b0 68 49 6e 69 74 28 26 64 62 2d 3e 61 4d 6f 64 75  hInit(&db->aModu
149c0 6c 65 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  le);.#endif..  /
149d0 2a 20 41 64 64 20 74 68 65 20 64 65 66 61 75 6c  * Add the defaul
149e0 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  t collation sequ
149f0 65 6e 63 65 20 42 49 4e 41 52 59 2e 20 42 49 4e  ence BINARY. BIN
14a00 41 52 59 20 77 6f 72 6b 73 20 66 6f 72 20 62 6f  ARY works for bo
14a10 74 68 20 55 54 46 2d 38 0a 20 20 2a 2a 20 61 6e  th UTF-8.  ** an
14a20 64 20 55 54 46 2d 31 36 2c 20 73 6f 20 61 64 64  d UTF-16, so add
14a30 20 61 20 76 65 72 73 69 6f 6e 20 66 6f 72 20 65   a version for e
14a40 61 63 68 20 74 6f 20 61 76 6f 69 64 20 61 6e 79  ach to avoid any
14a50 20 75 6e 6e 65 63 65 73 73 61 72 79 0a 20 20 2a   unnecessary.  *
14a60 2a 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 20 54  * conversions. T
14a70 68 65 20 6f 6e 6c 79 20 65 72 72 6f 72 20 74 68  he only error th
14a80 61 74 20 63 61 6e 20 6f 63 63 75 72 20 68 65 72  at can occur her
14a90 65 20 69 73 20 61 20 6d 61 6c 6c 6f 63 28 29 20  e is a malloc() 
14aa0 66 61 69 6c 75 72 65 2e 0a 20 20 2a 2f 0a 20 20  failure..  */.  
14ab0 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e 28  createCollation(
14ac0 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53 51  db, "BINARY", SQ
14ad0 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 20 62 69  LITE_UTF8, 0, bi
14ae0 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20  nCollFunc, 0);. 
14af0 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
14b00 28 64 62 2c 20 22 42 49 4e 41 52 59 22 2c 20 53  (db, "BINARY", S
14b10 51 4c 49 54 45 5f 55 54 46 31 36 42 45 2c 20 30  QLITE_UTF16BE, 0
14b20 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e 63 2c 20 30  , binCollFunc, 0
14b30 29 3b 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61  );.  createColla
14b40 74 69 6f 6e 28 64 62 2c 20 22 42 49 4e 41 52 59  tion(db, "BINARY
14b50 22 2c 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  ", SQLITE_UTF16L
14b60 45 2c 20 30 2c 20 62 69 6e 43 6f 6c 6c 46 75 6e  E, 0, binCollFun
14b70 63 2c 20 30 29 3b 0a 20 20 63 72 65 61 74 65 43  c, 0);.  createC
14b80 6f 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 22 52 54  ollation(db, "RT
14b90 52 49 4d 22 2c 20 53 51 4c 49 54 45 5f 55 54 46  RIM", SQLITE_UTF
14ba0 38 2c 20 28 76 6f 69 64 2a 29 31 2c 20 62 69 6e  8, (void*)1, bin
14bb0 43 6f 6c 6c 46 75 6e 63 2c 20 30 29 3b 0a 20 20  CollFunc, 0);.  
14bc0 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  if( db->mallocFa
14bd0 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f  iled ){.    goto
14be0 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20 7d   opendb_out;.  }
14bf0 0a 20 20 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  .  db->pDfltColl
14c00 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 43 6f   = sqlite3FindCo
14c10 6c 6c 53 65 71 28 64 62 2c 20 53 51 4c 49 54 45  llSeq(db, SQLITE
14c20 5f 55 54 46 38 2c 20 22 42 49 4e 41 52 59 22 2c  _UTF8, "BINARY",
14c30 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20 64   0);.  assert( d
14c40 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 21 3d 30 20  b->pDfltColl!=0 
14c50 29 3b 0a 0a 20 20 2f 2a 20 41 6c 73 6f 20 61 64  );..  /* Also ad
14c60 64 20 61 20 55 54 46 2d 38 20 63 61 73 65 2d 69  d a UTF-8 case-i
14c70 6e 73 65 6e 73 69 74 69 76 65 20 63 6f 6c 6c 61  nsensitive colla
14c80 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 2e 20 2a  tion sequence. *
14c90 2f 0a 20 20 63 72 65 61 74 65 43 6f 6c 6c 61 74  /.  createCollat
14ca0 69 6f 6e 28 64 62 2c 20 22 4e 4f 43 41 53 45 22  ion(db, "NOCASE"
14cb0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
14cc0 2c 20 6e 6f 63 61 73 65 43 6f 6c 6c 61 74 69 6e  , nocaseCollatin
14cd0 67 46 75 6e 63 2c 20 30 29 3b 0a 0a 20 20 2f 2a  gFunc, 0);..  /*
14ce0 20 50 61 72 73 65 20 74 68 65 20 66 69 6c 65 6e   Parse the filen
14cf0 61 6d 65 2f 55 52 49 20 61 72 67 75 6d 65 6e 74  ame/URI argument
14d00 2e 20 2a 2f 0a 20 20 64 62 2d 3e 6f 70 65 6e 46  . */.  db->openF
14d10 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20  lags = flags;.  
14d20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 72 73  rc = sqlite3Pars
14d30 65 55 72 69 28 7a 56 66 73 2c 20 7a 46 69 6c 65  eUri(zVfs, zFile
14d40 6e 61 6d 65 2c 20 26 66 6c 61 67 73 2c 20 26 64  name, &flags, &d
14d50 62 2d 3e 70 56 66 73 2c 20 26 7a 4f 70 65 6e 2c  b->pVfs, &zOpen,
14d60 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   &zErrMsg);.  if
14d70 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14d80 29 7b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  ){.    if( rc==S
14d90 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 20 64 62  QLITE_NOMEM ) db
14da0 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 3d  ->mallocFailed =
14db0 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   1;.    sqlite3E
14dc0 72 72 6f 72 57 69 74 68 4d 73 67 28 64 62 2c 20  rrorWithMsg(db, 
14dd0 72 63 2c 20 7a 45 72 72 4d 73 67 20 3f 20 22 25  rc, zErrMsg ? "%
14de0 73 22 20 3a 20 30 2c 20 7a 45 72 72 4d 73 67 29  s" : 0, zErrMsg)
14df0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
14e00 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
14e10 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74   goto opendb_out
14e20 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e  ;.  }..  /* Open
14e30 20 74 68 65 20 62 61 63 6b 65 6e 64 20 64 61 74   the backend dat
14e40 61 62 61 73 65 20 64 72 69 76 65 72 20 2a 2f 0a  abase driver */.
14e50 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 74    rc = sqlite3Bt
14e60 72 65 65 4f 70 65 6e 28 64 62 2d 3e 70 56 66 73  reeOpen(db->pVfs
14e70 2c 20 7a 4f 70 65 6e 2c 20 64 62 2c 20 26 64 62  , zOpen, db, &db
14e80 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 2c 20 30 2c  ->aDb[0].pBt, 0,
14e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14ea0 20 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 7c           flags |
14eb0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
14ec0 4e 5f 44 42 29 3b 0a 20 20 69 66 28 20 72 63 21  N_DB);.  if( rc!
14ed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14ee0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14ef0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 29 7b 0a  _IOERR_NOMEM ){.
14f00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14f10 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20  E_NOMEM;.    }. 
14f20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 28     sqlite3Error(
14f30 64 62 2c 20 72 63 29 3b 0a 20 20 20 20 67 6f 74  db, rc);.    got
14f40 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20 20  o opendb_out;.  
14f50 7d 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e 70  }.  db->aDb[0].p
14f60 53 63 68 65 6d 61 20 3d 20 73 71 6c 69 74 65 33  Schema = sqlite3
14f70 53 63 68 65 6d 61 47 65 74 28 64 62 2c 20 64 62  SchemaGet(db, db
14f80 2d 3e 61 44 62 5b 30 5d 2e 70 42 74 29 3b 0a 20  ->aDb[0].pBt);. 
14f90 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 70 53 63 68   db->aDb[1].pSch
14fa0 65 6d 61 20 3d 20 73 71 6c 69 74 65 33 53 63 68  ema = sqlite3Sch
14fb0 65 6d 61 47 65 74 28 64 62 2c 20 30 29 3b 0a 0a  emaGet(db, 0);..
14fc0 20 20 2f 2a 20 54 68 65 20 64 65 66 61 75 6c 74    /* The default
14fd0 20 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 66 6f   safety_level fo
14fe0 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  r the main datab
14ff0 61 73 65 20 69 73 20 27 66 75 6c 6c 27 3b 20 66  ase is 'full'; f
15000 6f 72 20 74 68 65 20 74 65 6d 70 0a 20 20 2a 2a  or the temp.  **
15010 20 64 61 74 61 62 61 73 65 20 69 74 20 69 73 20   database it is 
15020 27 4e 4f 4e 45 27 2e 20 54 68 69 73 20 6d 61 74  'NONE'. This mat
15030 63 68 65 73 20 74 68 65 20 70 61 67 65 72 20 6c  ches the pager l
15040 61 79 65 72 20 64 65 66 61 75 6c 74 73 2e 20 20  ayer defaults.  
15050 0a 20 20 2a 2f 0a 20 20 64 62 2d 3e 61 44 62 5b  .  */.  db->aDb[
15060 30 5d 2e 7a 4e 61 6d 65 20 3d 20 22 6d 61 69 6e  0].zName = "main
15070 22 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 30 5d 2e  ";.  db->aDb[0].
15080 73 61 66 65 74 79 5f 6c 65 76 65 6c 20 3d 20 33  safety_level = 3
15090 3b 0a 20 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 7a  ;.  db->aDb[1].z
150a0 4e 61 6d 65 20 3d 20 22 74 65 6d 70 22 3b 0a 20  Name = "temp";. 
150b0 20 64 62 2d 3e 61 44 62 5b 31 5d 2e 73 61 66 65   db->aDb[1].safe
150c0 74 79 5f 6c 65 76 65 6c 20 3d 20 31 3b 0a 0a 20  ty_level = 1;.. 
150d0 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51 4c   db->magic = SQL
150e0 49 54 45 5f 4d 41 47 49 43 5f 4f 50 45 4e 3b 0a  ITE_MAGIC_OPEN;.
150f0 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63    if( db->malloc
15100 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 67 6f  Failed ){.    go
15110 74 6f 20 6f 70 65 6e 64 62 5f 6f 75 74 3b 0a 20  to opendb_out;. 
15120 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
15130 72 20 61 6c 6c 20 62 75 69 6c 74 2d 69 6e 20 66  r all built-in f
15140 75 6e 63 74 69 6f 6e 73 2c 20 62 75 74 20 64 6f  unctions, but do
15150 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 74 6f 20   not attempt to 
15160 72 65 61 64 20 74 68 65 0a 20 20 2a 2a 20 64 61  read the.  ** da
15170 74 61 62 61 73 65 20 73 63 68 65 6d 61 20 79 65  tabase schema ye
15180 74 2e 20 54 68 69 73 20 69 73 20 64 65 6c 61 79  t. This is delay
15190 65 64 20 75 6e 74 69 6c 20 74 68 65 20 66 69 72  ed until the fir
151a0 73 74 20 74 69 6d 65 20 74 68 65 20 64 61 74 61  st time the data
151b0 62 61 73 65 0a 20 20 2a 2a 20 69 73 20 61 63 63  base.  ** is acc
151c0 65 73 73 65 64 2e 0a 20 20 2a 2f 0a 20 20 73 71  essed..  */.  sq
151d0 6c 69 74 65 33 45 72 72 6f 72 28 64 62 2c 20 53  lite3Error(db, S
151e0 51 4c 49 54 45 5f 4f 4b 29 3b 0a 20 20 73 71 6c  QLITE_OK);.  sql
151f0 69 74 65 33 52 65 67 69 73 74 65 72 42 75 69 6c  ite3RegisterBuil
15200 74 69 6e 46 75 6e 63 74 69 6f 6e 73 28 64 62 29  tinFunctions(db)
15210 3b 0a 0a 20 20 2f 2a 20 4c 6f 61 64 20 61 75 74  ;..  /* Load aut
15220 6f 6d 61 74 69 63 20 65 78 74 65 6e 73 69 6f 6e  omatic extension
15230 73 20 2d 20 65 78 74 65 6e 73 69 6f 6e 73 20 74  s - extensions t
15240 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 72 65  hat have been re
15250 67 69 73 74 65 72 65 64 0a 20 20 2a 2a 20 75 73  gistered.  ** us
15260 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 5f  ing the sqlite3_
15270 61 75 74 6f 6d 61 74 69 63 5f 65 78 74 65 6e 73  automatic_extens
15280 69 6f 6e 28 29 20 41 50 49 2e 0a 20 20 2a 2f 0a  ion() API..  */.
15290 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
152a0 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 69 66  rrcode(db);.  if
152b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
152c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75  ){.    sqlite3Au
152d0 74 6f 4c 6f 61 64 45 78 74 65 6e 73 69 6f 6e 73  toLoadExtensions
152e0 28 64 62 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  (db);.    rc = s
152f0 71 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64  qlite3_errcode(d
15300 62 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  b);.    if( rc!=
15310 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15320 20 20 20 67 6f 74 6f 20 6f 70 65 6e 64 62 5f 6f     goto opendb_o
15330 75 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23  ut;.    }.  }..#
15340 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
15350 42 4c 45 5f 46 54 53 31 0a 20 20 69 66 28 20 21  BLE_FTS1.  if( !
15360 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
15370 20 29 7b 0a 20 20 20 20 65 78 74 65 72 6e 20 69   ){.    extern i
15380 6e 74 20 73 71 6c 69 74 65 33 46 74 73 31 49 6e  nt sqlite3Fts1In
15390 69 74 28 73 71 6c 69 74 65 33 2a 29 3b 0a 20 20  it(sqlite3*);.  
153a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 74    rc = sqlite3Ft
153b0 73 31 49 6e 69 74 28 64 62 29 3b 0a 20 20 7d 0a  s1Init(db);.  }.
153c0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
153d0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 46 54 53  QLITE_ENABLE_FTS
153e0 32 0a 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c  2.  if( !db->mal
153f0 6c 6f 63 46 61 69 6c 65 64 20 26 26 20 72 63 3d  locFailed && rc=
15400 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15410 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c    extern int sql
15420 69 74 65 33 46 74 73 32 49 6e 69 74 28 73 71 6c  ite3Fts2Init(sql
15430 69 74 65 33 2a 29 3b 0a 20 20 20 20 72 63 20 3d  ite3*);.    rc =
15440 20 73 71 6c 69 74 65 33 46 74 73 32 49 6e 69 74   sqlite3Fts2Init
15450 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
15460 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
15470 45 4e 41 42 4c 45 5f 46 54 53 33 0a 20 20 69 66  ENABLE_FTS3.  if
15480 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  ( !db->mallocFai
15490 6c 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  led && rc==SQLIT
154a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
154b0 20 73 71 6c 69 74 65 33 46 74 73 33 49 6e 69 74   sqlite3Fts3Init
154c0 28 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  (db);.  }.#endif
154d0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
154e0 45 4e 41 42 4c 45 5f 49 43 55 0a 20 20 69 66 28  ENABLE_ICU.  if(
154f0 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
15500 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
15510 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
15520 73 71 6c 69 74 65 33 49 63 75 49 6e 69 74 28 64  sqlite3IcuInit(d
15530 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  b);.  }.#endif..
15540 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
15550 41 42 4c 45 5f 52 54 52 45 45 0a 20 20 69 66 28  ABLE_RTREE.  if(
15560 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
15570 65 64 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ed && rc==SQLITE
15580 5f 4f 4b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  _OK){.    rc = s
15590 71 6c 69 74 65 33 52 74 72 65 65 49 6e 69 74 28  qlite3RtreeInit(
155a0 64 62 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  db);.  }.#endif.
155b0 0a 20 20 2f 2a 20 2d 44 53 51 4c 49 54 45 5f 44  .  /* -DSQLITE_D
155c0 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
155d0 4f 44 45 3d 31 20 6d 61 6b 65 73 20 45 58 43 4c  ODE=1 makes EXCL
155e0 55 53 49 56 45 20 74 68 65 20 64 65 66 61 75 6c  USIVE the defaul
155f0 74 20 6c 6f 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d  t locking.  ** m
15600 6f 64 65 2e 20 20 2d 44 53 51 4c 49 54 45 5f 44  ode.  -DSQLITE_D
15610 45 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d  EFAULT_LOCKING_M
15620 4f 44 45 3d 30 20 6d 61 6b 65 20 4e 4f 52 4d 41  ODE=0 make NORMA
15630 4c 20 74 68 65 20 64 65 66 61 75 6c 74 20 6c 6f  L the default lo
15640 63 6b 69 6e 67 0a 20 20 2a 2a 20 6d 6f 64 65 2e  cking.  ** mode.
15650 20 20 44 6f 69 6e 67 20 6e 6f 74 68 69 6e 67 20    Doing nothing 
15660 61 74 20 61 6c 6c 20 61 6c 73 6f 20 6d 61 6b 65  at all also make
15670 73 20 4e 4f 52 4d 41 4c 20 74 68 65 20 64 65 66  s NORMAL the def
15680 61 75 6c 74 2e 0a 20 20 2a 2f 0a 23 69 66 64 65  ault..  */.#ifde
15690 66 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  f SQLITE_DEFAULT
156a0 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 0a 20 20  _LOCKING_MODE.  
156b0 64 62 2d 3e 64 66 6c 74 4c 6f 63 6b 4d 6f 64 65  db->dfltLockMode
156c0 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
156d0 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f 44 45 3b 0a  T_LOCKING_MODE;.
156e0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f    sqlite3PagerLo
156f0 63 6b 69 6e 67 4d 6f 64 65 28 73 71 6c 69 74 65  ckingMode(sqlite
15700 33 42 74 72 65 65 50 61 67 65 72 28 64 62 2d 3e  3BtreePager(db->
15710 61 44 62 5b 30 5d 2e 70 42 74 29 2c 0a 20 20 20  aDb[0].pBt),.   
15720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15730 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 45         SQLITE_DE
15740 46 41 55 4c 54 5f 4c 4f 43 4b 49 4e 47 5f 4d 4f  FAULT_LOCKING_MO
15750 44 45 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69  DE);.#endif..  i
15760 66 28 20 72 63 20 29 20 73 71 6c 69 74 65 33 45  f( rc ) sqlite3E
15770 72 72 6f 72 28 64 62 2c 20 72 63 29 3b 0a 0a 20  rror(db, rc);.. 
15780 20 2f 2a 20 45 6e 61 62 6c 65 20 74 68 65 20 6c   /* Enable the l
15790 6f 6f 6b 61 73 69 64 65 2d 6d 61 6c 6c 6f 63 20  ookaside-malloc 
157a0 73 75 62 73 79 73 74 65 6d 20 2a 2f 0a 20 20 73  subsystem */.  s
157b0 65 74 75 70 4c 6f 6f 6b 61 73 69 64 65 28 64 62  etupLookaside(db
157c0 2c 20 30 2c 20 73 71 6c 69 74 65 33 47 6c 6f 62  , 0, sqlite3Glob
157d0 61 6c 43 6f 6e 66 69 67 2e 73 7a 4c 6f 6f 6b 61  alConfig.szLooka
157e0 73 69 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20  side,.          
157f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
15800 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
15810 67 2e 6e 4c 6f 6f 6b 61 73 69 64 65 29 3b 0a 0a  g.nLookaside);..
15820 20 20 73 71 6c 69 74 65 33 5f 77 61 6c 5f 61 75    sqlite3_wal_au
15830 74 6f 63 68 65 63 6b 70 6f 69 6e 74 28 64 62 2c  tocheckpoint(db,
15840 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
15850 57 41 4c 5f 41 55 54 4f 43 48 45 43 4b 50 4f 49  WAL_AUTOCHECKPOI
15860 4e 54 29 3b 0a 0a 6f 70 65 6e 64 62 5f 6f 75 74  NT);..opendb_out
15870 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  :.  sqlite3_free
15880 28 7a 4f 70 65 6e 29 3b 0a 20 20 69 66 28 20 64  (zOpen);.  if( d
15890 62 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  b ){.    assert(
158a0 20 64 62 2d 3e 6d 75 74 65 78 21 3d 30 20 7c 7c   db->mutex!=0 ||
158b0 20 69 73 54 68 72 65 61 64 73 61 66 65 3d 3d 30   isThreadsafe==0
158c0 20 7c 7c 20 73 71 6c 69 74 65 33 47 6c 6f 62 61   || sqlite3Globa
158d0 6c 43 6f 6e 66 69 67 2e 62 46 75 6c 6c 4d 75 74  lConfig.bFullMut
158e0 65 78 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c  ex==0 );.    sql
158f0 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
15900 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 7d  (db->mutex);.  }
15910 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
15920 65 72 72 63 6f 64 65 28 64 62 29 3b 0a 20 20 61  errcode(db);.  a
15930 73 73 65 72 74 28 20 64 62 21 3d 30 20 7c 7c 20  ssert( db!=0 || 
15940 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
15950 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
15960 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20  LITE_NOMEM ){.  
15970 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
15980 64 62 29 3b 0a 20 20 20 20 64 62 20 3d 20 30 3b  db);.    db = 0;
15990 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 21  .  }else if( rc!
159a0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
159b0 20 20 64 62 2d 3e 6d 61 67 69 63 20 3d 20 53 51    db->magic = SQ
159c0 4c 49 54 45 5f 4d 41 47 49 43 5f 53 49 43 4b 3b  LITE_MAGIC_SICK;
159d0 0a 20 20 7d 0a 20 20 2a 70 70 44 62 20 3d 20 64  .  }.  *ppDb = d
159e0 62 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  b;.#ifdef SQLITE
159f0 5f 45 4e 41 42 4c 45 5f 53 51 4c 4c 4f 47 0a 20  _ENABLE_SQLLOG. 
15a00 20 69 66 28 20 73 71 6c 69 74 65 33 47 6c 6f 62   if( sqlite3Glob
15a10 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f 67  alConfig.xSqllog
15a20 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 69   ){.    /* Openi
15a30 6e 67 20 61 20 64 62 20 68 61 6e 64 6c 65 2e 20  ng a db handle. 
15a40 46 6f 75 72 74 68 20 70 61 72 61 6d 65 74 65 72  Fourth parameter
15a50 20 69 73 20 70 61 73 73 65 64 20 30 2e 20 2a 2f   is passed 0. */
15a60 0a 20 20 20 20 76 6f 69 64 20 2a 70 41 72 67 20  .    void *pArg 
15a70 3d 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43  = sqlite3GlobalC
15a80 6f 6e 66 69 67 2e 70 53 71 6c 6c 6f 67 41 72 67  onfig.pSqllogArg
15a90 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f  ;.    sqlite3Glo
15aa0 62 61 6c 43 6f 6e 66 69 67 2e 78 53 71 6c 6c 6f  balConfig.xSqllo
15ab0 67 28 70 41 72 67 2c 20 64 62 2c 20 7a 46 69 6c  g(pArg, db, zFil
15ac0 65 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 7d 0a 23  ename, 0);.  }.#
15ad0 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 73  endif.  return s
15ae0 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c  qlite3ApiExit(0,
15af0 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f   rc);.}../*.** O
15b00 70 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61  pen a new databa
15b10 73 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e  se handle..*/.in
15b20 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 0a  t sqlite3_open(.
15b30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
15b40 69 6c 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69  ilename, .  sqli
15b50 74 65 33 20 2a 2a 70 70 44 62 20 0a 29 7b 0a 20  te3 **ppDb .){. 
15b60 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
15b70 62 61 73 65 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  base(zFilename, 
15b80 70 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ppDb,.          
15b90 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
15ba0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
15bb0 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
15bc0 43 52 45 41 54 45 2c 20 30 29 3b 0a 7d 0a 69 6e  CREATE, 0);.}.in
15bd0 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76  t sqlite3_open_v
15be0 32 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  2(.  const char 
15bf0 2a 66 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20  *filename,   /* 
15c00 44 61 74 61 62 61 73 65 20 66 69 6c 65 6e 61 6d  Database filenam
15c10 65 20 28 55 54 46 2d 38 29 20 2a 2f 0a 20 20 73  e (UTF-8) */.  s
15c20 71 6c 69 74 65 33 20 2a 2a 70 70 44 62 2c 20 20  qlite3 **ppDb,  
15c30 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 53         /* OUT: S
15c40 51 4c 69 74 65 20 64 62 20 68 61 6e 64 6c 65 20  QLite db handle 
15c50 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
15c60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15c70 46 6c 61 67 73 20 2a 2f 0a 20 20 63 6f 6e 73 74  Flags */.  const
15c80 20 63 68 61 72 20 2a 7a 56 66 73 20 20 20 20 20   char *zVfs     
15c90 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46     /* Name of VF
15ca0 53 20 6d 6f 64 75 6c 65 20 74 6f 20 75 73 65 20  S module to use 
15cb0 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 6f  */.){.  return o
15cc0 70 65 6e 44 61 74 61 62 61 73 65 28 66 69 6c 65  penDatabase(file
15cd0 6e 61 6d 65 2c 20 70 70 44 62 2c 20 28 75 6e 73  name, ppDb, (uns
15ce0 69 67 6e 65 64 20 69 6e 74 29 66 6c 61 67 73 2c  igned int)flags,
15cf0 20 7a 56 66 73 29 3b 0a 7d 0a 0a 23 69 66 6e 64   zVfs);.}..#ifnd
15d00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55  ef SQLITE_OMIT_U
15d10 54 46 31 36 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  TF16./*.** Open 
15d20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 68  a new database h
15d30 61 6e 64 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  andle..*/.int sq
15d40 6c 69 74 65 33 5f 6f 70 65 6e 31 36 28 0a 20 20  lite3_open16(.  
15d50 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 46 69 6c  const void *zFil
15d60 65 6e 61 6d 65 2c 20 0a 20 20 73 71 6c 69 74 65  ename, .  sqlite
15d70 33 20 2a 2a 70 70 44 62 0a 29 7b 0a 20 20 63 68  3 **ppDb.){.  ch
15d80 61 72 20 63 6f 6e 73 74 20 2a 7a 46 69 6c 65 6e  ar const *zFilen
15d90 61 6d 65 38 3b 20 20 20 2f 2a 20 7a 46 69 6c 65  ame8;   /* zFile
15da0 6e 61 6d 65 20 65 6e 63 6f 64 65 64 20 69 6e 20  name encoded in 
15db0 55 54 46 2d 38 20 69 6e 73 74 65 61 64 20 6f 66  UTF-8 instead of
15dc0 20 55 54 46 2d 31 36 20 2a 2f 0a 20 20 73 71 6c   UTF-16 */.  sql
15dd0 69 74 65 33 5f 76 61 6c 75 65 20 2a 70 56 61 6c  ite3_value *pVal
15de0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
15df0 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d 65  ssert( zFilename
15e00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 70   );.  assert( pp
15e10 44 62 20 29 3b 0a 20 20 2a 70 70 44 62 20 3d 20  Db );.  *ppDb = 
15e20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
15e30 45 5f 4f 4d 49 54 5f 41 55 54 4f 49 4e 49 54 0a  E_OMIT_AUTOINIT.
15e40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 69    rc = sqlite3_i
15e50 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 69  nitialize();.  i
15e60 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
15e70 63 3b 0a 23 65 6e 64 69 66 0a 20 20 70 56 61 6c  c;.#endif.  pVal
15e80 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65 4e   = sqlite3ValueN
15e90 65 77 28 30 29 3b 0a 20 20 73 71 6c 69 74 65 33  ew(0);.  sqlite3
15ea0 56 61 6c 75 65 53 65 74 53 74 72 28 70 56 61 6c  ValueSetStr(pVal
15eb0 2c 20 2d 31 2c 20 7a 46 69 6c 65 6e 61 6d 65 2c  , -1, zFilename,
15ec0 20 53 51 4c 49 54 45 5f 55 54 46 31 36 4e 41 54   SQLITE_UTF16NAT
15ed0 49 56 45 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  IVE, SQLITE_STAT
15ee0 49 43 29 3b 0a 20 20 7a 46 69 6c 65 6e 61 6d 65  IC);.  zFilename
15ef0 38 20 3d 20 73 71 6c 69 74 65 33 56 61 6c 75 65  8 = sqlite3Value
15f00 54 65 78 74 28 70 56 61 6c 2c 20 53 51 4c 49 54  Text(pVal, SQLIT
15f10 45 5f 55 54 46 38 29 3b 0a 20 20 69 66 28 20 7a  E_UTF8);.  if( z
15f20 46 69 6c 65 6e 61 6d 65 38 20 29 7b 0a 20 20 20  Filename8 ){.   
15f30 20 72 63 20 3d 20 6f 70 65 6e 44 61 74 61 62 61   rc = openDataba
15f40 73 65 28 7a 46 69 6c 65 6e 61 6d 65 38 2c 20 70  se(zFilename8, p
15f50 70 44 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  pDb,.           
15f60 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
15f70 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
15f80 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43   | SQLITE_OPEN_C
15f90 52 45 41 54 45 2c 20 30 29 3b 0a 20 20 20 20 61  REATE, 0);.    a
15fa0 73 73 65 72 74 28 20 2a 70 70 44 62 20 7c 7c 20  ssert( *ppDb || 
15fb0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
15fc0 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   );.    if( rc==
15fd0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 44 62  SQLITE_OK && !Db
15fe0 48 61 73 50 72 6f 70 65 72 74 79 28 2a 70 70 44  HasProperty(*ppD
15ff0 62 2c 20 30 2c 20 44 42 5f 53 63 68 65 6d 61 4c  b, 0, DB_SchemaL
16000 6f 61 64 65 64 29 20 29 7b 0a 20 20 20 20 20 20  oaded) ){.      
16010 45 4e 43 28 2a 70 70 44 62 29 20 3d 20 53 51 4c  ENC(*ppDb) = SQL
16020 49 54 45 5f 55 54 46 31 36 4e 41 54 49 56 45 3b  ITE_UTF16NATIVE;
16030 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
16040 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16050 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 73 71 6c  NOMEM;.  }.  sql
16060 69 74 65 33 56 61 6c 75 65 46 72 65 65 28 70 56  ite3ValueFree(pV
16070 61 6c 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 73  al);..  return s
16080 71 6c 69 74 65 33 41 70 69 45 78 69 74 28 30 2c  qlite3ApiExit(0,
16090 20 72 63 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f   rc);.}.#endif /
160a0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54  * SQLITE_OMIT_UT
160b0 46 31 36 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65  F16 */../*.** Re
160c0 67 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c  gister a new col
160d0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
160e0 77 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73  with the databas
160f0 65 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a  e handle db..*/.
16100 69 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61  int sqlite3_crea
16110 74 65 5f 63 6f 6c 6c 61 74 69 6f 6e 28 0a 20 20  te_collation(.  
16120 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
16130 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
16140 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
16150 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
16160 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
16170 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
16180 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
16190 6f 69 64 2a 29 0a 29 7b 0a 20 20 72 65 74 75 72  oid*).){.  retur
161a0 6e 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  n sqlite3_create
161b0 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 64 62  _collation_v2(db
161c0 2c 20 7a 4e 61 6d 65 2c 20 65 6e 63 2c 20 70 43  , zName, enc, pC
161d0 74 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29  tx, xCompare, 0)
161e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73  ;.}../*.** Regis
161f0 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c 61 74  ter a new collat
16200 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77 69 74  ion sequence wit
16210 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  h the database h
16220 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69 6e 74  andle db..*/.int
16230 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
16240 63 6f 6c 6c 61 74 69 6f 6e 5f 76 32 28 0a 20 20  collation_v2(.  
16250 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20 20  sqlite3* db, .  
16260 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
16270 65 2c 20 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  e, .  int enc, .
16280 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
16290 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
162a0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
162b0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
162c0 6f 69 64 2a 29 2c 0a 20 20 76 6f 69 64 28 2a 78  oid*),.  void(*x
162d0 44 65 6c 29 28 76 6f 69 64 2a 29 0a 29 7b 0a 20  Del)(void*).){. 
162e0 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74   int rc;.  sqlit
162f0 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64  e3_mutex_enter(d
16300 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 61 73 73  b->mutex);.  ass
16310 65 72 74 28 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63  ert( !db->malloc
16320 46 61 69 6c 65 64 20 29 3b 0a 20 20 72 63 20 3d  Failed );.  rc =
16330 20 63 72 65 61 74 65 43 6f 6c 6c 61 74 69 6f 6e   createCollation
16340 28 64 62 2c 20 7a 4e 61 6d 65 2c 20 28 75 38 29  (db, zName, (u8)
16350 65 6e 63 2c 20 70 43 74 78 2c 20 78 43 6f 6d 70  enc, pCtx, xComp
16360 61 72 65 2c 20 78 44 65 6c 29 3b 0a 20 20 72 63  are, xDel);.  rc
16370 20 3d 20 73 71 6c 69 74 65 33 41 70 69 45 78 69   = sqlite3ApiExi
16380 74 28 64 62 2c 20 72 63 29 3b 0a 20 20 73 71 6c  t(db, rc);.  sql
16390 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
163a0 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 72  (db->mutex);.  r
163b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66  eturn rc;.}..#if
163c0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
163d0 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
163e0 69 73 74 65 72 20 61 20 6e 65 77 20 63 6f 6c 6c  ister a new coll
163f0 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 77  ation sequence w
16400 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
16410 20 68 61 6e 64 6c 65 20 64 62 2e 0a 2a 2f 0a 69   handle db..*/.i
16420 6e 74 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74  nt sqlite3_creat
16430 65 5f 63 6f 6c 6c 61 74 69 6f 6e 31 36 28 0a 20  e_collation16(. 
16440 20 73 71 6c 69 74 65 33 2a 20 64 62 2c 20 0a 20   sqlite3* db, . 
16450 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 4e 61   const void *zNa
16460 6d 65 2c 0a 20 20 69 6e 74 20 65 6e 63 2c 20 0a  me,.  int enc, .
16470 20 20 76 6f 69 64 2a 20 70 43 74 78 2c 0a 20 20    void* pCtx,.  
16480 69 6e 74 28 2a 78 43 6f 6d 70 61 72 65 29 28 76  int(*xCompare)(v
16490 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
164a0 6f 69 64 2a 2c 69 6e 74 2c 63 6f 6e 73 74 20 76  oid*,int,const v
164b0 6f 69 64 2a 29 0a 29 7b 0a 20 20 69 6e 74 20 72  oid*).){.  int r
164c0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
164d0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 38 3b 0a 20   char *zName8;. 
164e0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
164f0 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
16500 0a 20 20 61 73 73 65 72 74 28 20 21 64 62 2d 3e  .  assert( !db->
16510 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a  mallocFailed );.
16520 20 20 7a 4e 61 6d 65 38 20 3d 20 73 71 6c 69 74    zName8 = sqlit
16530 65 33 55 74 66 31 36 74 6f 38 28 64 62 2c 20 7a  e3Utf16to8(db, z
16540 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
16550 5f 55 54 46 31 36 4e 41 54 49 56 45 29 3b 0a 20  _UTF16NATIVE);. 
16560 20 69 66 28 20 7a 4e 61 6d 65 38 20 29 7b 0a 20   if( zName8 ){. 
16570 20 20 20 72 63 20 3d 20 63 72 65 61 74 65 43 6f     rc = createCo
16580 6c 6c 61 74 69 6f 6e 28 64 62 2c 20 7a 4e 61 6d  llation(db, zNam
16590 65 38 2c 20 28 75 38 29 65 6e 63 2c 20 70 43 74  e8, (u8)enc, pCt
165a0 78 2c 20 78 43 6f 6d 70 61 72 65 2c 20 30 29 3b  x, xCompare, 0);
165b0 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
165c0 65 65 28 64 62 2c 20 7a 4e 61 6d 65 38 29 3b 0a  ee(db, zName8);.
165d0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
165e0 65 33 41 70 69 45 78 69 74 28 64 62 2c 20 72 63  e3ApiExit(db, rc
165f0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  );.  sqlite3_mut
16600 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74  ex_leave(db->mut
16610 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ex);.  return rc
16620 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
16630 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36 20  LITE_OMIT_UTF16 
16640 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 67 69 73 74  */../*.** Regist
16650 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  er a collation s
16660 65 71 75 65 6e 63 65 20 66 61 63 74 6f 72 79 20  equence factory 
16670 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68  callback with th
16680 65 20 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c  e database handl
16690 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c 61 63 65  e.** db. Replace
166a0 20 61 6e 79 20 70 72 65 76 69 6f 75 73 6c 79 20   any previously 
166b0 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c 6c 61 74  installed collat
166c0 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63  ion sequence fac
166d0 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tory..*/.int sql
166e0 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f 6e 5f 6e  ite3_collation_n
166f0 65 65 64 65 64 28 0a 20 20 73 71 6c 69 74 65 33  eeded(.  sqlite3
16700 20 2a 64 62 2c 20 0a 20 20 76 6f 69 64 20 2a 70   *db, .  void *p
16710 43 6f 6c 6c 4e 65 65 64 65 64 41 72 67 2c 20 0a  CollNeededArg, .
16720 20 20 76 6f 69 64 28 2a 78 43 6f 6c 6c 4e 65 65    void(*xCollNee
16730 64 65 64 29 28 76 6f 69 64 2a 2c 73 71 6c 69 74  ded)(void*,sqlit
16740 65 33 2a 2c 69 6e 74 20 65 54 65 78 74 52 65 70  e3*,int eTextRep
16750 2c 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b  ,const char*).){
16760 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
16770 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78  _enter(db->mutex
16780 29 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65  );.  db->xCollNe
16790 65 64 65 64 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  eded = xCollNeed
167a0 65 64 3b 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e  ed;.  db->xCollN
167b0 65 65 64 65 64 31 36 20 3d 20 30 3b 0a 20 20 64  eeded16 = 0;.  d
167c0 62 2d 3e 70 43 6f 6c 6c 4e 65 65 64 65 64 41 72  b->pCollNeededAr
167d0 67 20 3d 20 70 43 6f 6c 6c 4e 65 65 64 65 64 41  g = pCollNeededA
167e0 72 67 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75  rg;.  sqlite3_mu
167f0 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75  tex_leave(db->mu
16800 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  tex);.  return S
16810 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66  QLITE_OK;.}..#if
16820 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
16830 5f 55 54 46 31 36 0a 2f 2a 0a 2a 2a 20 52 65 67  _UTF16./*.** Reg
16840 69 73 74 65 72 20 61 20 63 6f 6c 6c 61 74 69 6f  ister a collatio
16850 6e 20 73 65 71 75 65 6e 63 65 20 66 61 63 74 6f  n sequence facto
16860 72 79 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68  ry callback with
16870 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
16880 6e 64 6c 65 0a 2a 2a 20 64 62 2e 20 52 65 70 6c  ndle.** db. Repl
16890 61 63 65 20 61 6e 79 20 70 72 65 76 69 6f 75 73  ace any previous
168a0 6c 79 20 69 6e 73 74 61 6c 6c 65 64 20 63 6f 6c  ly installed col
168b0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
168c0 66 61 63 74 6f 72 79 2e 0a 2a 2f 0a 69 6e 74 20  factory..*/.int 
168d0 73 71 6c 69 74 65 33 5f 63 6f 6c 6c 61 74 69 6f  sqlite3_collatio
168e0 6e 5f 6e 65 65 64 65 64 31 36 28 0a 20 20 73 71  n_needed16(.  sq
168f0 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 76 6f  lite3 *db, .  vo
16900 69 64 20 2a 70 43 6f 6c 6c 4e 65 65 64 65 64 41  id *pCollNeededA
16910 72 67 2c 20 0a 20 20 76 6f 69 64 28 2a 78 43 6f  rg, .  void(*xCo
16920 6c 6c 4e 65 65 64 65 64 31 36 29 28 76 6f 69 64  llNeeded16)(void
16930 2a 2c 73 71 6c 69 74 65 33 2a 2c 69 6e 74 20 65  *,sqlite3*,int e
16940 54 65 78 74 52 65 70 2c 63 6f 6e 73 74 20 76 6f  TextRep,const vo
16950 69 64 2a 29 0a 29 7b 0a 20 20 73 71 6c 69 74 65  id*).){.  sqlite
16960 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 64 62  3_mutex_enter(db
16970 2d 3e 6d 75 74 65 78 29 3b 0a 20 20 64 62 2d 3e  ->mutex);.  db->
16980 78 43 6f 6c 6c 4e 65 65 64 65 64 20 3d 20 30 3b  xCollNeeded = 0;
16990 0a 20 20 64 62 2d 3e 78 43 6f 6c 6c 4e 65 65 64  .  db->xCollNeed
169a0 65 64 31 36 20 3d 20 78 43 6f 6c 6c 4e 65 65 64  ed16 = xCollNeed
169b0 65 64 31 36 3b 0a 20 20 64 62 2d 3e 70 43 6f 6c  ed16;.  db->pCol
169c0 6c 4e 65 65 64 65 64 41 72 67 20 3d 20 70 43 6f  lNeededArg = pCo
169d0 6c 6c 4e 65 65 64 65 64 41 72 67 3b 0a 20 20 73  llNeededArg;.  s
169e0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
169f0 76 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20  ve(db->mutex);. 
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 20 2f 2a 20 53  K;.}.#endif /* S
16a20 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 54 46 31 36  QLITE_OMIT_UTF16
16a30 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c   */..#ifndef SQL
16a40 49 54 45 5f 4f 4d 49 54 5f 44 45 50 52 45 43 41  ITE_OMIT_DEPRECA
16a50 54 45 44 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  TED./*.** This f
16a60 75 6e 63 74 69 6f 6e 20 69 73 20 6e 6f 77 20 61  unction is now a
16a70 6e 20 61 6e 61 63 68 72 6f 6e 69 73 6d 2e 20 49  n anachronism. I
16a80 74 20 75 73 65 64 20 74 6f 20 62 65 20 75 73 65  t used to be use
16a90 64 20 74 6f 20 72 65 63 6f 76 65 72 20 66 72 6f  d to recover fro
16aa0 6d 20 61 0a 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20  m a.** malloc() 
16ab0 66 61 69 6c 75 72 65 2c 20 62 75 74 20 53 51 4c  failure, but SQL
16ac0 69 74 65 20 6e 6f 77 20 64 6f 65 73 20 74 68 69  ite now does thi
16ad0 73 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e  s automatically.
16ae0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
16af0 67 6c 6f 62 61 6c 5f 72 65 63 6f 76 65 72 28 76  global_recover(v
16b00 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 53  oid){.  return S
16b10 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
16b20 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74  if../*.** Test t
16b30 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f 72  o see whether or
16b40 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62 61 73   not the databas
16b50 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
16b60 69 6e 20 61 75 74 6f 63 6f 6d 6d 69 74 0a 2a 2a  in autocommit.**
16b70 20 6d 6f 64 65 2e 20 20 52 65 74 75 72 6e 20 54   mode.  Return T
16b80 52 55 45 20 69 66 20 69 74 20 69 73 20 61 6e 64  RUE if it is and
16b90 20 46 41 4c 53 45 20 69 66 20 6e 6f 74 2e 20 20   FALSE if not.  
16ba0 41 75 74 6f 63 6f 6d 6d 69 74 20 6d 6f 64 65 20  Autocommit mode 
16bb0 69 73 20 6f 6e 0a 2a 2a 20 62 79 20 64 65 66 61  is on.** by defa
16bc0 75 6c 74 2e 20 20 41 75 74 6f 63 6f 6d 6d 69 74  ult.  Autocommit
16bd0 20 69 73 20 64 69 73 61 62 6c 65 64 20 62 79 20   is disabled by 
16be0 61 20 42 45 47 49 4e 20 73 74 61 74 65 6d 65 6e  a BEGIN statemen
16bf0 74 20 61 6e 64 20 72 65 65 6e 61 62 6c 65 64 0a  t and reenabled.
16c00 2a 2a 20 62 79 20 74 68 65 20 6e 65 78 74 20 43  ** by the next C
16c10 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43  OMMIT or ROLLBAC
16c20 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  K..*/.int sqlite
16c30 33 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74  3_get_autocommit
16c40 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
16c50 20 72 65 74 75 72 6e 20 64 62 2d 3e 61 75 74 6f   return db->auto
16c60 43 6f 6d 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Commit;.}../*.**
16c70 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72   The following r
16c80 6f 75 74 69 6e 65 73 20 61 72 65 20 73 75 62 73  outines are subs
16c90 74 69 74 75 74 65 73 20 66 6f 72 20 63 6f 6e 73  titutes for cons
16ca0 74 61 6e 74 73 20 53 51 4c 49 54 45 5f 43 4f 52  tants SQLITE_COR
16cb0 52 55 50 54 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f  RUPT,.** SQLITE_
16cc0 4d 49 53 55 53 45 2c 20 53 51 4c 49 54 45 5f 43  MISUSE, SQLITE_C
16cd0 41 4e 54 4f 50 45 4e 2c 20 53 51 4c 49 54 45 5f  ANTOPEN, SQLITE_
16ce0 49 4f 45 52 52 20 61 6e 64 20 70 6f 73 73 69 62  IOERR and possib
16cf0 6c 79 20 6f 74 68 65 72 20 65 72 72 6f 72 0a 2a  ly other error.*
16d00 2a 20 63 6f 6e 73 74 61 6e 74 73 2e 20 20 54 68  * constants.  Th
16d10 65 79 20 73 65 72 76 65 20 74 77 6f 20 70 75 72  ey serve two pur
16d20 70 6f 73 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31  poses:.**.**   1
16d30 2e 20 20 53 65 72 76 65 20 61 73 20 61 20 63 6f  .  Serve as a co
16d40 6e 76 65 6e 69 65 6e 74 20 70 6c 61 63 65 20 74  nvenient place t
16d50 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
16d60 6e 74 20 69 6e 20 61 20 64 65 62 75 67 67 65 72  nt in a debugger
16d70 0a 2a 2a 20 20 20 20 20 20 20 74 6f 20 64 65 74  .**       to det
16d80 65 63 74 20 77 68 65 6e 20 76 65 72 73 69 6f 6e  ect when version
16d90 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
16da0 73 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20  s occurs..**.** 
16db0 20 20 32 2e 20 20 49 6e 76 6f 6b 65 20 73 71 6c    2.  Invoke sql
16dc0 69 74 65 33 5f 6c 6f 67 28 29 20 74 6f 20 70 72  ite3_log() to pr
16dd0 6f 76 69 64 65 20 74 68 65 20 73 6f 75 72 63 65  ovide the source
16de0 20 63 6f 64 65 20 6c 6f 63 61 74 69 6f 6e 20 77   code location w
16df0 68 65 72 65 0a 2a 2a 20 20 20 20 20 20 20 61 20  here.**       a 
16e00 6c 6f 77 2d 6c 65 76 65 6c 20 65 72 72 6f 72 20  low-level error 
16e10 69 73 20 66 69 72 73 74 20 64 65 74 65 63 74 65  is first detecte
16e20 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
16e30 33 43 6f 72 72 75 70 74 45 72 72 6f 72 28 69 6e  3CorruptError(in
16e40 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65 73  t lineno){.  tes
16e50 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47 6c  tcase( sqlite3Gl
16e60 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67 21  obalConfig.xLog!
16e70 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  =0 );.  sqlite3_
16e80 6c 6f 67 28 53 51 4c 49 54 45 5f 43 4f 52 52 55  log(SQLITE_CORRU
16e90 50 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  PT,.            
16ea0 20 20 22 64 61 74 61 62 61 73 65 20 63 6f 72 72    "database corr
16eb0 75 70 74 69 6f 6e 20 61 74 20 6c 69 6e 65 20 25  uption at line %
16ec0 64 20 6f 66 20 5b 25 2e 31 30 73 5d 22 2c 0a 20  d of [%.10s]",. 
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e               lin
16ee0 65 6e 6f 2c 20 32 30 2b 73 71 6c 69 74 65 33 5f  eno, 20+sqlite3_
16ef0 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 72  sourceid());.  r
16f00 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
16f10 52 55 50 54 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69  RUPT;.}.int sqli
16f20 74 65 33 4d 69 73 75 73 65 45 72 72 6f 72 28 69  te3MisuseError(i
16f30 6e 74 20 6c 69 6e 65 6e 6f 29 7b 0a 20 20 74 65  nt lineno){.  te
16f40 73 74 63 61 73 65 28 20 73 71 6c 69 74 65 33 47  stcase( sqlite3G
16f50 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 4c 6f 67  lobalConfig.xLog
16f60 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  !=0 );.  sqlite3
16f70 5f 6c 6f 67 28 53 51 4c 49 54 45 5f 4d 49 53 55  _log(SQLITE_MISU
16f80 53 45 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  SE, .           
16f90 20 20 20 22 6d 69 73 75 73 65 20 61 74 20 6c 69     "misuse at li
16fa0 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73 5d  ne %d of [%.10s]
16fb0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
16fc0 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c 69   lineno, 20+sqli
16fd0 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29 3b  te3_sourceid());
16fe0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
16ff0 5f 4d 49 53 55 53 45 3b 0a 7d 0a 69 6e 74 20 73  _MISUSE;.}.int s
17000 71 6c 69 74 65 33 43 61 6e 74 6f 70 65 6e 45 72  qlite3CantopenEr
17010 72 6f 72 28 69 6e 74 20 6c 69 6e 65 6e 6f 29 7b  ror(int lineno){
17020 0a 20 20 74 65 73 74 63 61 73 65 28 20 73 71 6c  .  testcase( sql
17030 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69 67  ite3GlobalConfig
17040 2e 78 4c 6f 67 21 3d 30 20 29 3b 0a 20 20 73 71  .xLog!=0 );.  sq
17050 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54 45  lite3_log(SQLITE
17060 5f 43 41 4e 54 4f 50 45 4e 2c 20 0a 20 20 20 20  _CANTOPEN, .    
17070 20 20 20 20 20 20 20 20 20 20 22 63 61 6e 6e 6f            "canno
17080 74 20 6f 70 65 6e 20 66 69 6c 65 20 61 74 20 6c  t open file at l
17090 69 6e 65 20 25 64 20 6f 66 20 5b 25 2e 31 30 73  ine %d of [%.10s
170a0 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]",.            
170b0 20 20 6c 69 6e 65 6e 6f 2c 20 32 30 2b 73 71 6c    lineno, 20+sql
170c0 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
170d0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
170e0 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 7d 0a 0a 0a  E_CANTOPEN;.}...
170f0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
17100 4d 49 54 5f 44 45 50 52 45 43 41 54 45 44 0a 2f  MIT_DEPRECATED./
17110 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 63  *.** This is a c
17120 6f 6e 76 65 6e 69 65 6e 63 65 20 72 6f 75 74 69  onvenience routi
17130 6e 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ne that makes su
17140 72 65 20 74 68 61 74 20 61 6c 6c 20 74 68 72 65  re that all thre
17150 61 64 2d 73 70 65 63 69 66 69 63 0a 2a 2a 20 64  ad-specific.** d
17160 61 74 61 20 66 6f 72 20 74 68 69 73 20 74 68 72  ata for this thr
17170 65 61 64 20 68 61 73 20 62 65 65 6e 20 64 65 61  ead has been dea
17180 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
17190 53 51 4c 69 74 65 20 6e 6f 20 6c 6f 6e 67 65 72  SQLite no longer
171a0 20 75 73 65 73 20 74 68 72 65 61 64 2d 73 70 65   uses thread-spe
171b0 63 69 66 69 63 20 64 61 74 61 20 73 6f 20 74 68  cific data so th
171c0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 6e 6f  is routine is no
171d0 77 20 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 20 49  w a.** no-op.  I
171e0 74 20 69 73 20 72 65 74 61 69 6e 65 64 20 66 6f  t is retained fo
171f0 72 20 68 69 73 74 6f 72 69 63 61 6c 20 63 6f 6d  r historical com
17200 70 61 74 69 62 69 6c 69 74 79 2e 0a 2a 2f 0a 76  patibility..*/.v
17210 6f 69 64 20 73 71 6c 69 74 65 33 5f 74 68 72 65  oid sqlite3_thre
17220 61 64 5f 63 6c 65 61 6e 75 70 28 76 6f 69 64 29  ad_cleanup(void)
17230 7b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  {.}.#endif../*.*
17240 2a 20 52 65 74 75 72 6e 20 6d 65 74 61 20 69 6e  * Return meta in
17250 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
17260 61 20 73 70 65 63 69 66 69 63 20 63 6f 6c 75 6d  a specific colum
17270 6e 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20  n of a database 
17280 74 61 62 6c 65 2e 0a 2a 2a 20 53 65 65 20 63 6f  table..** See co
17290 6d 6d 65 6e 74 20 69 6e 20 73 71 6c 69 74 65 33  mment in sqlite3
172a0 2e 68 20 28 73 71 6c 69 74 65 2e 68 2e 69 6e 29  .h (sqlite.h.in)
172b0 20 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f   for details..*/
172c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
172d0 4e 41 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54  NABLE_COLUMN_MET
172e0 41 44 41 54 41 0a 69 6e 74 20 73 71 6c 69 74 65  ADATA.int sqlite
172f0 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
17300 65 74 61 64 61 74 61 28 0a 20 20 73 71 6c 69 74  etadata(.  sqlit
17310 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
17320 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 6e 65 63         /* Connec
17330 74 69 6f 6e 20 68 61 6e 64 6c 65 20 2a 2f 0a 20  tion handle */. 
17340 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
17350 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  Name,        /* 
17360 44 61 74 61 62 61 73 65 20 6e 61 6d 65 20 6f 72  Database name or
17370 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
17380 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 4e 61 6d   char *zTableNam
17390 65 2c 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20  e,     /* Table 
173a0 6e 61 6d 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  name */.  const 
173b0 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 4e 61 6d  char *zColumnNam
173c0 65 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  e,    /* Column 
173d0 6e 61 6d 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  name */.  char c
173e0 6f 6e 73 74 20 2a 2a 70 7a 44 61 74 61 54 79 70  onst **pzDataTyp
173f0 65 2c 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a  e,    /* OUTPUT:
17400 20 44 65 63 6c 61 72 65 64 20 64 61 74 61 20 74   Declared data t
17410 79 70 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ype */.  char co
17420 6e 73 74 20 2a 2a 70 7a 43 6f 6c 6c 53 65 71 2c  nst **pzCollSeq,
17430 20 20 20 20 20 2f 2a 20 4f 55 54 50 55 54 3a 20       /* OUTPUT: 
17440 43 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  Collation sequen
17450 63 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74  ce name */.  int
17460 20 2a 70 4e 6f 74 4e 75 6c 6c 2c 20 20 20 20 20   *pNotNull,     
17470 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50           /* OUTP
17480 55 54 3a 20 54 72 75 65 20 69 66 20 4e 4f 54 20  UT: True if NOT 
17490 4e 55 4c 4c 20 63 6f 6e 73 74 72 61 69 6e 74 20  NULL constraint 
174a0 65 78 69 73 74 73 20 2a 2f 0a 20 20 69 6e 74 20  exists */.  int 
174b0 2a 70 50 72 69 6d 61 72 79 4b 65 79 2c 20 20 20  *pPrimaryKey,   
174c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 50 55          /* OUTPU
174d0 54 3a 20 54 72 75 65 20 69 66 20 63 6f 6c 75 6d  T: True if colum
174e0 6e 20 70 61 72 74 20 6f 66 20 50 4b 20 2a 2f 0a  n part of PK */.
174f0 20 20 69 6e 74 20 2a 70 41 75 74 6f 69 6e 63 20    int *pAutoinc 
17500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17510 20 4f 55 54 50 55 54 3a 20 54 72 75 65 20 69 66   OUTPUT: True if
17520 20 63 6f 6c 75 6d 6e 20 69 73 20 61 75 74 6f 2d   column is auto-
17530 69 6e 63 72 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  increment */.){.
17540 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72    int rc;.  char
17550 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
17560 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30   Table *pTab = 0
17570 3b 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c  ;.  Column *pCol
17580 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6c   = 0;.  int iCol
17590 3b 0a 0a 20 20 63 68 61 72 20 63 6f 6e 73 74 20  ;..  char const 
175a0 2a 7a 44 61 74 61 54 79 70 65 20 3d 20 30 3b 0a  *zDataType = 0;.
175b0 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 7a 43    char const *zC
175c0 6f 6c 6c 53 65 71 20 3d 20 30 3b 0a 20 20 69 6e  ollSeq = 0;.  in
175d0 74 20 6e 6f 74 6e 75 6c 6c 20 3d 20 30 3b 0a 20  t notnull = 0;. 
175e0 20 69 6e 74 20 70 72 69 6d 61 72 79 6b 65 79 20   int primarykey 
175f0 3d 20 30 3b 0a 20 20 69 6e 74 20 61 75 74 6f 69  = 0;.  int autoi
17600 6e 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 45 6e  nc = 0;..  /* En
17610 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
17620 65 20 73 63 68 65 6d 61 20 68 61 73 20 62 65 65  e schema has bee
17630 6e 20 6c 6f 61 64 65 64 20 2a 2f 0a 20 20 73 71  n loaded */.  sq
17640 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
17650 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  r(db->mutex);.  
17660 73 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65  sqlite3BtreeEnte
17670 72 41 6c 6c 28 64 62 29 3b 0a 20 20 72 63 20 3d  rAll(db);.  rc =
17680 20 73 71 6c 69 74 65 33 49 6e 69 74 28 64 62 2c   sqlite3Init(db,
17690 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66   &zErrMsg);.  if
176a0 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 72 63 20  ( SQLITE_OK!=rc 
176b0 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  ){.    goto erro
176c0 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
176d0 20 4c 6f 63 61 74 65 20 74 68 65 20 74 61 62 6c   Locate the tabl
176e0 65 20 69 6e 20 71 75 65 73 74 69 6f 6e 20 2a 2f  e in question */
176f0 0a 20 20 70 54 61 62 20 3d 20 73 71 6c 69 74 65  .  pTab = sqlite
17700 33 46 69 6e 64 54 61 62 6c 65 28 64 62 2c 20 7a  3FindTable(db, z
17710 54 61 62 6c 65 4e 61 6d 65 2c 20 7a 44 62 4e 61  TableName, zDbNa
17720 6d 65 29 3b 0a 20 20 69 66 28 20 21 70 54 61 62  me);.  if( !pTab
17730 20 7c 7c 20 70 54 61 62 2d 3e 70 53 65 6c 65 63   || pTab->pSelec
17740 74 20 29 7b 0a 20 20 20 20 70 54 61 62 20 3d 20  t ){.    pTab = 
17750 30 3b 0a 20 20 20 20 67 6f 74 6f 20 65 72 72 6f  0;.    goto erro
17760 72 5f 6f 75 74 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  r_out;.  }..  /*
17770 20 46 69 6e 64 20 74 68 65 20 63 6f 6c 75 6d 6e   Find the column
17780 20 66 6f 72 20 77 68 69 63 68 20 69 6e 66 6f 20   for which info 
17790 69 73 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a  is requested */.
177a0 20 20 69 66 28 20 73 71 6c 69 74 65 33 49 73 52    if( sqlite3IsR
177b0 6f 77 69 64 28 7a 43 6f 6c 75 6d 6e 4e 61 6d 65  owid(zColumnName
177c0 29 20 29 7b 0a 20 20 20 20 69 43 6f 6c 20 3d 20  ) ){.    iCol = 
177d0 70 54 61 62 2d 3e 69 50 4b 65 79 3b 0a 20 20 20  pTab->iPKey;.   
177e0 20 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a   if( iCol>=0 ){.
177f0 20 20 20 20 20 20 70 43 6f 6c 20 3d 20 26 70 54        pCol = &pT
17800 61 62 2d 3e 61 43 6f 6c 5b 69 43 6f 6c 5d 3b 0a  ab->aCol[iCol];.
17810 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
17820 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 3b 20 69     for(iCol=0; i
17830 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20  Col<pTab->nCol; 
17840 69 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 70  iCol++){.      p
17850 43 6f 6c 20 3d 20 26 70 54 61 62 2d 3e 61 43 6f  Col = &pTab->aCo
17860 6c 5b 69 43 6f 6c 5d 3b 0a 20 20 20 20 20 20 69  l[iCol];.      i
17870 66 28 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72  f( 0==sqlite3Str
17880 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
17890 2c 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65 29 20 29  , zColumnName) )
178a0 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
178b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
178c0 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70 54 61     if( iCol==pTa
178d0 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20  b->nCol ){.     
178e0 20 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20   pTab = 0;.     
178f0 20 67 6f 74 6f 20 65 72 72 6f 72 5f 6f 75 74 3b   goto error_out;
17900 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
17910 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
17920 6c 6f 63 6b 20 73 74 6f 72 65 73 20 74 68 65 20  lock stores the 
17930 6d 65 74 61 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  meta information
17940 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 72 65   that will be re
17950 74 75 72 6e 65 64 0a 20 20 2a 2a 20 74 6f 20 74  turned.  ** to t
17960 68 65 20 63 61 6c 6c 65 72 20 69 6e 20 6c 6f 63  he caller in loc
17970 61 6c 20 76 61 72 69 61 62 6c 65 73 20 7a 44 61  al variables zDa
17980 74 61 54 79 70 65 2c 20 7a 43 6f 6c 6c 53 65 71  taType, zCollSeq
17990 2c 20 6e 6f 74 6e 75 6c 6c 2c 20 70 72 69 6d 61  , notnull, prima
179a0 72 79 6b 65 79 0a 20 20 2a 2a 20 61 6e 64 20 61  rykey.  ** and a
179b0 75 74 6f 69 6e 63 2e 20 41 74 20 74 68 69 73 20  utoinc. At this 
179c0 70 6f 69 6e 74 20 74 68 65 72 65 20 61 72 65 20  point there are 
179d0 74 77 6f 20 70 6f 73 73 69 62 69 6c 69 74 69 65  two possibilitie
179e0 73 3a 0a 20 20 2a 2a 20 0a 20 20 2a 2a 20 20 20  s:.  ** .  **   
179f0 20 20 31 2e 20 54 68 65 20 73 70 65 63 69 66 69    1. The specifi
17a00 65 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 77  ed column name w
17a10 61 73 20 72 6f 77 69 64 22 2c 20 22 6f 69 64 22  as rowid", "oid"
17a20 20 6f 72 20 22 5f 72 6f 77 69 64 5f 22 20 0a 20   or "_rowid_" . 
17a30 20 2a 2a 20 20 20 20 20 20 20 20 61 6e 64 20 74   **        and t
17a40 68 65 72 65 20 69 73 20 6e 6f 20 65 78 70 6c 69  here is no expli
17a50 63 69 74 6c 79 20 64 65 63 6c 61 72 65 64 20 49  citly declared I
17a60 50 4b 20 63 6f 6c 75 6d 6e 2e 20 0a 20 20 2a 2a  PK column. .  **
17a70 0a 20 20 2a 2a 20 20 20 20 20 32 2e 20 54 68 65  .  **     2. The
17a80 20 74 61 62 6c 65 20 69 73 20 6e 6f 74 20 61 20   table is not a 
17a90 76 69 65 77 20 61 6e 64 20 74 68 65 20 63 6f 6c  view and the col
17aa0 75 6d 6e 20 6e 61 6d 65 20 69 64 65 6e 74 69 66  umn name identif
17ab0 69 65 64 20 61 6e 20 0a 20 20 2a 2a 20 20 20 20  ied an .  **    
17ac0 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20 64      explicitly d
17ad0 65 63 6c 61 72 65 64 20 63 6f 6c 75 6d 6e 2e 20  eclared column. 
17ae0 43 6f 70 79 20 6d 65 74 61 20 69 6e 66 6f 72 6d  Copy meta inform
17af0 61 74 69 6f 6e 20 66 72 6f 6d 20 2a 70 43 6f 6c  ation from *pCol
17b00 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 70 43  ..  */ .  if( pC
17b10 6f 6c 20 29 7b 0a 20 20 20 20 7a 44 61 74 61 54  ol ){.    zDataT
17b20 79 70 65 20 3d 20 70 43 6f 6c 2d 3e 7a 54 79 70  ype = pCol->zTyp
17b30 65 3b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20  e;.    zCollSeq 
17b40 3d 20 70 43 6f 6c 2d 3e 7a 43 6f 6c 6c 3b 0a 20  = pCol->zColl;. 
17b50 20 20 20 6e 6f 74 6e 75 6c 6c 20 3d 20 70 43 6f     notnull = pCo
17b60 6c 2d 3e 6e 6f 74 4e 75 6c 6c 21 3d 30 3b 0a 20  l->notNull!=0;. 
17b70 20 20 20 70 72 69 6d 61 72 79 6b 65 79 20 20 3d     primarykey  =
17b80 20 28 70 43 6f 6c 2d 3e 63 6f 6c 46 6c 61 67 73   (pCol->colFlags
17b90 20 26 20 43 4f 4c 46 4c 41 47 5f 50 52 49 4d 4b   & COLFLAG_PRIMK
17ba0 45 59 29 21 3d 30 3b 0a 20 20 20 20 61 75 74 6f  EY)!=0;.    auto
17bb0 69 6e 63 20 3d 20 70 54 61 62 2d 3e 69 50 4b 65  inc = pTab->iPKe
17bc0 79 3d 3d 69 43 6f 6c 20 26 26 20 28 70 54 61 62  y==iCol && (pTab
17bd0 2d 3e 74 61 62 46 6c 61 67 73 20 26 20 54 46 5f  ->tabFlags & TF_
17be0 41 75 74 6f 69 6e 63 72 65 6d 65 6e 74 29 21 3d  Autoincrement)!=
17bf0 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
17c00 7a 44 61 74 61 54 79 70 65 20 3d 20 22 49 4e 54  zDataType = "INT
17c10 45 47 45 52 22 3b 0a 20 20 20 20 70 72 69 6d 61  EGER";.    prima
17c20 72 79 6b 65 79 20 3d 20 31 3b 0a 20 20 7d 0a 20  rykey = 1;.  }. 
17c30 20 69 66 28 20 21 7a 43 6f 6c 6c 53 65 71 20 29   if( !zCollSeq )
17c40 7b 0a 20 20 20 20 7a 43 6f 6c 6c 53 65 71 20 3d  {.    zCollSeq =
17c50 20 22 42 49 4e 41 52 59 22 3b 0a 20 20 7d 0a 0a   "BINARY";.  }..
17c60 65 72 72 6f 72 5f 6f 75 74 3a 0a 20 20 73 71 6c  error_out:.  sql
17c70 69 74 65 33 42 74 72 65 65 4c 65 61 76 65 41 6c  ite3BtreeLeaveAl
17c80 6c 28 64 62 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  l(db);..  /* Whe
17c90 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f  ther the functio
17ca0 6e 20 63 61 6c 6c 20 73 75 63 63 65 65 64 65 64  n call succeeded
17cb0 20 6f 72 20 66 61 69 6c 65 64 2c 20 73 65 74 20   or failed, set 
17cc0 74 68 65 20 6f 75 74 70 75 74 20 70 61 72 61 6d  the output param
17cd0 65 74 65 72 73 0a 20 20 2a 2a 20 74 6f 20 77 68  eters.  ** to wh
17ce0 61 74 65 76 65 72 20 74 68 65 69 72 20 6c 6f 63  atever their loc
17cf0 61 6c 20 63 6f 75 6e 74 65 72 70 61 72 74 73 20  al counterparts 
17d00 63 6f 6e 74 61 69 6e 2e 20 49 66 20 61 6e 20 65  contain. If an e
17d10 72 72 6f 72 20 64 69 64 20 6f 63 63 75 72 2c 0a  rror did occur,.
17d20 20 20 2a 2a 20 74 68 69 73 20 68 61 73 20 74 68    ** this has th
17d30 65 20 65 66 66 65 63 74 20 6f 66 20 7a 65 72 6f  e effect of zero
17d40 69 6e 67 20 61 6c 6c 20 6f 75 74 70 75 74 20 70  ing all output p
17d50 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 2a 2f 0a  arameters..  */.
17d60 20 20 69 66 28 20 70 7a 44 61 74 61 54 79 70 65    if( pzDataType
17d70 20 29 20 2a 70 7a 44 61 74 61 54 79 70 65 20 3d   ) *pzDataType =
17d80 20 7a 44 61 74 61 54 79 70 65 3b 0a 20 20 69 66   zDataType;.  if
17d90 28 20 70 7a 43 6f 6c 6c 53 65 71 20 29 20 2a 70  ( pzCollSeq ) *p
17da0 7a 43 6f 6c 6c 53 65 71 20 3d 20 7a 43 6f 6c 6c  zCollSeq = zColl
17db0 53 65 71 3b 0a 20 20 69 66 28 20 70 4e 6f 74 4e  Seq;.  if( pNotN
17dc0 75 6c 6c 20 29 20 2a 70 4e 6f 74 4e 75 6c 6c 20  ull ) *pNotNull 
17dd0 3d 20 6e 6f 74 6e 75 6c 6c 3b 0a 20 20 69 66 28  = notnull;.  if(
17de0 20 70 50 72 69 6d 61 72 79 4b 65 79 20 29 20 2a   pPrimaryKey ) *
17df0 70 50 72 69 6d 61 72 79 4b 65 79 20 3d 20 70 72  pPrimaryKey = pr
17e00 69 6d 61 72 79 6b 65 79 3b 0a 20 20 69 66 28 20  imarykey;.  if( 
17e10 70 41 75 74 6f 69 6e 63 20 29 20 2a 70 41 75 74  pAutoinc ) *pAut
17e20 6f 69 6e 63 20 3d 20 61 75 74 6f 69 6e 63 3b 0a  oinc = autoinc;.
17e30 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
17e40 3d 3d 72 63 20 26 26 20 21 70 54 61 62 20 29 7b  ==rc && !pTab ){
17e50 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62 46 72  .    sqlite3DbFr
17e60 65 65 28 64 62 2c 20 7a 45 72 72 4d 73 67 29 3b  ee(db, zErrMsg);
17e70 0a 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 73  .    zErrMsg = s
17e80 71 6c 69 74 65 33 4d 50 72 69 6e 74 66 28 64 62  qlite3MPrintf(db
17e90 2c 20 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  , "no such table
17ea0 20 63 6f 6c 75 6d 6e 3a 20 25 73 2e 25 73 22 2c   column: %s.%s",
17eb0 20 7a 54 61 62 6c 65 4e 61 6d 65 2c 0a 20 20 20   zTableName,.   
17ec0 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 4e 61 6d 65       zColumnName
17ed0 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
17ee0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20  TE_ERROR;.  }.  
17ef0 73 71 6c 69 74 65 33 45 72 72 6f 72 57 69 74 68  sqlite3ErrorWith
17f00 4d 73 67 28 64 62 2c 20 72 63 2c 20 28 7a 45 72  Msg(db, rc, (zEr
17f10 72 4d 73 67 3f 22 25 73 22 3a 30 29 2c 20 7a 45  rMsg?"%s":0), zE
17f20 72 72 4d 73 67 29 3b 0a 20 20 73 71 6c 69 74 65  rrMsg);.  sqlite
17f30 33 44 62 46 72 65 65 28 64 62 2c 20 7a 45 72 72  3DbFree(db, zErr
17f40 4d 73 67 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  Msg);.  rc = sql
17f50 69 74 65 33 41 70 69 45 78 69 74 28 64 62 2c 20  ite3ApiExit(db, 
17f60 72 63 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  rc);.  sqlite3_m
17f70 75 74 65 78 5f 6c 65 61 76 65 28 64 62 2d 3e 6d  utex_leave(db->m
17f80 75 74 65 78 29 3b 0a 20 20 72 65 74 75 72 6e 20  utex);.  return 
17f90 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  rc;.}.#endif../*
17fa0 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 61 20  .** Sleep for a 
17fb0 6c 69 74 74 6c 65 20 77 68 69 6c 65 2e 20 20 52  little while.  R
17fc0 65 74 75 72 6e 20 74 68 65 20 61 6d 6f 75 6e 74  eturn the amount
17fd0 20 6f 66 20 74 69 6d 65 20 73 6c 65 70 74 2e 0a   of time slept..
17fe0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 73  */.int sqlite3_s
17ff0 6c 65 65 70 28 69 6e 74 20 6d 73 29 7b 0a 20 20  leep(int ms){.  
18000 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
18010 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70  s;.  int rc;.  p
18020 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
18030 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28  s_find(0);.  if(
18040 20 70 56 66 73 3d 3d 30 20 29 20 72 65 74 75 72   pVfs==0 ) retur
18050 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  n 0;..  /* This 
18060 66 75 6e 63 74 69 6f 6e 20 77 6f 72 6b 73 20 69  function works i
18070 6e 20 6d 69 6c 6c 69 73 65 63 6f 6e 64 73 2c 20  n milliseconds, 
18080 62 75 74 20 74 68 65 20 75 6e 64 65 72 6c 79 69  but the underlyi
18090 6e 67 20 4f 73 53 6c 65 65 70 28 29 20 0a 20 20  ng OsSleep() .  
180a0 2a 2a 20 41 50 49 20 75 73 65 73 20 6d 69 63 72  ** API uses micr
180b0 6f 73 65 63 6f 6e 64 73 2e 20 48 65 6e 63 65 20  oseconds. Hence 
180c0 74 68 65 20 31 30 30 30 27 73 2e 0a 20 20 2a 2f  the 1000's..  */
180d0 0a 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33  .  rc = (sqlite3
180e0 4f 73 53 6c 65 65 70 28 70 56 66 73 2c 20 31 30  OsSleep(pVfs, 10
180f0 30 30 2a 6d 73 29 2f 31 30 30 30 29 3b 0a 20 20  00*ms)/1000);.  
18100 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18110 0a 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64 69  .** Enable or di
18120 73 61 62 6c 65 20 74 68 65 20 65 78 74 65 6e 64  sable the extend
18130 65 64 20 72 65 73 75 6c 74 20 63 6f 64 65 73 2e  ed result codes.
18140 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f  .*/.int sqlite3_
18150 65 78 74 65 6e 64 65 64 5f 72 65 73 75 6c 74 5f  extended_result_
18160 63 6f 64 65 73 28 73 71 6c 69 74 65 33 20 2a 64  codes(sqlite3 *d
18170 62 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 7b 0a 20  b, int onoff){. 
18180 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
18190 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65 78 29 3b  nter(db->mutex);
181a0 0a 20 20 64 62 2d 3e 65 72 72 4d 61 73 6b 20 3d  .  db->errMask =
181b0 20 6f 6e 6f 66 66 20 3f 20 30 78 66 66 66 66 66   onoff ? 0xfffff
181c0 66 66 66 20 3a 20 30 78 66 66 3b 0a 20 20 73 71  fff : 0xff;.  sq
181d0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
181e0 65 28 64 62 2d 3e 6d 75 74 65 78 29 3b 0a 20 20  e(db->mutex);.  
181f0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18200 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 76 6f 6b  ;.}../*.** Invok
18210 65 20 74 68 65 20 78 46 69 6c 65 43 6f 6e 74 72  e the xFileContr
18220 6f 6c 20 6d 65 74 68 6f 64 20 6f 6e 20 61 20 70  ol method on a p
18230 61 72 74 69 63 75 6c 61 72 20 64 61 74 61 62 61  articular databa
18240 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
18250 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
18260 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e  sqlite3 *db, con
18270 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65  st char *zDbName
18280 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
18290 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  pArg){.  int rc 
182a0 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  = SQLITE_ERROR;.
182b0 20 20 42 74 72 65 65 20 2a 70 42 74 72 65 65 3b    Btree *pBtree;
182c0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  ..  sqlite3_mute
182d0 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74 65  x_enter(db->mute
182e0 78 29 3b 0a 20 20 70 42 74 72 65 65 20 3d 20 73  x);.  pBtree = s
182f0 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42 74  qlite3DbNameToBt
18300 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65 29  ree(db, zDbName)
18310 3b 0a 20 20 69 66 28 20 70 42 74 72 65 65 20 29  ;.  if( pBtree )
18320 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61  {.    Pager *pPa
18330 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ger;.    sqlite3
18340 5f 66 69 6c 65 20 2a 66 64 3b 0a 20 20 20 20 73  _file *fd;.    s
18350 71 6c 69 74 65 33 42 74 72 65 65 45 6e 74 65 72  qlite3BtreeEnter
18360 28 70 42 74 72 65 65 29 3b 0a 20 20 20 20 70 50  (pBtree);.    pP
18370 61 67 65 72 20 3d 20 73 71 6c 69 74 65 33 42 74  ager = sqlite3Bt
18380 72 65 65 50 61 67 65 72 28 70 42 74 72 65 65 29  reePager(pBtree)
18390 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
183a0 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 20 20 66  ager!=0 );.    f
183b0 64 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  d = sqlite3Pager
183c0 46 69 6c 65 28 70 50 61 67 65 72 29 3b 0a 20 20  File(pPager);.  
183d0 20 20 61 73 73 65 72 74 28 20 66 64 21 3d 30 20    assert( fd!=0 
183e0 29 3b 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53  );.    if( op==S
183f0 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 46 49 4c 45  QLITE_FCNTL_FILE
18400 5f 50 4f 49 4e 54 45 52 20 29 7b 0a 20 20 20 20  _POINTER ){.    
18410 20 20 2a 28 73 71 6c 69 74 65 33 5f 66 69 6c 65    *(sqlite3_file
18420 2a 2a 29 70 41 72 67 20 3d 20 66 64 3b 0a 20 20  **)pArg = fd;.  
18430 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
18440 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  OK;.    }else if
18450 28 20 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ( fd->pMethods )
18460 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
18470 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
18480 6c 28 66 64 2c 20 6f 70 2c 20 70 41 72 67 29 3b  l(fd, op, pArg);
18490 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
184a0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
184b0 54 46 4f 55 4e 44 3b 0a 20 20 20 20 7d 0a 20 20  TFOUND;.    }.  
184c0 20 20 73 71 6c 69 74 65 33 42 74 72 65 65 4c 65    sqlite3BtreeLe
184d0 61 76 65 28 70 42 74 72 65 65 29 3b 0a 20 20 7d  ave(pBtree);.  }
184e0 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
184f0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
18500 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  );.  return rc; 
18510 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65    .}../*.** Inte
18520 72 66 61 63 65 20 74 6f 20 74 68 65 20 74 65 73  rface to the tes
18530 74 69 6e 67 20 6c 6f 67 69 63 2e 0a 2a 2f 0a 69  ting logic..*/.i
18540 6e 74 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  nt sqlite3_test_
18550 63 6f 6e 74 72 6f 6c 28 69 6e 74 20 6f 70 2c 20  control(int op, 
18560 2e 2e 2e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ...){.  int rc =
18570 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
18580 54 45 5f 4f 4d 49 54 5f 42 55 49 4c 54 49 4e 5f  TE_OMIT_BUILTIN_
18590 54 45 53 54 0a 20 20 76 61 5f 6c 69 73 74 20 61  TEST.  va_list a
185a0 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
185b0 2c 20 6f 70 29 3b 0a 20 20 73 77 69 74 63 68 28  , op);.  switch(
185c0 20 6f 70 20 29 7b 0a 0a 20 20 20 20 2f 2a 0a 20   op ){..    /*. 
185d0 20 20 20 2a 2a 20 53 61 76 65 20 74 68 65 20 63     ** Save the c
185e0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
185f0 74 68 65 20 50 52 4e 47 2e 0a 20 20 20 20 2a 2f  the PRNG..    */
18600 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
18610 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53  _TESTCTRL_PRNG_S
18620 41 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  AVE: {.      sql
18630 69 74 65 33 50 72 6e 67 53 61 76 65 53 74 61 74  ite3PrngSaveStat
18640 65 28 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  e();.      break
18650 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
18660 20 20 20 20 2a 2a 20 52 65 73 74 6f 72 65 20 74      ** Restore t
18670 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
18680 50 52 4e 47 20 74 6f 20 74 68 65 20 6c 61 73 74  PRNG to the last
18690 20 73 74 61 74 65 20 73 61 76 65 64 20 75 73 69   state saved usi
186a0 6e 67 0a 20 20 20 20 2a 2a 20 50 52 4e 47 5f 53  ng.    ** PRNG_S
186b0 41 56 45 2e 20 20 49 66 20 50 52 4e 47 5f 53 41  AVE.  If PRNG_SA
186c0 56 45 20 68 61 73 20 6e 65 76 65 72 20 62 65 66  VE has never bef
186d0 6f 72 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ore been called,
186e0 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 74 68 69   then.    ** thi
186f0 73 20 76 65 72 62 20 61 63 74 73 20 6c 69 6b 65  s verb acts like
18700 20 50 52 4e 47 5f 52 45 53 45 54 2e 0a 20 20 20   PRNG_RESET..   
18710 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
18720 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
18730 47 5f 52 45 53 54 4f 52 45 3a 20 7b 0a 20 20 20  G_RESTORE: {.   
18740 20 20 20 73 71 6c 69 74 65 33 50 72 6e 67 52 65     sqlite3PrngRe
18750 73 74 6f 72 65 53 74 61 74 65 28 29 3b 0a 20 20  storeState();.  
18760 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
18770 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
18780 52 65 73 65 74 20 74 68 65 20 50 52 4e 47 20 62  Reset the PRNG b
18790 61 63 6b 20 74 6f 20 69 74 73 20 75 6e 69 6e 69  ack to its unini
187a0 74 69 61 6c 69 7a 65 64 20 73 74 61 74 65 2e 20  tialized state. 
187b0 20 54 68 65 20 6e 65 78 74 20 63 61 6c 6c 0a 20   The next call. 
187c0 20 20 20 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33     ** to sqlite3
187d0 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 29 20 77 69  _randomness() wi
187e0 6c 6c 20 72 65 73 65 65 64 20 74 68 65 20 50 52  ll reseed the PR
187f0 4e 47 20 75 73 69 6e 67 20 61 20 73 69 6e 67 6c  NG using a singl
18800 65 20 63 61 6c 6c 0a 20 20 20 20 2a 2a 20 74 6f  e call.    ** to
18810 20 74 68 65 20 78 52 61 6e 64 6f 6d 6e 65 73 73   the xRandomness
18820 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 64   method of the d
18830 65 66 61 75 6c 74 20 56 46 53 2e 0a 20 20 20 20  efault VFS..    
18840 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
18850 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
18860 5f 52 45 53 45 54 3a 20 7b 0a 20 20 20 20 20 20  _RESET: {.      
18870 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
18880 73 73 28 30 2c 30 29 3b 0a 20 20 20 20 20 20 62  ss(0,0);.      b
18890 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
188a0 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69   /*.    **  sqli
188b0 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
188c0 28 42 49 54 56 45 43 5f 54 45 53 54 2c 20 73 69  (BITVEC_TEST, si
188d0 7a 65 2c 20 70 72 6f 67 72 61 6d 29 0a 20 20 20  ze, program).   
188e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 75 6e 20 61   **.    ** Run a
188f0 20 74 65 73 74 20 61 67 61 69 6e 73 74 20 61 20   test against a 
18900 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 6f 66  Bitvec object of
18910 20 73 69 7a 65 2e 20 20 54 68 65 20 70 72 6f 67   size.  The prog
18920 72 61 6d 20 61 72 67 75 6d 65 6e 74 0a 20 20 20  ram argument.   
18930 20 2a 2a 20 69 73 20 61 6e 20 61 72 72 61 79 20   ** is an array 
18940 6f 66 20 69 6e 74 65 67 65 72 73 20 74 68 61 74  of integers that
18950 20 64 65 66 69 6e 65 73 20 74 68 65 20 74 65 73   defines the tes
18960 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 6f 6e  t.  Return -1 on
18970 20 61 0a 20 20 20 20 2a 2a 20 6d 65 6d 6f 72 79   a.    ** memory
18980 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
18990 72 2c 20 30 20 6f 6e 20 73 75 63 63 65 73 73 2c  r, 0 on success,
189a0 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f 72   or non-zero for
189b0 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 20 20 2a   an error..    *
189c0 2a 20 53 65 65 20 74 68 65 20 73 71 6c 69 74 65  * See the sqlite
189d0 33 42 69 74 76 65 63 42 75 69 6c 74 69 6e 54 65  3BitvecBuiltinTe
189e0 73 74 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f  st() for additio
189f0 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e  nal information.
18a00 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
18a10 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
18a20 5f 42 49 54 56 45 43 5f 54 45 53 54 3a 20 7b 0a  _BITVEC_TEST: {.
18a30 20 20 20 20 20 20 69 6e 74 20 73 7a 20 3d 20 76        int sz = v
18a40 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 3b 0a  a_arg(ap, int);.
18a50 20 20 20 20 20 20 69 6e 74 20 2a 61 50 72 6f 67        int *aProg
18a60 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
18a70 74 2a 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  t*);.      rc = 
18a80 73 71 6c 69 74 65 33 42 69 74 76 65 63 42 75 69  sqlite3BitvecBui
18a90 6c 74 69 6e 54 65 73 74 28 73 7a 2c 20 61 50 72  ltinTest(sz, aPr
18aa0 6f 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  og);.      break
18ab0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
18ac0 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33 5f      **  sqlite3_
18ad0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 46 41 55  test_control(FAU
18ae0 4c 54 5f 49 4e 53 54 41 4c 4c 2c 20 78 43 61 6c  LT_INSTALL, xCal
18af0 6c 62 61 63 6b 29 0a 20 20 20 20 2a 2a 0a 20 20  lback).    **.  
18b00 20 20 2a 2a 20 41 72 72 61 6e 67 65 20 74 6f 20    ** Arrange to 
18b10 69 6e 76 6f 6b 65 20 78 43 61 6c 6c 62 61 63 6b  invoke xCallback
18b20 28 29 20 77 68 65 6e 65 76 65 72 20 73 71 6c 69  () whenever sqli
18b30 74 65 33 46 61 75 6c 74 53 69 6d 28 29 20 69 73  te3FaultSim() is
18b40 20 63 61 6c 6c 65 64 2c 0a 20 20 20 20 2a 2a 20   called,.    ** 
18b50 69 66 20 78 43 61 6c 6c 62 61 63 6b 20 69 73 20  if xCallback is 
18b60 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a  not NULL..    **
18b70 0a 20 20 20 20 2a 2a 20 41 73 20 61 20 74 65 73  .    ** As a tes
18b80 74 20 6f 66 20 74 68 65 20 66 61 75 6c 74 20 73  t of the fault s
18b90 69 6d 75 6c 61 74 6f 72 20 6d 65 63 68 61 6e 69  imulator mechani
18ba0 73 6d 20 69 74 73 65 6c 66 2c 20 73 71 6c 69 74  sm itself, sqlit
18bb0 65 33 46 61 75 6c 74 53 69 6d 28 30 29 0a 20 20  e3FaultSim(0).  
18bc0 20 20 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 69    ** is called i
18bd0 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
18be0 20 69 6e 73 74 61 6c 6c 69 6e 67 20 74 68 65 20   installing the 
18bf0 6e 65 77 20 63 61 6c 6c 62 61 63 6b 20 61 6e 64  new callback and
18c00 20 74 68 65 20 72 65 74 75 72 6e 0a 20 20 20 20   the return.    
18c10 2a 2a 20 76 61 6c 75 65 20 66 72 6f 6d 20 73 71  ** value from sq
18c20 6c 69 74 65 33 46 61 75 6c 74 53 69 6d 28 30 29  lite3FaultSim(0)
18c30 20 62 65 63 6f 6d 65 73 20 74 68 65 20 72 65 74   becomes the ret
18c40 75 72 6e 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  urn from.    ** 
18c50 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
18c60 74 72 6f 6c 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  trol()..    */. 
18c70 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
18c80 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e  ESTCTRL_FAULT_IN
18c90 53 54 41 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 2f  STALL: {.      /
18ca0 2a 20 4d 53 56 43 20 69 73 20 70 69 63 6b 79 20  * MSVC is picky 
18cb0 61 62 6f 75 74 20 70 75 6c 6c 69 6e 67 20 66 75  about pulling fu
18cc0 6e 63 20 70 74 72 73 20 66 72 6f 6d 20 76 61 20  nc ptrs from va 
18cd0 6c 69 73 74 73 2e 0a 20 20 20 20 20 20 2a 2a 20  lists..      ** 
18ce0 68 74 74 70 3a 2f 2f 73 75 70 70 6f 72 74 2e 6d  http://support.m
18cf0 69 63 72 6f 73 6f 66 74 2e 63 6f 6d 2f 6b 62 2f  icrosoft.com/kb/
18d00 34 37 39 36 31 0a 20 20 20 20 20 20 2a 2a 20 73  47961.      ** s
18d10 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
18d20 69 67 2e 78 54 65 73 74 43 61 6c 6c 62 61 63 6b  ig.xTestCallback
18d30 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e   = va_arg(ap, in
18d40 74 28 2a 29 28 69 6e 74 29 29 3b 0a 20 20 20 20  t(*)(int));.    
18d50 20 20 2a 2f 0a 20 20 20 20 20 20 74 79 70 65 64    */.      typed
18d60 65 66 20 69 6e 74 28 2a 54 45 53 54 43 41 4c 4c  ef int(*TESTCALL
18d70 42 41 43 4b 46 55 4e 43 5f 74 29 28 69 6e 74 29  BACKFUNC_t)(int)
18d80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 47  ;.      sqlite3G
18d90 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 78 54 65 73  lobalConfig.xTes
18da0 74 43 61 6c 6c 62 61 63 6b 20 3d 20 76 61 5f 61  tCallback = va_a
18db0 72 67 28 61 70 2c 20 54 45 53 54 43 41 4c 4c 42  rg(ap, TESTCALLB
18dc0 41 43 4b 46 55 4e 43 5f 74 29 3b 0a 20 20 20 20  ACKFUNC_t);.    
18dd0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 46 61    rc = sqlite3Fa
18de0 75 6c 74 53 69 6d 28 30 29 3b 0a 20 20 20 20 20  ultSim(0);.     
18df0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
18e00 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 20 73 71     /*.    **  sq
18e10 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
18e20 6f 6c 28 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  ol(BENIGN_MALLOC
18e30 5f 48 4f 4f 4b 53 2c 20 78 42 65 67 69 6e 2c 20  _HOOKS, xBegin, 
18e40 78 45 6e 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20  xEnd).    **.   
18e50 20 2a 2a 20 52 65 67 69 73 74 65 72 20 68 6f 6f   ** Register hoo
18e60 6b 73 20 74 6f 20 63 61 6c 6c 20 74 6f 20 69 6e  ks to call to in
18e70 64 69 63 61 74 65 20 77 68 69 63 68 20 6d 61 6c  dicate which mal
18e80 6c 6f 63 28 29 20 66 61 69 6c 75 72 65 73 20 0a  loc() failures .
18e90 20 20 20 20 2a 2a 20 61 72 65 20 62 65 6e 69 67      ** are benig
18ea0 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  n..    */.    ca
18eb0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
18ec0 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c 4c 4f 43  RL_BENIGN_MALLOC
18ed0 5f 48 4f 4f 4b 53 3a 20 7b 0a 20 20 20 20 20 20  _HOOKS: {.      
18ee0 74 79 70 65 64 65 66 20 76 6f 69 64 20 28 2a 76  typedef void (*v
18ef0 6f 69 64 5f 66 75 6e 63 74 69 6f 6e 29 28 76 6f  oid_function)(vo
18f00 69 64 29 3b 0a 20 20 20 20 20 20 76 6f 69 64 5f  id);.      void_
18f10 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69 67 6e  function xBenign
18f20 42 65 67 69 6e 3b 0a 20 20 20 20 20 20 76 6f 69  Begin;.      voi
18f30 64 5f 66 75 6e 63 74 69 6f 6e 20 78 42 65 6e 69  d_function xBeni
18f40 67 6e 45 6e 64 3b 0a 20 20 20 20 20 20 78 42 65  gnEnd;.      xBe
18f50 6e 69 67 6e 42 65 67 69 6e 20 3d 20 76 61 5f 61  nignBegin = va_a
18f60 72 67 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63  rg(ap, void_func
18f70 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 78 42 65  tion);.      xBe
18f80 6e 69 67 6e 45 6e 64 20 3d 20 76 61 5f 61 72 67  nignEnd = va_arg
18f90 28 61 70 2c 20 76 6f 69 64 5f 66 75 6e 63 74 69  (ap, void_functi
18fa0 6f 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  on);.      sqlit
18fb0 65 33 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 48 6f  e3BenignMallocHo
18fc0 6f 6b 73 28 78 42 65 6e 69 67 6e 42 65 67 69 6e  oks(xBenignBegin
18fd0 2c 20 78 42 65 6e 69 67 6e 45 6e 64 29 3b 0a 20  , xBenignEnd);. 
18fe0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
18ff0 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
19000 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63    sqlite3_test_c
19010 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45  ontrol(SQLITE_TE
19020 53 54 43 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42  STCTRL_PENDING_B
19030 59 54 45 2c 20 75 6e 73 69 67 6e 65 64 20 69 6e  YTE, unsigned in
19040 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20  t X).    **.    
19050 2a 2a 20 53 65 74 20 74 68 65 20 50 45 4e 44 49  ** Set the PENDI
19060 4e 47 20 62 79 74 65 20 74 6f 20 74 68 65 20 76  NG byte to the v
19070 61 6c 75 65 20 69 6e 20 74 68 65 20 61 72 67 75  alue in the argu
19080 6d 65 6e 74 2c 20 69 66 20 58 3e 30 2e 0a 20 20  ment, if X>0..  
19090 20 20 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61    ** Make no cha
190a0 6e 67 65 73 20 69 66 20 58 3d 3d 30 2e 20 20 52  nges if X==0.  R
190b0 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
190c0 6f 66 20 74 68 65 20 70 65 6e 64 69 6e 67 20 62  of the pending b
190d0 79 74 65 0a 20 20 20 20 2a 2a 20 61 73 20 69 74  yte.    ** as it
190e0 20 65 78 69 73 74 69 6e 67 20 62 65 66 6f 72 65   existing before
190f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   this routine wa
19100 73 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 2a 2a  s called..    **
19110 0a 20 20 20 20 2a 2a 20 49 4d 50 4f 52 54 41 4e  .    ** IMPORTAN
19120 54 3a 20 20 43 68 61 6e 67 69 6e 67 20 74 68 65  T:  Changing the
19130 20 50 45 4e 44 49 4e 47 20 62 79 74 65 20 66 72   PENDING byte fr
19140 6f 6d 20 30 78 34 30 30 30 30 30 30 30 20 72 65  om 0x40000000 re
19150 73 75 6c 74 73 20 69 6e 0a 20 20 20 20 2a 2a 20  sults in.    ** 
19160 61 6e 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65 20  an incompatible 
19170 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f  database file fo
19180 72 6d 61 74 2e 20 20 43 68 61 6e 67 69 6e 67 20  rmat.  Changing 
19190 74 68 65 20 50 45 4e 44 49 4e 47 20 62 79 74 65  the PENDING byte
191a0 0a 20 20 20 20 2a 2a 20 77 68 69 6c 65 20 61 6e  .    ** while an
191b0 79 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  y database conne
191c0 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 20 72 65  ction is open re
191d0 73 75 6c 74 73 20 69 6e 20 75 6e 64 65 66 69 6e  sults in undefin
191e0 65 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 64 65  ed and.    ** de
191f0 6c 65 74 65 72 69 6f 75 73 20 62 65 68 61 76 69  leterious behavi
19200 6f 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  or..    */.    c
19210 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
19220 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45  TRL_PENDING_BYTE
19230 3a 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 50  : {.      rc = P
19240 45 4e 44 49 4e 47 5f 42 59 54 45 3b 0a 23 69 66  ENDING_BYTE;.#if
19250 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
19260 5f 57 53 44 0a 20 20 20 20 20 20 7b 0a 20 20 20  _WSD.      {.   
19270 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69 6e       unsigned in
19280 74 20 6e 65 77 56 61 6c 20 3d 20 76 61 5f 61 72  t newVal = va_ar
19290 67 28 61 70 2c 20 75 6e 73 69 67 6e 65 64 20 69  g(ap, unsigned i
192a0 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nt);.        if(
192b0 20 6e 65 77 56 61 6c 20 29 20 73 71 6c 69 74 65   newVal ) sqlite
192c0 33 50 65 6e 64 69 6e 67 42 79 74 65 20 3d 20 6e  3PendingByte = n
192d0 65 77 56 61 6c 3b 0a 20 20 20 20 20 20 7d 0a 23  ewVal;.      }.#
192e0 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65 61  endif.      brea
192f0 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  k;.    }..    /*
19300 0a 20 20 20 20 2a 2a 20 20 73 71 6c 69 74 65 33  .    **  sqlite3
19310 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51  _test_control(SQ
19320 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53  LITE_TESTCTRL_AS
19330 53 45 52 54 2c 20 69 6e 74 20 58 29 0a 20 20 20  SERT, int X).   
19340 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20   **.    ** This 
19350 61 63 74 69 6f 6e 20 70 72 6f 76 69 64 65 73 20  action provides 
19360 61 20 72 75 6e 2d 74 69 6d 65 20 74 65 73 74 20  a run-time test 
19370 74 6f 20 73 65 65 20 77 68 65 74 68 65 72 20 6f  to see whether o
19380 72 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 61 73 73  r not.    ** ass
19390 65 72 74 28 29 20 77 61 73 20 65 6e 61 62 6c 65  ert() was enable
193a0 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  d at compile-tim
193b0 65 2e 20 20 49 66 20 58 20 69 73 20 74 72 75 65  e.  If X is true
193c0 20 61 6e 64 20 61 73 73 65 72 74 28 29 0a 20 20   and assert().  
193d0 20 20 2a 2a 20 69 73 20 65 6e 61 62 6c 65 64 2c    ** is enabled,
193e0 20 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e   then the return
193f0 20 76 61 6c 75 65 20 69 73 20 74 72 75 65 2e 20   value is true. 
19400 20 49 66 20 58 20 69 73 20 74 72 75 65 20 61 6e   If X is true an
19410 64 0a 20 20 20 20 2a 2a 20 61 73 73 65 72 74 28  d.    ** assert(
19420 29 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74  ) is disabled, t
19430 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20 76  hen the return v
19440 61 6c 75 65 20 69 73 20 7a 65 72 6f 2e 20 20 49  alue is zero.  I
19450 66 20 58 20 69 73 0a 20 20 20 20 2a 2a 20 66 61  f X is.    ** fa
19460 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  lse and assert()
19470 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 74 68 65   is enabled, the
19480 6e 20 74 68 65 20 61 73 73 65 72 74 69 6f 6e 20  n the assertion 
19490 66 69 72 65 73 20 61 6e 64 20 74 68 65 0a 20 20  fires and the.  
194a0 20 20 2a 2a 20 70 72 6f 63 65 73 73 20 61 62 6f    ** process abo
194b0 72 74 73 2e 20 20 49 66 20 58 20 69 73 20 66 61  rts.  If X is fa
194c0 6c 73 65 20 61 6e 64 20 61 73 73 65 72 74 28 29  lse and assert()
194d0 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
194e0 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  en the.    ** re
194f0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 7a 65  turn value is ze
19500 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ro..    */.    c
19510 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
19520 54 52 4c 5f 41 53 53 45 52 54 3a 20 7b 0a 20 20  TRL_ASSERT: {.  
19530 20 20 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74      volatile int
19540 20 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73   x = 0;.      as
19550 73 65 72 74 28 20 28 78 20 3d 20 76 61 5f 61 72  sert( (x = va_ar
19560 67 28 61 70 2c 69 6e 74 29 29 21 3d 30 20 29 3b  g(ap,int))!=0 );
19570 0a 20 20 20 20 20 20 72 63 20 3d 20 78 3b 0a 20  .      rc = x;. 
19580 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19590 7d 0a 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a  }...    /*.    *
195a0 2a 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  *  sqlite3_test_
195b0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
195c0 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 2c 20  ESTCTRL_ALWAYS, 
195d0 69 6e 74 20 58 29 0a 20 20 20 20 2a 2a 0a 20 20  int X).    **.  
195e0 20 20 2a 2a 20 54 68 69 73 20 61 63 74 69 6f 6e    ** This action
195f0 20 70 72 6f 76 69 64 65 73 20 61 20 72 75 6e 2d   provides a run-
19600 74 69 6d 65 20 74 65 73 74 20 74 6f 20 73 65 65  time test to see
19610 20 68 6f 77 20 74 68 65 20 41 4c 57 41 59 53 20   how the ALWAYS 
19620 61 6e 64 0a 20 20 20 20 2a 2a 20 4e 45 56 45 52  and.    ** NEVER
19630 20 6d 61 63 72 6f 73 20 77 65 72 65 20 64 65 66   macros were def
19640 69 6e 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 2d  ined at compile-
19650 74 69 6d 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  time..    **.   
19660 20 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76   ** The return v
19670 61 6c 75 65 20 69 73 20 41 4c 57 41 59 53 28 58  alue is ALWAYS(X
19680 29 2e 20 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ).  .    **.    
19690 2a 2a 20 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64  ** The recommend
196a0 65 64 20 74 65 73 74 20 69 73 20 58 3d 3d 32 2e  ed test is X==2.
196b0 20 20 49 66 20 74 68 65 20 72 65 74 75 72 6e 20    If the return 
196c0 76 61 6c 75 65 20 69 73 20 32 2c 20 74 68 61 74  value is 2, that
196d0 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 41 4c   means.    ** AL
196e0 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56 45 52  WAYS() and NEVER
196f0 28 29 20 61 72 65 20 62 6f 74 68 20 6e 6f 2d 6f  () are both no-o
19700 70 20 70 61 73 73 2d 74 68 72 6f 75 67 68 20 6d  p pass-through m
19710 61 63 72 6f 73 2c 20 77 68 69 63 68 20 69 73 20  acros, which is 
19720 74 68 65 0a 20 20 20 20 2a 2a 20 64 65 66 61 75  the.    ** defau
19730 6c 74 20 73 65 74 74 69 6e 67 2e 20 20 49 66 20  lt setting.  If 
19740 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
19750 20 69 73 20 31 2c 20 74 68 65 6e 20 41 4c 57 41   is 1, then ALWA
19760 59 53 28 29 20 69 73 20 65 69 74 68 65 72 0a 20  YS() is either. 
19770 20 20 20 2a 2a 20 68 61 72 64 2d 63 6f 64 65 64     ** hard-coded
19780 20 74 6f 20 74 72 75 65 20 6f 72 20 65 6c 73 65   to true or else
19790 20 69 74 20 61 73 73 65 72 74 73 20 69 66 20 69   it asserts if i
197a0 74 73 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66  ts argument is f
197b0 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65  alse..    ** The
197c0 20 66 69 72 73 74 20 62 65 68 61 76 69 6f 72 20   first behavior 
197d0 28 68 61 72 64 2d 63 6f 64 65 64 20 74 6f 20 74  (hard-coded to t
197e0 72 75 65 29 20 69 73 20 74 68 65 20 63 61 73 65  rue) is the case
197f0 20 69 66 0a 20 20 20 20 2a 2a 20 53 51 4c 49 54   if.    ** SQLIT
19800 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45 52  E_TESTCTRL_ASSER
19810 54 20 73 68 6f 77 73 20 74 68 61 74 20 61 73 73  T shows that ass
19820 65 72 74 28 29 20 69 73 20 64 69 73 61 62 6c 65  ert() is disable
19830 64 20 61 6e 64 20 74 68 65 20 73 65 63 6f 6e 64  d and the second
19840 0a 20 20 20 20 2a 2a 20 62 65 68 61 76 69 6f 72  .    ** behavior
19850 20 28 61 73 73 65 72 74 20 69 66 20 74 68 65 20   (assert if the 
19860 61 72 67 75 6d 65 6e 74 20 74 6f 20 41 4c 57 41  argument to ALWA
19870 59 53 28 29 20 69 73 20 66 61 6c 73 65 29 20 69  YS() is false) i
19880 73 20 74 68 65 20 63 61 73 65 20 69 66 0a 20 20  s the case if.  
19890 20 20 2a 2a 20 53 51 4c 49 54 45 5f 54 45 53 54    ** SQLITE_TEST
198a0 43 54 52 4c 5f 41 53 53 45 52 54 20 73 68 6f 77  CTRL_ASSERT show
198b0 73 20 74 68 61 74 20 61 73 73 65 72 74 28 29 20  s that assert() 
198c0 69 73 20 65 6e 61 62 6c 65 64 2e 0a 20 20 20 20  is enabled..    
198d0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 72 75  **.    ** The ru
198e0 6e 2d 74 69 6d 65 20 74 65 73 74 20 70 72 6f 63  n-time test proc
198f0 65 64 75 72 65 20 6d 69 67 68 74 20 6c 6f 6f 6b  edure might look
19900 20 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20   something like 
19910 74 68 69 73 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  this:.    **.   
19920 20 2a 2a 20 20 20 20 69 66 28 20 73 71 6c 69 74   **    if( sqlit
19930 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
19940 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
19950 41 4c 57 41 59 53 2c 20 32 29 3d 3d 32 20 29 7b  ALWAYS, 2)==2 ){
19960 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 2f 2f 20  .    **      // 
19970 41 4c 57 41 59 53 28 29 20 61 6e 64 20 4e 45 56  ALWAYS() and NEV
19980 45 52 28 29 20 61 72 65 20 6e 6f 2d 6f 70 20 70  ER() are no-op p
19990 61 73 73 2d 74 68 72 6f 75 67 68 20 6d 61 63 72  ass-through macr
199a0 6f 73 0a 20 20 20 20 2a 2a 20 20 20 20 7d 65 6c  os.    **    }el
199b0 73 65 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74  se if( sqlite3_t
199c0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
199d0 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 53 53 45  TE_TESTCTRL_ASSE
199e0 52 54 2c 20 31 29 20 29 7b 0a 20 20 20 20 2a 2a  RT, 1) ){.    **
199f0 20 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28        // ALWAYS(
19a00 78 29 20 61 73 73 65 72 74 73 20 74 68 61 74 20  x) asserts that 
19a10 78 20 69 73 20 74 72 75 65 2e 20 4e 45 56 45 52  x is true. NEVER
19a20 28 78 29 20 61 73 73 65 72 74 73 20 78 20 69 73  (x) asserts x is
19a30 20 66 61 6c 73 65 2e 0a 20 20 20 20 2a 2a 20 20   false..    **  
19a40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2a 2a 20    }else{.    ** 
19a50 20 20 20 20 20 2f 2f 20 41 4c 57 41 59 53 28 78       // ALWAYS(x
19a60 29 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  ) is a constant 
19a70 31 2e 20 20 4e 45 56 45 52 28 78 29 20 69 73 20  1.  NEVER(x) is 
19a80 61 20 63 6f 6e 73 74 61 6e 74 20 30 2e 0a 20 20  a constant 0..  
19a90 20 20 2a 2a 20 20 20 20 7d 0a 20 20 20 20 2a 2f    **    }.    */
19aa0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
19ab0 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
19ac0 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 78 20  : {.      int x 
19ad0 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29  = va_arg(ap,int)
19ae0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 41 4c 57  ;.      rc = ALW
19af0 41 59 53 28 78 29 3b 0a 20 20 20 20 20 20 62 72  AYS(x);.      br
19b00 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
19b10 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 73 71 6c 69  /*.    **   sqli
19b20 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
19b30 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c  (SQLITE_TESTCTRL
19b40 5f 42 59 54 45 4f 52 44 45 52 29 3b 0a 20 20 20  _BYTEORDER);.   
19b50 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 69   **.    ** The i
19b60 6e 74 65 67 65 72 20 72 65 74 75 72 6e 65 64 20  nteger returned 
19b70 72 65 76 65 61 6c 73 20 74 68 65 20 62 79 74 65  reveals the byte
19b80 2d 6f 72 64 65 72 20 6f 66 20 74 68 65 20 63 6f  -order of the co
19b90 6d 70 75 74 65 72 20 6f 6e 20 77 68 69 63 68 0a  mputer on which.
19ba0 20 20 20 20 2a 2a 20 53 51 4c 69 74 65 20 69 73      ** SQLite is
19bb0 20 72 75 6e 6e 69 6e 67 3a 0a 20 20 20 20 2a 2a   running:.    **
19bc0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 31 20  .    **       1 
19bd0 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e 2c 20      big-endian, 
19be0 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74     determined at
19bf0 20 72 75 6e 2d 74 69 6d 65 0a 20 20 20 20 2a 2a   run-time.    **
19c00 20 20 20 20 20 20 31 30 20 20 20 20 20 6c 69 74        10     lit
19c10 74 6c 65 2d 65 6e 64 69 61 6e 2c 20 64 65 74 65  tle-endian, dete
19c20 72 6d 69 6e 65 64 20 61 74 20 72 75 6e 2d 74 69  rmined at run-ti
19c30 6d 65 0a 20 20 20 20 2a 2a 20 20 34 33 32 31 30  me.    **  43210
19c40 31 20 20 20 20 20 62 69 67 2d 65 6e 64 69 61 6e  1     big-endian
19c50 2c 20 20 20 20 64 65 74 65 72 6d 69 6e 65 64 20  ,    determined 
19c60 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a  at compile-time.
19c70 20 20 20 20 2a 2a 20 20 31 32 33 34 31 30 20 20      **  123410  
19c80 20 20 20 6c 69 74 74 6c 65 2d 65 6e 64 69 61 6e     little-endian
19c90 2c 20 64 65 74 65 72 6d 69 6e 65 64 20 61 74 20  , determined at 
19ca0 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 0a 20 20 20  compile-time.   
19cb0 20 2a 2f 20 0a 20 20 20 20 63 61 73 65 20 53 51   */ .    case SQ
19cc0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
19cd0 54 45 4f 52 44 45 52 3a 20 7b 0a 20 20 20 20 20  TEORDER: {.     
19ce0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 59 54   rc = SQLITE_BYT
19cf0 45 4f 52 44 45 52 2a 31 30 30 20 2b 20 53 51 4c  EORDER*100 + SQL
19d00 49 54 45 5f 4c 49 54 54 4c 45 45 4e 44 49 41 4e  ITE_LITTLEENDIAN
19d10 2a 31 30 20 2b 20 53 51 4c 49 54 45 5f 42 49 47  *10 + SQLITE_BIG
19d20 45 4e 44 49 41 4e 3b 0a 20 20 20 20 20 20 62 72  ENDIAN;.      br
19d30 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
19d40 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
19d50 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
19d60 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56  _TESTCTRL_RESERV
19d70 45 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  E, sqlite3 *db, 
19d80 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
19d90 20 20 2a 2a 20 53 65 74 20 74 68 65 20 6e 52 65    ** Set the nRe
19da0 73 65 72 76 65 20 73 69 7a 65 20 74 6f 20 4e 20  serve size to N 
19db0 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 64 61 74  for the main dat
19dc0 61 62 61 73 65 20 6f 6e 20 74 68 65 20 64 61 74  abase on the dat
19dd0 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 63 6f 6e  abase.    ** con
19de0 6e 65 63 74 69 6f 6e 20 64 62 2e 0a 20 20 20 20  nection db..    
19df0 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  */.    case SQLI
19e00 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
19e10 52 56 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  RVE: {.      sql
19e20 69 74 65 33 20 2a 64 62 20 3d 20 76 61 5f 61 72  ite3 *db = va_ar
19e30 67 28 61 70 2c 20 73 71 6c 69 74 65 33 2a 29 3b  g(ap, sqlite3*);
19e40 0a 20 20 20 20 20 20 69 6e 74 20 78 20 3d 20 76  .      int x = v
19e50 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20  a_arg(ap,int);. 
19e60 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74       sqlite3_mut
19e70 65 78 5f 65 6e 74 65 72 28 64 62 2d 3e 6d 75 74  ex_enter(db->mut
19e80 65 78 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ex);.      sqlit
19e90 65 33 42 74 72 65 65 53 65 74 50 61 67 65 53 69  e3BtreeSetPageSi
19ea0 7a 65 28 64 62 2d 3e 61 44 62 5b 30 5d 2e 70 42  ze(db->aDb[0].pB
19eb0 74 2c 20 30 2c 20 78 2c 20 30 29 3b 0a 20 20 20  t, 0, x, 0);.   
19ec0 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
19ed0 5f 6c 65 61 76 65 28 64 62 2d 3e 6d 75 74 65 78  _leave(db->mutex
19ee0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
19ef0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 73      }..    /*  s
19f00 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
19f10 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
19f20 54 52 4c 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e  TRL_OPTIMIZATION
19f30 53 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  S, sqlite3 *db, 
19f40 69 6e 74 20 4e 29 0a 20 20 20 20 2a 2a 0a 20 20  int N).    **.  
19f50 20 20 2a 2a 20 45 6e 61 62 6c 65 20 6f 72 20 64    ** Enable or d
19f60 69 73 61 62 6c 65 20 76 61 72 69 6f 75 73 20 6f  isable various o
19f70 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20 66 6f 72  ptimizations for
19f80 20 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65   testing purpose
19f90 73 2e 20 20 54 68 65 20 0a 20 20 20 20 2a 2a 20  s.  The .    ** 
19fa0 61 72 67 75 6d 65 6e 74 20 4e 20 69 73 20 61 20  argument N is a 
19fb0 62 69 74 6d 61 73 6b 20 6f 66 20 6f 70 74 69 6d  bitmask of optim
19fc0 69 7a 61 74 69 6f 6e 73 20 74 6f 20 62 65 20 64  izations to be d
19fd0 69 73 61 62 6c 65 64 2e 20 20 46 6f 72 20 6e 6f  isabled.  For no
19fe0 72 6d 61 6c 0a 20 20 20 20 2a 2a 20 6f 70 65 72  rmal.    ** oper
19ff0 61 74 69 6f 6e 20 4e 20 73 68 6f 75 6c 64 20 62  ation N should b
1a000 65 20 30 2e 20 20 54 68 65 20 69 64 65 61 20 69  e 0.  The idea i
1a010 73 20 74 68 61 74 20 61 20 74 65 73 74 20 70 72  s that a test pr
1a020 6f 67 72 61 6d 20 28 6c 69 6b 65 20 74 68 65 0a  ogram (like the.
1a030 20 20 20 20 2a 2a 20 53 51 4c 20 4c 6f 67 69 63      ** SQL Logic
1a040 20 54 65 73 74 20 6f 72 20 53 4c 54 20 74 65 73   Test or SLT tes
1a050 74 20 6d 6f 64 75 6c 65 29 20 63 61 6e 20 72 75  t module) can ru
1a060 6e 20 74 68 65 20 73 61 6d 65 20 53 51 4c 20 6d  n the same SQL m
1a070 75 6c 74 69 70 6c 65 20 74 69 6d 65 73 0a 20 20  ultiple times.  
1a080 20 20 2a 2a 20 77 69 74 68 20 76 61 72 69 6f 75    ** with variou
1a090 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 20  s optimizations 
1a0a0 64 69 73 61 62 6c 65 64 20 74 6f 20 76 65 72 69  disabled to veri
1a0b0 66 79 20 74 68 61 74 20 74 68 65 20 73 61 6d 65  fy that the same
1a0c0 20 61 6e 73 77 65 72 0a 20 20 20 20 2a 2a 20 69   answer.    ** i
1a0d0 73 20 6f 62 74 61 69 6e 65 64 20 69 6e 20 65 76  s obtained in ev
1a0e0 65 72 79 20 63 61 73 65 2e 0a 20 20 20 20 2a 2f  ery case..    */
1a0f0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1a100 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d 49  _TESTCTRL_OPTIMI
1a110 5a 41 54 49 4f 4e 53 3a 20 7b 0a 20 20 20 20 20  ZATIONS: {.     
1a120 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 76   sqlite3 *db = v
1a130 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74 65  a_arg(ap, sqlite
1a140 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e 64  3*);.      db->d
1a150 62 4f 70 74 46 6c 61 67 73 20 3d 20 28 75 31 36  bOptFlags = (u16
1a160 29 28 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74  )(va_arg(ap, int
1a170 29 20 26 20 30 78 66 66 66 66 29 3b 0a 20 20 20  ) & 0xffff);.   
1a180 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1a190 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e  .#ifdef SQLITE_N
1a1a0 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20 2f 2a 20  _KEYWORD.    /* 
1a1b0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1a1c0 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1a1d0 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20  CTRL_ISKEYWORD, 
1a1e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 6f 72  const char *zWor
1a1f0 64 29 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d).    **.    **
1a200 20 49 66 20 7a 57 6f 72 64 20 69 73 20 61 20 6b   If zWord is a k
1a210 65 79 77 6f 72 64 20 72 65 63 6f 67 6e 69 7a 65  eyword recognize
1a220 64 20 62 79 20 74 68 65 20 70 61 72 73 65 72 2c  d by the parser,
1a230 20 74 68 65 6e 20 72 65 74 75 72 6e 20 74 68 65   then return the
1a240 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f  .    ** number o
1a250 66 20 6b 65 79 77 6f 72 64 73 2e 20 20 4f 72 20  f keywords.  Or 
1a260 69 66 20 7a 57 6f 72 64 20 69 73 20 6e 6f 74 20  if zWord is not 
1a270 61 20 6b 65 79 77 6f 72 64 2c 20 72 65 74 75 72  a keyword, retur
1a280 6e 20 30 2e 0a 20 20 20 20 2a 2a 20 0a 20 20 20  n 0..    ** .   
1a290 20 2a 2a 20 54 68 69 73 20 74 65 73 74 20 66 65   ** This test fe
1a2a0 61 74 75 72 65 20 69 73 20 6f 6e 6c 79 20 61 76  ature is only av
1a2b0 61 69 6c 61 62 6c 65 20 69 6e 20 74 68 65 20 61  ailable in the a
1a2c0 6d 61 6c 67 61 6d 61 74 69 6f 6e 20 73 69 6e 63  malgamation sinc
1a2d0 65 0a 20 20 20 20 2a 2a 20 74 68 65 20 53 51 4c  e.    ** the SQL
1a2e0 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 20 6d 61  ITE_N_KEYWORD ma
1a2f0 63 72 6f 20 69 73 20 6e 6f 74 20 64 65 66 69 6e  cro is not defin
1a300 65 64 20 69 6e 20 74 68 69 73 20 66 69 6c 65 20  ed in this file 
1a310 69 66 20 53 51 4c 69 74 65 0a 20 20 20 20 2a 2a  if SQLite.    **
1a320 20 69 73 20 62 75 69 6c 74 20 75 73 69 6e 67 20   is built using 
1a330 73 65 70 61 72 61 74 65 20 73 6f 75 72 63 65 20  separate source 
1a340 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  files..    */.  
1a350 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1a360 53 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44  STCTRL_ISKEYWORD
1a370 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  : {.      const 
1a380 63 68 61 72 20 2a 7a 57 6f 72 64 20 3d 20 76 61  char *zWord = va
1a390 5f 61 72 67 28 61 70 2c 20 63 6f 6e 73 74 20 63  _arg(ap, const c
1a3a0 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 69 6e 74  har*);.      int
1a3b0 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c   n = sqlite3Strl
1a3c0 65 6e 33 30 28 7a 57 6f 72 64 29 3b 0a 20 20 20  en30(zWord);.   
1a3d0 20 20 20 72 63 20 3d 20 28 73 71 6c 69 74 65 33     rc = (sqlite3
1a3e0 4b 65 79 77 6f 72 64 43 6f 64 65 28 28 75 38 2a  KeywordCode((u8*
1a3f0 29 7a 57 6f 72 64 2c 20 6e 29 21 3d 54 4b 5f 49  )zWord, n)!=TK_I
1a400 44 29 20 3f 20 53 51 4c 49 54 45 5f 4e 5f 4b 45  D) ? SQLITE_N_KE
1a410 59 57 4f 52 44 20 3a 20 30 3b 0a 20 20 20 20 20  YWORD : 0;.     
1a420 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1a430 6e 64 69 66 20 0a 0a 20 20 20 20 2f 2a 20 73 71  ndif ..    /* sq
1a440 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
1a450 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
1a460 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c 4f 43  RL_SCRATCHMALLOC
1a470 2c 20 73 7a 2c 20 26 70 4e 65 77 2c 20 70 46 72  , sz, &pNew, pFr
1a480 65 65 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ee);.    **.    
1a490 2a 2a 20 50 61 73 73 20 70 46 72 65 65 20 69 6e  ** Pass pFree in
1a4a0 74 6f 20 73 71 6c 69 74 65 33 53 63 72 61 74 63  to sqlite3Scratc
1a4b0 68 46 72 65 65 28 29 2e 20 0a 20 20 20 20 2a 2a  hFree(). .    **
1a4c0 20 49 66 20 73 7a 3e 30 20 74 68 65 6e 20 61 6c   If sz>0 then al
1a4d0 6c 6f 63 61 74 65 20 61 20 73 63 72 61 74 63 68  locate a scratch
1a4e0 20 62 75 66 66 65 72 20 69 6e 74 6f 20 70 4e 65   buffer into pNe
1a4f0 77 2e 20 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  w.  .    */.    
1a500 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
1a510 43 54 52 4c 5f 53 43 52 41 54 43 48 4d 41 4c 4c  CTRL_SCRATCHMALL
1a520 4f 43 3a 20 7b 0a 20 20 20 20 20 20 76 6f 69 64  OC: {.      void
1a530 20 2a 70 46 72 65 65 2c 20 2a 2a 70 70 4e 65 77   *pFree, **ppNew
1a540 3b 0a 20 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a  ;.      int sz;.
1a550 20 20 20 20 20 20 73 7a 20 3d 20 76 61 5f 61 72        sz = va_ar
1a560 67 28 61 70 2c 20 69 6e 74 29 3b 0a 20 20 20 20  g(ap, int);.    
1a570 20 20 70 70 4e 65 77 20 3d 20 76 61 5f 61 72 67    ppNew = va_arg
1a580 28 61 70 2c 20 76 6f 69 64 2a 2a 29 3b 0a 20 20  (ap, void**);.  
1a590 20 20 20 20 70 46 72 65 65 20 3d 20 76 61 5f 61      pFree = va_a
1a5a0 72 67 28 61 70 2c 20 76 6f 69 64 2a 29 3b 0a 20  rg(ap, void*);. 
1a5b0 20 20 20 20 20 69 66 28 20 73 7a 20 29 20 2a 70       if( sz ) *p
1a5c0 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33 53 63  pNew = sqlite3Sc
1a5d0 72 61 74 63 68 4d 61 6c 6c 6f 63 28 73 7a 29 3b  ratchMalloc(sz);
1a5e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 63  .      sqlite3Sc
1a5f0 72 61 74 63 68 46 72 65 65 28 70 46 72 65 65 29  ratchFree(pFree)
1a600 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a610 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1a620 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1a630 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1a640 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41  TRL_LOCALTIME_FA
1a650 55 4c 54 2c 20 69 6e 74 20 6f 6e 6f 66 66 29 3b  ULT, int onoff);
1a660 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
1a670 66 20 70 61 72 61 6d 65 74 65 72 20 6f 6e 6f 66  f parameter onof
1a680 66 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 63  f is non-zero, c
1a690 6f 6e 66 69 67 75 72 65 20 74 68 65 20 77 72 61  onfigure the wra
1a6a0 70 70 65 72 73 20 73 6f 20 74 68 61 74 20 61 6c  ppers so that al
1a6b0 6c 0a 20 20 20 20 2a 2a 20 73 75 62 73 65 71 75  l.    ** subsequ
1a6c0 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 6c 6f 63  ent calls to loc
1a6d0 61 6c 74 69 6d 65 28 29 20 61 6e 64 20 76 61 72  altime() and var
1a6e0 69 61 6e 74 73 20 66 61 69 6c 2e 20 49 66 20 6f  iants fail. If o
1a6f0 6e 6f 66 66 20 69 73 20 7a 65 72 6f 2c 0a 20 20  noff is zero,.  
1a700 20 20 2a 2a 20 75 6e 64 6f 20 74 68 69 73 20 73    ** undo this s
1a710 65 74 74 69 6e 67 2e 0a 20 20 20 20 2a 2f 0a 20  etting..    */. 
1a720 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1a730 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
1a740 45 5f 46 41 55 4c 54 3a 20 7b 0a 20 20 20 20 20  E_FAULT: {.     
1a750 20 73 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f   sqlite3GlobalCo
1a760 6e 66 69 67 2e 62 4c 6f 63 61 6c 74 69 6d 65 46  nfig.bLocaltimeF
1a770 61 75 6c 74 20 3d 20 76 61 5f 61 72 67 28 61 70  ault = va_arg(ap
1a780 2c 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 62 72  , int);.      br
1a790 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
1a7a0 2f 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73  /*   sqlite3_tes
1a7b0 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45  t_control(SQLITE
1a7c0 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f  _TESTCTRL_NEVER_
1a7d0 43 4f 52 52 55 50 54 2c 20 69 6e 74 29 3b 0a 20  CORRUPT, int);. 
1a7e0 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 65 74     **.    ** Set
1a7f0 20 6f 72 20 63 6c 65 61 72 20 61 20 66 6c 61 67   or clear a flag
1a800 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73 20   that indicates 
1a810 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
1a820 65 20 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73  e file is always
1a830 20 77 65 6c 6c 2d 0a 20 20 20 20 2a 2a 20 66 6f   well-.    ** fo
1a840 72 6d 65 64 20 61 6e 64 20 6e 65 76 65 72 20 63  rmed and never c
1a850 6f 72 72 75 70 74 2e 20 20 54 68 69 73 20 66 6c  orrupt.  This fl
1a860 61 67 20 69 73 20 63 6c 65 61 72 20 62 79 20 64  ag is clear by d
1a870 65 66 61 75 6c 74 2c 20 69 6e 64 69 63 61 74 69  efault, indicati
1a880 6e 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 64  ng that.    ** d
1a890 61 74 61 62 61 73 65 20 66 69 6c 65 73 20 6d 69  atabase files mi
1a8a0 67 68 74 20 68 61 76 65 20 61 72 62 69 74 72 61  ght have arbitra
1a8b0 72 79 20 63 6f 72 72 75 70 74 69 6f 6e 2e 20 20  ry corruption.  
1a8c0 53 65 74 74 69 6e 67 20 74 68 65 20 66 6c 61 67  Setting the flag
1a8d0 20 64 75 72 69 6e 67 0a 20 20 20 20 2a 2a 20 74   during.    ** t
1a8e0 65 73 74 69 6e 67 20 63 61 75 73 65 73 20 63 65  esting causes ce
1a8f0 72 74 61 69 6e 20 61 73 73 65 72 74 28 29 20 73  rtain assert() s
1a900 74 61 74 65 6d 65 6e 74 73 20 69 6e 20 74 68 65  tatements in the
1a910 20 63 6f 64 65 20 74 6f 20 62 65 20 61 63 74 69   code to be acti
1a920 76 61 74 65 64 0a 20 20 20 20 2a 2a 20 74 68 61  vated.    ** tha
1a930 74 20 64 65 6d 6f 6e 73 74 72 61 74 20 69 6e 76  t demonstrat inv
1a940 61 72 69 61 6e 74 73 20 6f 6e 20 77 65 6c 6c 2d  ariants on well-
1a950 66 6f 72 6d 65 64 20 64 61 74 61 62 61 73 65 20  formed database 
1a960 66 69 6c 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  files..    */.  
1a970 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1a980 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52  STCTRL_NEVER_COR
1a990 52 55 50 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  RUPT: {.      sq
1a9a0 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66 69  lite3GlobalConfi
1a9b0 67 2e 6e 65 76 65 72 43 6f 72 72 75 70 74 20 3d  g.neverCorrupt =
1a9c0 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1a9d0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1a9e0 20 20 20 7d 0a 0a 0a 20 20 20 20 2f 2a 20 20 20     }...    /*   
1a9f0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
1aa00 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54  trol(SQLITE_TEST
1aa10 43 54 52 4c 5f 56 44 42 45 5f 43 4f 56 45 52 41  CTRL_VDBE_COVERA
1aa20 47 45 2c 20 78 43 61 6c 6c 62 61 63 6b 2c 20 70  GE, xCallback, p
1aa30 74 72 29 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20  tr);.    **.    
1aa40 2a 2a 20 53 65 74 20 74 68 65 20 56 44 42 45 20  ** Set the VDBE 
1aa50 63 6f 76 65 72 61 67 65 20 63 61 6c 6c 62 61 63  coverage callbac
1aa60 6b 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20 78 43  k function to xC
1aa70 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 63 6f 6e  allback with con
1aa80 74 65 78 74 20 0a 20 20 20 20 2a 2a 20 70 6f 69  text .    ** poi
1aa90 6e 74 65 72 20 70 74 72 2e 0a 20 20 20 20 2a 2f  nter ptr..    */
1aaa0 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
1aab0 5f 54 45 53 54 43 54 52 4c 5f 56 44 42 45 5f 43  _TESTCTRL_VDBE_C
1aac0 4f 56 45 52 41 47 45 3a 20 7b 0a 23 69 66 64 65  OVERAGE: {.#ifde
1aad0 66 20 53 51 4c 49 54 45 5f 56 44 42 45 5f 43 4f  f SQLITE_VDBE_CO
1aae0 56 45 52 41 47 45 0a 20 20 20 20 20 20 74 79 70  VERAGE.      typ
1aaf0 65 64 65 66 20 76 6f 69 64 20 28 2a 62 72 61 6e  edef void (*bran
1ab00 63 68 5f 63 61 6c 6c 62 61 63 6b 29 28 76 6f 69  ch_callback)(voi
1ab10 64 2a 2c 69 6e 74 2c 75 38 2c 75 38 29 3b 0a 20  d*,int,u8,u8);. 
1ab20 20 20 20 20 20 73 71 6c 69 74 65 33 47 6c 6f 62       sqlite3Glob
1ab30 61 6c 43 6f 6e 66 69 67 2e 78 56 64 62 65 42 72  alConfig.xVdbeBr
1ab40 61 6e 63 68 20 3d 20 76 61 5f 61 72 67 28 61 70  anch = va_arg(ap
1ab50 2c 62 72 61 6e 63 68 5f 63 61 6c 6c 62 61 63 6b  ,branch_callback
1ab60 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1ab70 47 6c 6f 62 61 6c 43 6f 6e 66 69 67 2e 70 56 64  GlobalConfig.pVd
1ab80 62 65 42 72 61 6e 63 68 41 72 67 20 3d 20 76 61  beBranchArg = va
1ab90 5f 61 72 67 28 61 70 2c 76 6f 69 64 2a 29 3b 0a  _arg(ap,void*);.
1aba0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72 65  #endif.      bre
1abb0 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
1abc0 2a 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74  *   sqlite3_test
1abd0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
1abe0 54 45 53 54 43 54 52 4c 5f 53 4f 52 54 45 52 5f  TESTCTRL_SORTER_
1abf0 4d 4d 41 50 2c 20 64 62 2c 20 6e 4d 61 78 29 3b  MMAP, db, nMax);
1ac00 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c   */.    case SQL
1ac10 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 53 4f 52  ITE_TESTCTRL_SOR
1ac20 54 45 52 5f 4d 4d 41 50 3a 20 7b 0a 20 20 20 20  TER_MMAP: {.    
1ac30 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1ac40 76 61 5f 61 72 67 28 61 70 2c 20 73 71 6c 69 74  va_arg(ap, sqlit
1ac50 65 33 2a 29 3b 0a 20 20 20 20 20 20 64 62 2d 3e  e3*);.      db->
1ac60 6e 4d 61 78 53 6f 72 74 65 72 4d 6d 61 70 20 3d  nMaxSorterMmap =
1ac70 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29   va_arg(ap, int)
1ac80 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ac90 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 20 20 73     }..    /*   s
1aca0 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
1acb0 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43  rol(SQLITE_TESTC
1acc0 54 52 4c 5f 49 53 49 4e 49 54 29 3b 0a 20 20 20  TRL_ISINIT);.   
1acd0 20 2a 2a 0a 20 20 20 20 2a 2a 20 52 65 74 75 72   **.    ** Retur
1ace0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 53  n SQLITE_OK if S
1acf0 51 4c 69 74 65 20 68 61 73 20 62 65 65 6e 20 69  QLite has been i
1ad00 6e 69 74 69 61 6c 69 7a 65 64 20 61 6e 64 20 53  nitialized and S
1ad10 51 4c 49 54 45 5f 45 52 52 4f 52 20 69 66 0a 20  QLITE_ERROR if. 
1ad20 20 20 20 2a 2a 20 6e 6f 74 2e 0a 20 20 20 20 2a     ** not..    *
1ad30 2f 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  /.    case SQLIT
1ad40 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 49 4e 49  E_TESTCTRL_ISINI
1ad50 54 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  T: {.      if( s
1ad60 71 6c 69 74 65 33 47 6c 6f 62 61 6c 43 6f 6e 66  qlite3GlobalConf
1ad70 69 67 2e 69 73 49 6e 69 74 3d 3d 30 20 29 20 72  ig.isInit==0 ) r
1ad80 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
1ad90 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1ada0 20 20 20 7d 0a 20 20 7d 0a 20 20 76 61 5f 65 6e     }.  }.  va_en
1adb0 64 28 61 70 29 3b 0a 23 65 6e 64 69 66 20 2f 2a  d(ap);.#endif /*
1adc0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 55 49   SQLITE_OMIT_BUI
1add0 4c 54 49 4e 5f 54 45 53 54 20 2a 2f 0a 20 20 72  LTIN_TEST */.  r
1ade0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1adf0 2a 2a 20 54 68 69 73 20 69 73 20 61 20 75 74 69  ** This is a uti
1ae00 6c 69 74 79 20 72 6f 75 74 69 6e 65 2c 20 75 73  lity routine, us
1ae10 65 66 75 6c 20 74 6f 20 56 46 53 20 69 6d 70 6c  eful to VFS impl
1ae20 65 6d 65 6e 74 61 74 69 6f 6e 73 2c 20 74 68 61  ementations, tha
1ae30 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 6f 20 73  t checks.** to s
1ae40 65 65 20 69 66 20 61 20 64 61 74 61 62 61 73 65  ee if a database
1ae50 20 66 69 6c 65 20 77 61 73 20 61 20 55 52 49 20   file was a URI 
1ae60 74 68 61 74 20 63 6f 6e 74 61 69 6e 65 64 20 61  that contained a
1ae70 20 73 70 65 63 69 66 69 63 20 71 75 65 72 79 20   specific query 
1ae80 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 2c 20 61  .** parameter, a
1ae90 6e 64 20 69 66 20 73 6f 20 6f 62 74 61 69 6e 73  nd if so obtains
1aea0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68   the value of th
1aeb0 65 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  e query paramete
1aec0 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 46 69  r..**.** The zFi
1aed0 6c 65 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 20  lename argument 
1aee0 69 73 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  is the filename 
1aef0 70 6f 69 6e 74 65 72 20 70 61 73 73 65 64 20 69  pointer passed i
1af00 6e 74 6f 20 74 68 65 20 78 4f 70 65 6e 28 29 0a  nto the xOpen().
1af10 2a 2a 20 6d 65 74 68 6f 64 20 6f 66 20 61 20 56  ** method of a V
1af20 46 53 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  FS implementatio
1af30 6e 2e 20 20 54 68 65 20 7a 50 61 72 61 6d 20 61  n.  The zParam a
1af40 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 6e  rgument is the n
1af50 61 6d 65 20 6f 66 20 74 68 65 0a 2a 2a 20 71 75  ame of the.** qu
1af60 65 72 79 20 70 61 72 61 6d 65 74 65 72 20 77 65  ery parameter we
1af70 20 73 65 65 6b 2e 20 20 54 68 69 73 20 72 6f 75   seek.  This rou
1af80 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
1af90 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 7a 50   value of the zP
1afa0 61 72 61 6d 0a 2a 2a 20 70 61 72 61 6d 65 74 65  aram.** paramete
1afb0 72 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20  r if it exists. 
1afc0 20 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65   If the paramete
1afd0 72 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  r does not exist
1afe0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  , this routine.*
1aff0 2a 20 72 65 74 75 72 6e 73 20 61 20 4e 55 4c 4c  * returns a NULL
1b000 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 63 6f 6e   pointer..*/.con
1b010 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
1b020 5f 75 72 69 5f 70 61 72 61 6d 65 74 65 72 28 63  _uri_parameter(c
1b030 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
1b040 6e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72  name, const char
1b050 20 2a 7a 50 61 72 61 6d 29 7b 0a 20 20 69 66 28   *zParam){.  if(
1b060 20 7a 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29 20   zFilename==0 ) 
1b070 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 46 69 6c  return 0;.  zFil
1b080 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65 33  ename += sqlite3
1b090 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e 61  Strlen30(zFilena
1b0a0 6d 65 29 20 2b 20 31 3b 0a 20 20 77 68 69 6c 65  me) + 1;.  while
1b0b0 28 20 7a 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 29  ( zFilename[0] )
1b0c0 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 73 74  {.    int x = st
1b0d0 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 20  rcmp(zFilename, 
1b0e0 7a 50 61 72 61 6d 29 3b 0a 20 20 20 20 7a 46 69  zParam);.    zFi
1b0f0 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69 74 65  lename += sqlite
1b100 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c 65 6e  3Strlen30(zFilen
1b110 61 6d 65 29 20 2b 20 31 3b 0a 20 20 20 20 69 66  ame) + 1;.    if
1b120 28 20 78 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( x==0 ) return 
1b130 7a 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 7a  zFilename;.    z
1b140 46 69 6c 65 6e 61 6d 65 20 2b 3d 20 73 71 6c 69  Filename += sqli
1b150 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 46 69 6c  te3Strlen30(zFil
1b160 65 6e 61 6d 65 29 20 2b 20 31 3b 0a 20 20 7d 0a  ename) + 1;.  }.
1b170 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1b180 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 62 6f  *.** Return a bo
1b190 6f 6c 65 61 6e 20 76 61 6c 75 65 20 66 6f 72 20  olean value for 
1b1a0 61 20 71 75 65 72 79 20 70 61 72 61 6d 65 74 65  a query paramete
1b1b0 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
1b1c0 33 5f 75 72 69 5f 62 6f 6f 6c 65 61 6e 28 63 6f  3_uri_boolean(co
1b1d0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
1b1e0 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ame, const char 
1b1f0 2a 7a 50 61 72 61 6d 2c 20 69 6e 74 20 62 44 66  *zParam, int bDf
1b200 6c 74 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  lt){.  const cha
1b210 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75  r *z = sqlite3_u
1b220 72 69 5f 70 61 72 61 6d 65 74 65 72 28 7a 46 69  ri_parameter(zFi
1b230 6c 65 6e 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b  lename, zParam);
1b240 0a 20 20 62 44 66 6c 74 20 3d 20 62 44 66 6c 74  .  bDflt = bDflt
1b250 21 3d 30 3b 0a 20 20 72 65 74 75 72 6e 20 7a 20  !=0;.  return z 
1b260 3f 20 73 71 6c 69 74 65 33 47 65 74 42 6f 6f 6c  ? sqlite3GetBool
1b270 65 61 6e 28 7a 2c 20 62 44 66 6c 74 29 20 3a 20  ean(z, bDflt) : 
1b280 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  bDflt;.}../*.** 
1b290 52 65 74 75 72 6e 20 61 20 36 34 2d 62 69 74 20  Return a 64-bit 
1b2a0 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20 66 6f  integer value fo
1b2b0 72 20 61 20 71 75 65 72 79 20 70 61 72 61 6d 65  r a query parame
1b2c0 74 65 72 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ter..*/.sqlite3_
1b2d0 69 6e 74 36 34 20 73 71 6c 69 74 65 33 5f 75 72  int64 sqlite3_ur
1b2e0 69 5f 69 6e 74 36 34 28 0a 20 20 63 6f 6e 73 74  i_int64(.  const
1b2f0 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
1b300 2c 20 20 20 20 2f 2a 20 46 69 6c 65 6e 61 6d 65  ,    /* Filename
1b310 20 61 73 20 70 61 73 73 65 64 20 74 6f 20 78 4f   as passed to xO
1b320 70 65 6e 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  pen */.  const c
1b330 68 61 72 20 2a 7a 50 61 72 61 6d 2c 20 20 20 20  har *zParam,    
1b340 20 20 20 2f 2a 20 55 52 49 20 70 61 72 61 6d 65     /* URI parame
1b350 74 65 72 20 73 6f 75 67 68 74 20 2a 2f 0a 20 20  ter sought */.  
1b360 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 62 44  sqlite3_int64 bD
1b370 66 6c 74 20 20 20 20 20 20 20 2f 2a 20 72 65 74  flt       /* ret
1b380 75 72 6e 20 69 66 20 70 61 72 61 6d 65 74 65 72  urn if parameter
1b390 20 69 73 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 29   is missing */.)
1b3a0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
1b3b0 7a 20 3d 20 73 71 6c 69 74 65 33 5f 75 72 69 5f  z = sqlite3_uri_
1b3c0 70 61 72 61 6d 65 74 65 72 28 7a 46 69 6c 65 6e  parameter(zFilen
1b3d0 61 6d 65 2c 20 7a 50 61 72 61 6d 29 3b 0a 20 20  ame, zParam);.  
1b3e0 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76 3b  sqlite3_int64 v;
1b3f0 0a 20 20 69 66 28 20 7a 20 26 26 20 73 71 6c 69  .  if( z && sqli
1b400 74 65 33 44 65 63 4f 72 48 65 78 54 6f 49 36 34  te3DecOrHexToI64
1b410 28 7a 2c 20 26 76 29 3d 3d 53 51 4c 49 54 45 5f  (z, &v)==SQLITE_
1b420 4f 4b 20 29 7b 0a 20 20 20 20 62 44 66 6c 74 20  OK ){.    bDflt 
1b430 3d 20 76 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = v;.  }.  retur
1b440 6e 20 62 44 66 6c 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  n bDflt;.}../*.*
1b450 2a 20 52 65 74 75 72 6e 20 74 68 65 20 42 74 72  * Return the Btr
1b460 65 65 20 70 6f 69 6e 74 65 72 20 69 64 65 6e 74  ee pointer ident
1b470 69 66 69 65 64 20 62 79 20 7a 44 62 4e 61 6d 65  ified by zDbName
1b480 2e 20 20 52 65 74 75 72 6e 20 4e 55 4c 4c 20 69  .  Return NULL i
1b490 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a  f not found..*/.
1b4a0 42 74 72 65 65 20 2a 73 71 6c 69 74 65 33 44 62  Btree *sqlite3Db
1b4b0 4e 61 6d 65 54 6f 42 74 72 65 65 28 73 71 6c 69  NameToBtree(sqli
1b4c0 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74 20 63  te3 *db, const c
1b4d0 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b 0a 20  har *zDbName){. 
1b4e0 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
1b4f0 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20 69 2b  0; i<db->nDb; i+
1b500 2b 29 7b 0a 20 20 20 20 69 66 28 20 64 62 2d 3e  +){.    if( db->
1b510 61 44 62 5b 69 5d 2e 70 42 74 0a 20 20 20 20 20  aDb[i].pBt.     
1b520 26 26 20 28 7a 44 62 4e 61 6d 65 3d 3d 30 20 7c  && (zDbName==0 |
1b530 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
1b540 28 7a 44 62 4e 61 6d 65 2c 20 64 62 2d 3e 61 44  (zDbName, db->aD
1b550 62 5b 69 5d 2e 7a 4e 61 6d 65 29 3d 3d 30 29 0a  b[i].zName)==0).
1b560 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74      ){.      ret
1b570 75 72 6e 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  urn db->aDb[i].p
1b580 42 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  Bt;.    }.  }.  
1b590 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1b5a0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69  ** Return the fi
1b5b0 6c 65 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  lename of the da
1b5c0 74 61 62 61 73 65 20 61 73 73 6f 63 69 61 74 65  tabase associate
1b5d0 64 20 77 69 74 68 20 61 20 64 61 74 61 62 61 73  d with a databas
1b5e0 65 0a 2a 2a 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  e.** connection.
1b5f0 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a  .*/.const char *
1b600 73 71 6c 69 74 65 33 5f 64 62 5f 66 69 6c 65 6e  sqlite3_db_filen
1b610 61 6d 65 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  ame(sqlite3 *db,
1b620 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
1b630 4e 61 6d 65 29 7b 0a 20 20 42 74 72 65 65 20 2a  Name){.  Btree *
1b640 70 42 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4e  pBt = sqlite3DbN
1b650 61 6d 65 54 6f 42 74 72 65 65 28 64 62 2c 20 7a  ameToBtree(db, z
1b660 44 62 4e 61 6d 65 29 3b 0a 20 20 72 65 74 75 72  DbName);.  retur
1b670 6e 20 70 42 74 20 3f 20 73 71 6c 69 74 65 33 42  n pBt ? sqlite3B
1b680 74 72 65 65 47 65 74 46 69 6c 65 6e 61 6d 65 28  treeGetFilename(
1b690 70 42 74 29 20 3a 20 30 3b 0a 7d 0a 0a 2f 2a 0a  pBt) : 0;.}../*.
1b6a0 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66 20 64  ** Return 1 if d
1b6b0 61 74 61 62 61 73 65 20 69 73 20 72 65 61 64 2d  atabase is read-
1b6c0 6f 6e 6c 79 20 6f 72 20 30 20 69 66 20 72 65 61  only or 0 if rea
1b6d0 64 2f 77 72 69 74 65 2e 20 20 52 65 74 75 72 6e  d/write.  Return
1b6e0 20 2d 31 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63   -1 if.** no suc
1b6f0 68 20 64 61 74 61 62 61 73 65 20 65 78 69 73 74  h database exist
1b700 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
1b710 33 5f 64 62 5f 72 65 61 64 6f 6e 6c 79 28 73 71  3_db_readonly(sq
1b720 6c 69 74 65 33 20 2a 64 62 2c 20 63 6f 6e 73 74  lite3 *db, const
1b730 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 29 7b   char *zDbName){
1b740 0a 20 20 42 74 72 65 65 20 2a 70 42 74 20 3d 20  .  Btree *pBt = 
1b750 73 71 6c 69 74 65 33 44 62 4e 61 6d 65 54 6f 42  sqlite3DbNameToB
1b760 74 72 65 65 28 64 62 2c 20 7a 44 62 4e 61 6d 65  tree(db, zDbName
1b770 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 42 74 20  );.  return pBt 
1b780 3f 20 73 71 6c 69 74 65 33 42 74 72 65 65 49 73  ? sqlite3BtreeIs
1b790 52 65 61 64 6f 6e 6c 79 28 70 42 74 29 20 3a 20  Readonly(pBt) : 
1b7a0 2d 31 3b 0a 7d 0a                                -1;.}.